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 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) = 0; 50 /// .indidx 51 virtual void emitIndIdx(const MCExpr *Value) = 0; 52 /// .import_global 53 virtual void emitGlobalImport(StringRef name) = 0; 54 55 protected: 56 void emitValueType(wasm::ValType Type); 57 }; 58 59 /// This part is for ascii assembly output 60 class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer { 61 formatted_raw_ostream &OS; 62 63 public: 64 WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 65 66 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 67 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 68 void emitLocal(ArrayRef<MVT> Types) override; 69 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 70 void emitStackPointer(uint32_t Index) override; 71 void emitEndFunc() override; 72 void emitIndirectFunctionType(StringRef name, 73 SmallVectorImpl<MVT> &Params, 74 SmallVectorImpl<MVT> &Results) override; 75 void emitIndIdx(const MCExpr *Value) override; 76 void emitGlobalImport(StringRef name) override; 77 }; 78 79 /// This part is for ELF object output 80 class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer { 81 public: 82 explicit WebAssemblyTargetELFStreamer(MCStreamer &S); 83 84 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 85 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 86 void emitLocal(ArrayRef<MVT> Types) override; 87 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 88 void emitStackPointer(uint32_t Index) override; 89 void emitEndFunc() override; 90 void emitIndirectFunctionType(StringRef name, 91 SmallVectorImpl<MVT> &Params, 92 SmallVectorImpl<MVT> &Results) override; 93 void emitIndIdx(const MCExpr *Value) override; 94 void emitGlobalImport(StringRef name) override; 95 }; 96 97 /// This part is for Wasm object output 98 class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer { 99 public: 100 explicit WebAssemblyTargetWasmStreamer(MCStreamer &S); 101 102 void emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 103 void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override; 104 void emitLocal(ArrayRef<MVT> Types) override; 105 void emitGlobal(ArrayRef<wasm::Global> Globals) override; 106 void emitStackPointer(uint32_t Index) override; 107 void emitEndFunc() override; 108 void emitIndirectFunctionType(StringRef name, 109 SmallVectorImpl<MVT> &Params, 110 SmallVectorImpl<MVT> &Results) override; 111 void emitIndIdx(const MCExpr *Value) override; 112 void emitGlobalImport(StringRef name) override; 113 }; 114 115 } // end namespace llvm 116 117 #endif 118