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 26 /// WebAssembly-specific streamer interface, to implement support 27 /// WebAssembly-specific assembly directives. 28 class WebAssemblyTargetStreamer : public MCTargetStreamer { 29 public: 30 explicit WebAssemblyTargetStreamer(MCStreamer &S); 31 32 /// .param 33 virtual void emitParam(ArrayRef<MVT> Types) = 0; 34 /// .result 35 virtual void emitResult(ArrayRef<MVT> Types) = 0; 36 /// .local 37 virtual void emitLocal(ArrayRef<MVT> Types) = 0; 38 /// .endfunc 39 virtual void emitEndFunc() = 0; 40 /// .functype 41 virtual void emitIndirectFunctionType(StringRef name, 42 SmallVectorImpl<MVT> &Params, 43 SmallVectorImpl<MVT> &Results) { 44 llvm_unreachable("emitIndirectFunctionType not implemented"); 45 } 46 /// .indidx 47 virtual void emitIndIdx(const MCExpr *Value) = 0; 48 /// .import_global 49 virtual void emitGlobalImport(StringRef name) = 0; 50 }; 51 52 /// This part is for ascii assembly output 53 class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer { 54 formatted_raw_ostream &OS; 55 56 public: 57 WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 58 59 void emitParam(ArrayRef<MVT> Types) override; 60 void emitResult(ArrayRef<MVT> Types) override; 61 void emitLocal(ArrayRef<MVT> Types) override; 62 void emitEndFunc() override; 63 void emitIndirectFunctionType(StringRef name, 64 SmallVectorImpl<MVT> &Params, 65 SmallVectorImpl<MVT> &Results) override; 66 void emitIndIdx(const MCExpr *Value) override; 67 void emitGlobalImport(StringRef name) override; 68 }; 69 70 /// This part is for ELF object output 71 class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer { 72 public: 73 explicit WebAssemblyTargetELFStreamer(MCStreamer &S); 74 75 void emitParam(ArrayRef<MVT> Types) override; 76 void emitResult(ArrayRef<MVT> Types) override; 77 void emitLocal(ArrayRef<MVT> Types) override; 78 void emitEndFunc() override; 79 void emitIndirectFunctionType(StringRef name, 80 SmallVectorImpl<MVT> &Params, 81 SmallVectorImpl<MVT> &Results) override; 82 void emitIndIdx(const MCExpr *Value) override; 83 void emitGlobalImport(StringRef name) override; 84 }; 85 86 } // end namespace llvm 87 88 #endif 89