xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 //==-- WebAssemblyTargetStreamer.h - WebAssembly Target Streamer -*- 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 /// \file
10 /// This file declares WebAssembly-specific target streamer classes.
11 /// These are for implementing support for target-specific assembly directives.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
16 #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
17 
18 #include "llvm/BinaryFormat/Wasm.h"
19 #include "llvm/MC/MCStreamer.h"
20 #include "llvm/Support/MachineValueType.h"
21 
22 namespace llvm {
23 
24 class MCSymbolWasm;
25 class formatted_raw_ostream;
26 
27 /// WebAssembly-specific streamer interface, to implement support
28 /// WebAssembly-specific assembly directives.
29 class WebAssemblyTargetStreamer : public MCTargetStreamer {
30 public:
31   explicit WebAssemblyTargetStreamer(MCStreamer &S);
32 
33   /// .local
34   virtual void emitLocal(ArrayRef<wasm::ValType> Types) = 0;
35   /// .endfunc
36   virtual void emitEndFunc() = 0;
37   /// .functype
38   virtual void emitFunctionType(const MCSymbolWasm *Sym) = 0;
39   /// .indidx
40   virtual void emitIndIdx(const MCExpr *Value) = 0;
41   /// .globaltype
42   virtual void emitGlobalType(const MCSymbolWasm *Sym) = 0;
43   /// .tabletype
44   virtual void emitTableType(const MCSymbolWasm *Sym) = 0;
45   /// .eventtype
46   virtual void emitEventType(const MCSymbolWasm *Sym) = 0;
47   /// .import_module
48   virtual void emitImportModule(const MCSymbolWasm *Sym,
49                                 StringRef ImportModule) = 0;
50   /// .import_name
51   virtual void emitImportName(const MCSymbolWasm *Sym,
52                               StringRef ImportName) = 0;
53   /// .export_name
54   virtual void emitExportName(const MCSymbolWasm *Sym,
55                               StringRef ExportName) = 0;
56 
57 protected:
58   void emitValueType(wasm::ValType Type);
59 };
60 
61 /// This part is for ascii assembly output
62 class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
63   formatted_raw_ostream &OS;
64 
65 public:
66   WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
67 
68   void emitLocal(ArrayRef<wasm::ValType> Types) override;
69   void emitEndFunc() override;
70   void emitFunctionType(const MCSymbolWasm *Sym) override;
71   void emitIndIdx(const MCExpr *Value) override;
72   void emitGlobalType(const MCSymbolWasm *Sym) override;
73   void emitTableType(const MCSymbolWasm *Sym) override;
74   void emitEventType(const MCSymbolWasm *Sym) override;
75   void emitImportModule(const MCSymbolWasm *Sym, StringRef ImportModule) override;
76   void emitImportName(const MCSymbolWasm *Sym, StringRef ImportName) override;
77   void emitExportName(const MCSymbolWasm *Sym, StringRef ExportName) override;
78 };
79 
80 /// This part is for Wasm object output
81 class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
82 public:
83   explicit WebAssemblyTargetWasmStreamer(MCStreamer &S);
84 
85   void emitLocal(ArrayRef<wasm::ValType> Types) override;
86   void emitEndFunc() override;
emitFunctionType(const MCSymbolWasm * Sym)87   void emitFunctionType(const MCSymbolWasm *Sym) override {}
88   void emitIndIdx(const MCExpr *Value) override;
emitGlobalType(const MCSymbolWasm * Sym)89   void emitGlobalType(const MCSymbolWasm *Sym) override {}
emitTableType(const MCSymbolWasm * Sym)90   void emitTableType(const MCSymbolWasm *Sym) override {}
emitEventType(const MCSymbolWasm * Sym)91   void emitEventType(const MCSymbolWasm *Sym) override {}
emitImportModule(const MCSymbolWasm * Sym,StringRef ImportModule)92   void emitImportModule(const MCSymbolWasm *Sym,
93                         StringRef ImportModule) override {}
emitImportName(const MCSymbolWasm * Sym,StringRef ImportName)94   void emitImportName(const MCSymbolWasm *Sym,
95                       StringRef ImportName) override {}
emitExportName(const MCSymbolWasm * Sym,StringRef ExportName)96   void emitExportName(const MCSymbolWasm *Sym,
97                       StringRef ExportName) override {}
98 };
99 
100 /// This part is for null output
101 class WebAssemblyTargetNullStreamer final : public WebAssemblyTargetStreamer {
102 public:
WebAssemblyTargetNullStreamer(MCStreamer & S)103   explicit WebAssemblyTargetNullStreamer(MCStreamer &S)
104       : WebAssemblyTargetStreamer(S) {}
105 
emitLocal(ArrayRef<wasm::ValType>)106   void emitLocal(ArrayRef<wasm::ValType>) override {}
emitEndFunc()107   void emitEndFunc() override {}
emitFunctionType(const MCSymbolWasm *)108   void emitFunctionType(const MCSymbolWasm *) override {}
emitIndIdx(const MCExpr *)109   void emitIndIdx(const MCExpr *) override {}
emitGlobalType(const MCSymbolWasm *)110   void emitGlobalType(const MCSymbolWasm *) override {}
emitTableType(const MCSymbolWasm *)111   void emitTableType(const MCSymbolWasm *) override {}
emitEventType(const MCSymbolWasm *)112   void emitEventType(const MCSymbolWasm *) override {}
emitImportModule(const MCSymbolWasm *,StringRef)113   void emitImportModule(const MCSymbolWasm *, StringRef) override {}
emitImportName(const MCSymbolWasm *,StringRef)114   void emitImportName(const MCSymbolWasm *, StringRef) override {}
emitExportName(const MCSymbolWasm *,StringRef)115   void emitExportName(const MCSymbolWasm *, StringRef) override {}
116 };
117 
118 } // end namespace llvm
119 
120 #endif
121