1//==-- WebAssemblyTargetStreamer.h - WebAssembly Target Streamer -*- C++ -*-==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file declares WebAssembly-specific target streamer classes.
11/// These are for implementing support for target-specific assembly directives.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
16#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
17
18#include "llvm/BinaryFormat/Wasm.h"
19#include "llvm/MC/MCStreamer.h"
20#include "llvm/Support/MachineValueType.h"
21
22namespace llvm {
23
24class MCSymbolWasm;
25
26/// WebAssembly-specific streamer interface, to implement support
27/// WebAssembly-specific assembly directives.
28class WebAssemblyTargetStreamer : public MCTargetStreamer {
29public:
30  explicit WebAssemblyTargetStreamer(MCStreamer &S);
31
32  /// .local
33  virtual void emitLocal(ArrayRef<wasm::ValType> Types) = 0;
34  /// .endfunc
35  virtual void emitEndFunc() = 0;
36  /// .functype
37  virtual void emitFunctionType(const MCSymbolWasm *Sym) = 0;
38  /// .indidx
39  virtual void emitIndIdx(const MCExpr *Value) = 0;
40  /// .globaltype
41  virtual void emitGlobalType(const MCSymbolWasm *Sym) = 0;
42  /// .eventtype
43  virtual void emitEventType(const MCSymbolWasm *Sym) = 0;
44  /// .import_module
45  virtual void emitImportModule(const MCSymbolWasm *Sym,
46                                StringRef ImportModule) = 0;
47  /// .import_name
48  virtual void emitImportName(const MCSymbolWasm *Sym,
49                              StringRef ImportName) = 0;
50  /// .export_name
51  virtual void emitExportName(const MCSymbolWasm *Sym,
52                              StringRef ExportName) = 0;
53
54protected:
55  void emitValueType(wasm::ValType Type);
56};
57
58/// This part is for ascii assembly output
59class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
60  formatted_raw_ostream &OS;
61
62public:
63  WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
64
65  void emitLocal(ArrayRef<wasm::ValType> Types) override;
66  void emitEndFunc() override;
67  void emitFunctionType(const MCSymbolWasm *Sym) override;
68  void emitIndIdx(const MCExpr *Value) override;
69  void emitGlobalType(const MCSymbolWasm *Sym) override;
70  void emitEventType(const MCSymbolWasm *Sym) override;
71  void emitImportModule(const MCSymbolWasm *Sym, StringRef ImportModule) override;
72  void emitImportName(const MCSymbolWasm *Sym, StringRef ImportName) override;
73  void emitExportName(const MCSymbolWasm *Sym, StringRef ExportName) override;
74};
75
76/// This part is for Wasm object output
77class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
78public:
79  explicit WebAssemblyTargetWasmStreamer(MCStreamer &S);
80
81  void emitLocal(ArrayRef<wasm::ValType> Types) override;
82  void emitEndFunc() override;
83  void emitFunctionType(const MCSymbolWasm *Sym) override {}
84  void emitIndIdx(const MCExpr *Value) override;
85  void emitGlobalType(const MCSymbolWasm *Sym) override {}
86  void emitEventType(const MCSymbolWasm *Sym) override {}
87  void emitImportModule(const MCSymbolWasm *Sym,
88                        StringRef ImportModule) override {}
89  void emitImportName(const MCSymbolWasm *Sym,
90                      StringRef ImportName) override {}
91  void emitExportName(const MCSymbolWasm *Sym,
92                      StringRef ExportName) override {}
93};
94
95/// This part is for null output
96class WebAssemblyTargetNullStreamer final : public WebAssemblyTargetStreamer {
97public:
98  explicit WebAssemblyTargetNullStreamer(MCStreamer &S)
99      : WebAssemblyTargetStreamer(S) {}
100
101  void emitLocal(ArrayRef<wasm::ValType>) override {}
102  void emitEndFunc() override {}
103  void emitFunctionType(const MCSymbolWasm *) override {}
104  void emitIndIdx(const MCExpr *) override {}
105  void emitGlobalType(const MCSymbolWasm *) override {}
106  void emitEventType(const MCSymbolWasm *) override {}
107  void emitImportModule(const MCSymbolWasm *, StringRef) override {}
108  void emitImportName(const MCSymbolWasm *, StringRef) override {}
109  void emitExportName(const MCSymbolWasm *, StringRef) override {}
110};
111
112} // end namespace llvm
113
114#endif
115