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/BinaryFormat/Wasm.h" 20 #include "llvm/CodeGen/MachineValueType.h" 21 #include "llvm/MC/MCStreamer.h" 22 23 namespace llvm { 24 25 class MCELFStreamer; 26 class MCWasmStreamer; 27 class MCSymbolWasm; 28 29 /// WebAssembly-specific streamer interface, to implement support 30 /// WebAssembly-specific assembly directives. 31 class WebAssemblyTargetStreamer : public MCTargetStreamer { 32 public: 33 explicit WebAssemblyTargetStreamer(MCStreamer &S); 34 35 /// .param 36 virtual void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) = 0; 37 /// .result 38 virtual void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) = 0; 39 /// .local 40 virtual void emitLocal(ArrayRef<MVT> Types) = 0; 41 /// .endfunc 42 virtual void emitEndFunc() = 0; 43 /// .functype 44 virtual void emitIndirectFunctionType(MCSymbol *Symbol, 45 SmallVectorImpl<MVT> &Params, 46 SmallVectorImpl<MVT> &Results) = 0; 47 /// .indidx 48 virtual void emitIndIdx(const MCExpr *Value) = 0; 49 /// .import_global 50 virtual void emitGlobalImport(StringRef name) = 0; 51 /// .import_module 52 virtual void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) = 0; 53 54 protected: 55 void emitValueType(wasm::ValType Type); 56 }; 57 58 /// This part is for ascii assembly output 59 class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer { 60 formatted_raw_ostream &OS; 61 62 public: 63 WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 64 65 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 66 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 67 void emitLocal(ArrayRef<MVT> Types) override; 68 void emitEndFunc() override; 69 void emitIndirectFunctionType(MCSymbol *Symbol, 70 SmallVectorImpl<MVT> &Params, 71 SmallVectorImpl<MVT> &Results) override; 72 void emitIndIdx(const MCExpr *Value) override; 73 void emitGlobalImport(StringRef name) override; 74 void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; 75 }; 76 77 /// This part is for ELF object output 78 class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer { 79 public: 80 explicit WebAssemblyTargetELFStreamer(MCStreamer &S); 81 82 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 83 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 84 void emitLocal(ArrayRef<MVT> Types) override; 85 void emitEndFunc() override; 86 void emitIndirectFunctionType(MCSymbol *Symbol, 87 SmallVectorImpl<MVT> &Params, 88 SmallVectorImpl<MVT> &Results) override; 89 void emitIndIdx(const MCExpr *Value) override; 90 void emitGlobalImport(StringRef name) override; 91 void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; 92 }; 93 94 /// This part is for Wasm object output 95 class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer { 96 public: 97 explicit WebAssemblyTargetWasmStreamer(MCStreamer &S); 98 99 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 100 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 101 void emitLocal(ArrayRef<MVT> Types) override; 102 void emitEndFunc() override; 103 void emitIndirectFunctionType(MCSymbol *Symbol, 104 SmallVectorImpl<MVT> &Params, 105 SmallVectorImpl<MVT> &Results) override; 106 void emitIndIdx(const MCExpr *Value) override; 107 void emitGlobalImport(StringRef name) override; 108 void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; 109 }; 110 111 } // end namespace llvm 112 113 #endif 114