109467b48Spatrick // WebAssemblyAsmPrinter.h - WebAssembly implementation of AsmPrinter-*- C++ -*- 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick 909467b48Spatrick #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 1009467b48Spatrick #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 1109467b48Spatrick 1209467b48Spatrick #include "WebAssemblyMachineFunctionInfo.h" 1309467b48Spatrick #include "WebAssemblySubtarget.h" 1409467b48Spatrick #include "llvm/CodeGen/AsmPrinter.h" 1509467b48Spatrick #include "llvm/MC/MCStreamer.h" 1609467b48Spatrick #include "llvm/Target/TargetMachine.h" 1709467b48Spatrick 1809467b48Spatrick namespace llvm { 1909467b48Spatrick class WebAssemblyTargetStreamer; 2009467b48Spatrick 2109467b48Spatrick class LLVM_LIBRARY_VISIBILITY WebAssemblyAsmPrinter final : public AsmPrinter { 2209467b48Spatrick const WebAssemblySubtarget *Subtarget; 2309467b48Spatrick const MachineRegisterInfo *MRI; 2409467b48Spatrick WebAssemblyFunctionInfo *MFI; 2509467b48Spatrick // TODO: Do the uniquing of Signatures here instead of ObjectFileWriter? 2609467b48Spatrick std::vector<std::unique_ptr<wasm::WasmSignature>> Signatures; 27097a140dSpatrick std::vector<std::unique_ptr<std::string>> Names; 2873471bf0Spatrick bool signaturesEmitted = false; 29097a140dSpatrick storeName(StringRef Name)30097a140dSpatrick StringRef storeName(StringRef Name) { 31097a140dSpatrick std::unique_ptr<std::string> N = std::make_unique<std::string>(Name); 32097a140dSpatrick Names.push_back(std::move(N)); 33097a140dSpatrick return *Names.back(); 34097a140dSpatrick } 3509467b48Spatrick 3609467b48Spatrick public: WebAssemblyAsmPrinter(TargetMachine & TM,std::unique_ptr<MCStreamer> Streamer)3709467b48Spatrick explicit WebAssemblyAsmPrinter(TargetMachine &TM, 3809467b48Spatrick std::unique_ptr<MCStreamer> Streamer) 3909467b48Spatrick : AsmPrinter(TM, std::move(Streamer)), Subtarget(nullptr), MRI(nullptr), 4009467b48Spatrick MFI(nullptr) {} 4109467b48Spatrick getPassName()4209467b48Spatrick StringRef getPassName() const override { 4309467b48Spatrick return "WebAssembly Assembly Printer"; 4409467b48Spatrick } 4509467b48Spatrick getSubtarget()4609467b48Spatrick const WebAssemblySubtarget &getSubtarget() const { return *Subtarget; } addSignature(std::unique_ptr<wasm::WasmSignature> && Sig)4709467b48Spatrick void addSignature(std::unique_ptr<wasm::WasmSignature> &&Sig) { 4809467b48Spatrick Signatures.push_back(std::move(Sig)); 4909467b48Spatrick } 5009467b48Spatrick 5109467b48Spatrick //===------------------------------------------------------------------===// 5209467b48Spatrick // MachineFunctionPass Implementation. 5309467b48Spatrick //===------------------------------------------------------------------===// 5409467b48Spatrick runOnMachineFunction(MachineFunction & MF)5509467b48Spatrick bool runOnMachineFunction(MachineFunction &MF) override { 5609467b48Spatrick Subtarget = &MF.getSubtarget<WebAssemblySubtarget>(); 5709467b48Spatrick MRI = &MF.getRegInfo(); 5809467b48Spatrick MFI = MF.getInfo<WebAssemblyFunctionInfo>(); 5909467b48Spatrick return AsmPrinter::runOnMachineFunction(MF); 6009467b48Spatrick } 6109467b48Spatrick 6209467b48Spatrick //===------------------------------------------------------------------===// 6309467b48Spatrick // AsmPrinter Implementation. 6409467b48Spatrick //===------------------------------------------------------------------===// 6509467b48Spatrick 66097a140dSpatrick void emitEndOfAsmFile(Module &M) override; 6709467b48Spatrick void EmitProducerInfo(Module &M); 6809467b48Spatrick void EmitTargetFeatures(Module &M); 69*d415bd75Srobert void emitSymbolType(const MCSymbolWasm *Sym); 7073471bf0Spatrick void emitGlobalVariable(const GlobalVariable *GV) override; 71097a140dSpatrick void emitJumpTableInfo() override; 72097a140dSpatrick void emitConstantPool() override; 73097a140dSpatrick void emitFunctionBodyStart() override; 74097a140dSpatrick void emitInstruction(const MachineInstr *MI) override; 7509467b48Spatrick bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 7609467b48Spatrick const char *ExtraCode, raw_ostream &OS) override; 7709467b48Spatrick bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 7809467b48Spatrick const char *ExtraCode, raw_ostream &OS) override; 7909467b48Spatrick 8009467b48Spatrick MVT getRegType(unsigned RegNo) const; 8109467b48Spatrick std::string regToString(const MachineOperand &MO); 8209467b48Spatrick WebAssemblyTargetStreamer *getTargetStreamer(); 8373471bf0Spatrick MCSymbolWasm *getMCSymbolForFunction(const Function *F, bool EnableEmEH, 8473471bf0Spatrick wasm::WasmSignature *Sig, 8573471bf0Spatrick bool &InvokeDetected); 8673471bf0Spatrick MCSymbol *getOrCreateWasmSymbol(StringRef Name); 87*d415bd75Srobert void emitDecls(const Module &M); 8809467b48Spatrick }; 8909467b48Spatrick 9009467b48Spatrick } // end namespace llvm 9109467b48Spatrick 9209467b48Spatrick #endif 93