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 #include "llvm/Support/Wasm.h" 22 23 namespace llvm { 24 25 class MCELFStreamer; 26 class MCWasmStreamer; 27 28 /// WebAssembly-specific streamer interface, to implement support 29 /// WebAssembly-specific assembly directives. 30 class WebAssemblyTargetStreamer : public MCTargetStreamer { 31 public: 32 explicit WebAssemblyTargetStreamer(MCStreamer &S); 33 34 /// .param 35 virtual void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) = 0; 36 /// .result 37 virtual void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) = 0; 38 /// .local 39 virtual void emitLocal(ArrayRef<MVT> Types) = 0; 40 /// .globalvar 41 virtual void emitGlobal(ArrayRef<wasm::Global> Globals) = 0; 42 /// .stack_pointer 43 virtual void emitStackPointer(uint32_t Index) = 0; 44 /// .endfunc 45 virtual void emitEndFunc() = 0; 46 /// .functype 47 virtual void emitIndirectFunctionType(StringRef name, 48 SmallVectorImpl<MVT> &Params, 49 SmallVectorImpl<MVT> &Results) { 50 llvm_unreachable("emitIndirectFunctionType not implemented"); 51 } 52 /// .indidx 53 virtual void emitIndIdx(const MCExpr *Value) = 0; 54 /// .import_global 55 virtual void emitGlobalImport(StringRef name) = 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 emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 69 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 70 void emitLocal(ArrayRef<MVT> Types) override; 71 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 72 void emitStackPointer(uint32_t Index) override; 73 void emitEndFunc() override; 74 void emitIndirectFunctionType(StringRef name, 75 SmallVectorImpl<MVT> &Params, 76 SmallVectorImpl<MVT> &Results) override; 77 void emitIndIdx(const MCExpr *Value) override; 78 void emitGlobalImport(StringRef name) override; 79 }; 80 81 /// This part is for ELF object output 82 class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer { 83 public: 84 explicit WebAssemblyTargetELFStreamer(MCStreamer &S); 85 86 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 87 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 88 void emitLocal(ArrayRef<MVT> Types) override; 89 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 90 void emitStackPointer(uint32_t Index) override; 91 void emitEndFunc() override; 92 void emitIndirectFunctionType(StringRef name, 93 SmallVectorImpl<MVT> &Params, 94 SmallVectorImpl<MVT> &Results) override; 95 void emitIndIdx(const MCExpr *Value) override; 96 void emitGlobalImport(StringRef name) override; 97 }; 98 99 /// This part is for Wasm object output 100 class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer { 101 public: 102 explicit WebAssemblyTargetWasmStreamer(MCStreamer &S); 103 104 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 105 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 106 void emitLocal(ArrayRef<MVT> Types) override; 107 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 108 void emitStackPointer(uint32_t Index) override; 109 void emitEndFunc() override; 110 void emitIndirectFunctionType(StringRef name, 111 SmallVectorImpl<MVT> &Params, 112 SmallVectorImpl<MVT> &Results) override; 113 void emitIndIdx(const MCExpr *Value) override; 114 void emitGlobalImport(StringRef name) override; 115 }; 116 117 } // end namespace llvm 118 119 #endif 120