1 //==-- WebAssemblyTargetStreamer.h - WebAssembly Target Streamer -*- 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 /// \file
11 /// \brief This file declares WebAssembly-specific target streamer classes.
12 /// These are for implementing support for target-specific assembly directives.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
17 #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
18 
19 #include "llvm/CodeGen/MachineValueType.h"
20 #include "llvm/MC/MCStreamer.h"
21 
22 namespace llvm {
23 
24 class MCELFStreamer;
25 class MCWasmStreamer;
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   /// .param
34   virtual void emitParam(ArrayRef<MVT> Types) = 0;
35   /// .result
36   virtual void emitResult(ArrayRef<MVT> Types) = 0;
37   /// .local
38   virtual void emitLocal(ArrayRef<MVT> Types) = 0;
39   /// .endfunc
40   virtual void emitEndFunc() = 0;
41   /// .functype
42   virtual void emitIndirectFunctionType(StringRef name,
43                                         SmallVectorImpl<MVT> &Params,
44                                         SmallVectorImpl<MVT> &Results) {
45     llvm_unreachable("emitIndirectFunctionType not implemented");
46   }
47   /// .indidx
48   virtual void emitIndIdx(const MCExpr *Value) = 0;
49   /// .import_global
50   virtual void emitGlobalImport(StringRef name) = 0;
51 };
52 
53 /// This part is for ascii assembly output
54 class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
55   formatted_raw_ostream &OS;
56 
57 public:
58   WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
59 
60   void emitParam(ArrayRef<MVT> Types) override;
61   void emitResult(ArrayRef<MVT> Types) override;
62   void emitLocal(ArrayRef<MVT> Types) override;
63   void emitEndFunc() override;
64   void emitIndirectFunctionType(StringRef name,
65                                 SmallVectorImpl<MVT> &Params,
66                                 SmallVectorImpl<MVT> &Results) override;
67   void emitIndIdx(const MCExpr *Value) override;
68   void emitGlobalImport(StringRef name) override;
69 };
70 
71 /// This part is for ELF object output
72 class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer {
73 public:
74   explicit WebAssemblyTargetELFStreamer(MCStreamer &S);
75 
76   void emitParam(ArrayRef<MVT> Types) override;
77   void emitResult(ArrayRef<MVT> Types) override;
78   void emitLocal(ArrayRef<MVT> Types) override;
79   void emitEndFunc() override;
80   void emitIndirectFunctionType(StringRef name,
81                                 SmallVectorImpl<MVT> &Params,
82                                 SmallVectorImpl<MVT> &Results) override;
83   void emitIndIdx(const MCExpr *Value) override;
84   void emitGlobalImport(StringRef name) override;
85 };
86 
87 /// This part is for Wasm object output
88 class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
89 public:
90   explicit WebAssemblyTargetWasmStreamer(MCStreamer &S);
91 
92   void emitParam(ArrayRef<MVT> Types) override;
93   void emitResult(ArrayRef<MVT> Types) override;
94   void emitLocal(ArrayRef<MVT> Types) override;
95   void emitEndFunc() override;
96   void emitIndirectFunctionType(StringRef name,
97                                 SmallVectorImpl<MVT> &Params,
98                                 SmallVectorImpl<MVT> &Results) override;
99   void emitIndIdx(const MCExpr *Value) override;
100   void emitGlobalImport(StringRef name) override;
101 };
102 
103 } // end namespace llvm
104 
105 #endif
106