1 // WebAssemblyAsmPrinter.h - WebAssembly implementation of AsmPrinter-*- C++ -*- 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 11 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 12 13 #include "WebAssemblyMachineFunctionInfo.h" 14 #include "WebAssemblySubtarget.h" 15 #include "llvm/CodeGen/AsmPrinter.h" 16 #include "llvm/MC/MCStreamer.h" 17 #include "llvm/Target/TargetMachine.h" 18 19 namespace llvm { 20 class MCSymbol; 21 class WebAssemblyTargetStreamer; 22 class WebAssemblyMCInstLower; 23 24 class LLVM_LIBRARY_VISIBILITY WebAssemblyAsmPrinter final : public AsmPrinter { 25 const WebAssemblySubtarget *Subtarget; 26 const MachineRegisterInfo *MRI; 27 WebAssemblyFunctionInfo *MFI; 28 // TODO: Do the uniquing of Signatures here instead of ObjectFileWriter? 29 std::vector<std::unique_ptr<wasm::WasmSignature>> Signatures; 30 31 public: WebAssemblyAsmPrinter(TargetMachine & TM,std::unique_ptr<MCStreamer> Streamer)32 explicit WebAssemblyAsmPrinter(TargetMachine &TM, 33 std::unique_ptr<MCStreamer> Streamer) 34 : AsmPrinter(TM, std::move(Streamer)), Subtarget(nullptr), MRI(nullptr), 35 MFI(nullptr) {} 36 getPassName()37 StringRef getPassName() const override { 38 return "WebAssembly Assembly Printer"; 39 } 40 getSubtarget()41 const WebAssemblySubtarget &getSubtarget() const { return *Subtarget; } addSignature(std::unique_ptr<wasm::WasmSignature> && Sig)42 void addSignature(std::unique_ptr<wasm::WasmSignature> &&Sig) { 43 Signatures.push_back(std::move(Sig)); 44 } 45 46 //===------------------------------------------------------------------===// 47 // MachineFunctionPass Implementation. 48 //===------------------------------------------------------------------===// 49 runOnMachineFunction(MachineFunction & MF)50 bool runOnMachineFunction(MachineFunction &MF) override { 51 Subtarget = &MF.getSubtarget<WebAssemblySubtarget>(); 52 MRI = &MF.getRegInfo(); 53 MFI = MF.getInfo<WebAssemblyFunctionInfo>(); 54 return AsmPrinter::runOnMachineFunction(MF); 55 } 56 57 //===------------------------------------------------------------------===// 58 // AsmPrinter Implementation. 59 //===------------------------------------------------------------------===// 60 61 void EmitEndOfAsmFile(Module &M) override; 62 void EmitJumpTableInfo() override; 63 void EmitConstantPool() override; 64 void EmitFunctionBodyStart() override; 65 void EmitInstruction(const MachineInstr *MI) override; 66 const MCExpr *lowerConstant(const Constant *CV) override; 67 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 68 unsigned AsmVariant, const char *ExtraCode, 69 raw_ostream &OS) override; 70 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 71 unsigned AsmVariant, const char *ExtraCode, 72 raw_ostream &OS) override; 73 74 MVT getRegType(unsigned RegNo) const; 75 std::string regToString(const MachineOperand &MO); 76 WebAssemblyTargetStreamer *getTargetStreamer(); 77 }; 78 79 } // end namespace llvm 80 81 #endif 82