diff options
Diffstat (limited to 'lib/Target/RISCV/RISCVAsmPrinter.cpp')
| -rw-r--r-- | lib/Target/RISCV/RISCVAsmPrinter.cpp | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/Target/RISCV/RISCVAsmPrinter.cpp b/lib/Target/RISCV/RISCVAsmPrinter.cpp new file mode 100644 index 000000000000..4808e6c73c50 --- /dev/null +++ b/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -0,0 +1,72 @@ +//===-- RISCVAsmPrinter.cpp - RISCV LLVM assembly writer ------------------===// +// +//                     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 the RISCV assembly language. +// +//===----------------------------------------------------------------------===// + +#include "RISCV.h" +#include "InstPrinter/RISCVInstPrinter.h" +#include "RISCVTargetMachine.h" +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/raw_ostream.h" +using namespace llvm; + +#define DEBUG_TYPE "asm-printer" + +namespace { +class RISCVAsmPrinter : public AsmPrinter { +public: +  explicit RISCVAsmPrinter(TargetMachine &TM, +                           std::unique_ptr<MCStreamer> Streamer) +      : AsmPrinter(TM, std::move(Streamer)) {} + +  StringRef getPassName() const override { return "RISCV Assembly Printer"; } + +  void EmitInstruction(const MachineInstr *MI) override; + +  bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, +                                   const MachineInstr *MI); + +  // Wrapper needed for tblgenned pseudo lowering. +  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const { +    return LowerRISCVMachineOperandToMCOperand(MO, MCOp, *this); +  } +}; +} + +// Simple pseudo-instructions have their lowering (with expansion to real +// instructions) auto-generated. +#include "RISCVGenMCPseudoLowering.inc" + +void RISCVAsmPrinter::EmitInstruction(const MachineInstr *MI) { +  // Do any auto-generated pseudo lowerings. +  if (emitPseudoExpansionLowering(*OutStreamer, MI)) +    return; + +  MCInst TmpInst; +  LowerRISCVMachineInstrToMCInst(MI, TmpInst, *this); +  EmitToStreamer(*OutStreamer, TmpInst); +} + +// Force static initialization. +extern "C" void LLVMInitializeRISCVAsmPrinter() { +  RegisterAsmPrinter<RISCVAsmPrinter> X(getTheRISCV32Target()); +  RegisterAsmPrinter<RISCVAsmPrinter> Y(getTheRISCV64Target()); +}  | 
