diff options
Diffstat (limited to 'llvm/lib/Target/ARC/ARCAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/ARC/ARCAsmPrinter.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARC/ARCAsmPrinter.cpp b/llvm/lib/Target/ARC/ARCAsmPrinter.cpp new file mode 100644 index 00000000000..8c13da0484f --- /dev/null +++ b/llvm/lib/Target/ARC/ARCAsmPrinter.cpp @@ -0,0 +1,83 @@ +//===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains a printer that converts from our internal representation +// of machine-dependent LLVM code to GNU format ARC assembly language. +// +//===----------------------------------------------------------------------===// + +#include "ARC.h" +#include "ARCInstrInfo.h" +#include "ARCMCInstLower.h" +#include "ARCSubtarget.h" +#include "ARCTargetMachine.h" +#include "ARCTargetStreamer.h" +#include "InstPrinter/ARCInstPrinter.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbolELF.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetLoweringObjectFile.h" +#include <algorithm> + +using namespace llvm; + +#define DEBUG_TYPE "asm-printer" + +namespace { + +class ARCAsmPrinter : public AsmPrinter { + ARCMCInstLower MCInstLowering; + ARCTargetStreamer &getTargetStreamer(); + +public: + explicit ARCAsmPrinter(TargetMachine &TM, + std::unique_ptr<MCStreamer> Streamer) + : AsmPrinter(TM, std::move(Streamer)), + MCInstLowering(&OutContext, *this) {} + + StringRef getPassName() const override { return "ARC Assembly Printer"; } + void EmitInstruction(const MachineInstr *MI) override; +}; + +} // end anonymous namespace + +ARCTargetStreamer &ARCAsmPrinter::getTargetStreamer() { + return static_cast<ARCTargetStreamer &>(*OutStreamer->getTargetStreamer()); +} + +void ARCAsmPrinter::EmitInstruction(const MachineInstr *MI) { + SmallString<128> Str; + raw_svector_ostream O(Str); + + switch (MI->getOpcode()) { + case ARC::DBG_VALUE: + llvm_unreachable("Should be handled target independently"); + break; + } + + MCInst TmpInst; + MCInstLowering.Lower(MI, TmpInst); + EmitToStreamer(*OutStreamer, TmpInst); +} + +// Force static initialization. +extern "C" void LLVMInitializeARCAsmPrinter() { + RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); +} |