]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / WebAssembly / WebAssemblyAsmPrinter.h
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:
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
37   StringRef getPassName() const override {
38     return "WebAssembly Assembly Printer";
39   }
40
41   const WebAssemblySubtarget &getSubtarget() const { return *Subtarget; }
42   void addSignature(std::unique_ptr<wasm::WasmSignature> &&Sig) {
43     Signatures.push_back(std::move(Sig));
44   }
45
46   //===------------------------------------------------------------------===//
47   // MachineFunctionPass Implementation.
48   //===------------------------------------------------------------------===//
49
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