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