1317017Sdim// WebAssemblyAsmPrinter.h - WebAssembly implementation of AsmPrinter-*- C++ -*- 2317017Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317017Sdim// 7317017Sdim//===----------------------------------------------------------------------===// 8317017Sdim 9317017Sdim#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 10317017Sdim#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYASMPRINTER_H 11317017Sdim 12327952Sdim#include "WebAssemblyMachineFunctionInfo.h" 13317017Sdim#include "WebAssemblySubtarget.h" 14317017Sdim#include "llvm/CodeGen/AsmPrinter.h" 15317017Sdim#include "llvm/MC/MCStreamer.h" 16317017Sdim#include "llvm/Target/TargetMachine.h" 17317017Sdim 18317017Sdimnamespace llvm { 19317017Sdimclass MCSymbol; 20317017Sdimclass WebAssemblyTargetStreamer; 21317017Sdimclass WebAssemblyMCInstLower; 22317017Sdim 23317017Sdimclass LLVM_LIBRARY_VISIBILITY WebAssemblyAsmPrinter final : public AsmPrinter { 24317017Sdim const WebAssemblySubtarget *Subtarget; 25317017Sdim const MachineRegisterInfo *MRI; 26317017Sdim WebAssemblyFunctionInfo *MFI; 27344779Sdim // TODO: Do the uniquing of Signatures here instead of ObjectFileWriter? 28344779Sdim std::vector<std::unique_ptr<wasm::WasmSignature>> Signatures; 29317017Sdim 30317017Sdimpublic: 31317017Sdim explicit WebAssemblyAsmPrinter(TargetMachine &TM, 32317017Sdim std::unique_ptr<MCStreamer> Streamer) 33344779Sdim : AsmPrinter(TM, std::move(Streamer)), Subtarget(nullptr), MRI(nullptr), 34344779Sdim MFI(nullptr) {} 35317017Sdim 36317017Sdim StringRef getPassName() const override { 37317017Sdim return "WebAssembly Assembly Printer"; 38317017Sdim } 39317017Sdim 40317017Sdim const WebAssemblySubtarget &getSubtarget() const { return *Subtarget; } 41344779Sdim void addSignature(std::unique_ptr<wasm::WasmSignature> &&Sig) { 42344779Sdim Signatures.push_back(std::move(Sig)); 43344779Sdim } 44317017Sdim 45317017Sdim //===------------------------------------------------------------------===// 46317017Sdim // MachineFunctionPass Implementation. 47317017Sdim //===------------------------------------------------------------------===// 48317017Sdim 49317017Sdim bool runOnMachineFunction(MachineFunction &MF) override { 50317017Sdim Subtarget = &MF.getSubtarget<WebAssemblySubtarget>(); 51317017Sdim MRI = &MF.getRegInfo(); 52317017Sdim MFI = MF.getInfo<WebAssemblyFunctionInfo>(); 53317017Sdim return AsmPrinter::runOnMachineFunction(MF); 54317017Sdim } 55317017Sdim 56317017Sdim //===------------------------------------------------------------------===// 57317017Sdim // AsmPrinter Implementation. 58317017Sdim //===------------------------------------------------------------------===// 59317017Sdim 60317017Sdim void EmitEndOfAsmFile(Module &M) override; 61353358Sdim void EmitProducerInfo(Module &M); 62353358Sdim void EmitTargetFeatures(Module &M); 63317017Sdim void EmitJumpTableInfo() override; 64317017Sdim void EmitConstantPool() override; 65317017Sdim void EmitFunctionBodyStart() override; 66317017Sdim void EmitInstruction(const MachineInstr *MI) override; 67317017Sdim bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 68353358Sdim const char *ExtraCode, raw_ostream &OS) override; 69317017Sdim bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 70353358Sdim const char *ExtraCode, raw_ostream &OS) override; 71317017Sdim 72317017Sdim MVT getRegType(unsigned RegNo) const; 73317017Sdim std::string regToString(const MachineOperand &MO); 74317017Sdim WebAssemblyTargetStreamer *getTargetStreamer(); 75317017Sdim}; 76317017Sdim 77317017Sdim} // end namespace llvm 78317017Sdim 79317017Sdim#endif 80