xref: /openbsd-src/gnu/llvm/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
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