Line data Source code
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 304 : explicit WebAssemblyAsmPrinter(TargetMachine &TM,
33 : std::unique_ptr<MCStreamer> Streamer)
34 304 : : AsmPrinter(TM, std::move(Streamer)), Subtarget(nullptr), MRI(nullptr),
35 608 : MFI(nullptr) {}
36 :
37 0 : StringRef getPassName() const override {
38 0 : return "WebAssembly Assembly Printer";
39 : }
40 :
41 0 : const WebAssemblySubtarget &getSubtarget() const { return *Subtarget; }
42 : void addSignature(std::unique_ptr<wasm::WasmSignature> &&Sig) {
43 3637 : Signatures.push_back(std::move(Sig));
44 : }
45 :
46 : //===------------------------------------------------------------------===//
47 : // MachineFunctionPass Implementation.
48 : //===------------------------------------------------------------------===//
49 :
50 2982 : bool runOnMachineFunction(MachineFunction &MF) override {
51 2982 : Subtarget = &MF.getSubtarget<WebAssemblySubtarget>();
52 2982 : MRI = &MF.getRegInfo();
53 2982 : MFI = MF.getInfo<WebAssemblyFunctionInfo>();
54 2982 : 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
|