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