WebAssemblyTargetStreamer.h revision 360784
11834Swollman//==-- WebAssemblyTargetStreamer.h - WebAssembly Target Streamer -*- C++ -*-==//
2175232Sbde//
31834Swollman// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41834Swollman// See https://llvm.org/LICENSE.txt for license information.
51834Swollman// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61834Swollman//
71834Swollman//===----------------------------------------------------------------------===//
81834Swollman///
91834Swollman/// \file
101834Swollman/// This file declares WebAssembly-specific target streamer classes.
111834Swollman/// These are for implementing support for target-specific assembly directives.
121834Swollman///
131834Swollman//===----------------------------------------------------------------------===//
141834Swollman
151834Swollman#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
161834Swollman#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYTARGETSTREAMER_H
171834Swollman
181834Swollman#include "llvm/BinaryFormat/Wasm.h"
191834Swollman#include "llvm/MC/MCStreamer.h"
201834Swollman#include "llvm/Support/MachineValueType.h"
211834Swollman
221834Swollmannamespace llvm {
231834Swollman
241834Swollmanclass MCWasmStreamer;
251834Swollmanclass MCSymbolWasm;
261834Swollman
271834Swollman/// WebAssembly-specific streamer interface, to implement support
281834Swollman/// WebAssembly-specific assembly directives.
291834Swollmanclass WebAssemblyTargetStreamer : public MCTargetStreamer {
301834Swollmanpublic:
311834Swollman  explicit WebAssemblyTargetStreamer(MCStreamer &S);
321834Swollman
331834Swollman  /// .local
341834Swollman  virtual void emitLocal(ArrayRef<wasm::ValType> Types) = 0;
3550477Speter  /// .endfunc
361834Swollman  virtual void emitEndFunc() = 0;
371834Swollman  /// .functype
38175232Sbde  virtual void emitFunctionType(const MCSymbolWasm *Sym) = 0;
39175232Sbde  /// .indidx
40175232Sbde  virtual void emitIndIdx(const MCExpr *Value) = 0;
411834Swollman  /// .globaltype
42226607Sdas  virtual void emitGlobalType(const MCSymbolWasm *Sym) = 0;
43226607Sdas  /// .eventtype
44175232Sbde  virtual void emitEventType(const MCSymbolWasm *Sym) = 0;
45175234Sbde  /// .import_module
461834Swollman  virtual void emitImportModule(const MCSymbolWasm *Sym,
471834Swollman                                StringRef ImportModule) = 0;
48143063Sjoerg  /// .import_name
49143063Sjoerg  virtual void emitImportName(const MCSymbolWasm *Sym,
50143063Sjoerg                              StringRef ImportName) = 0;
51143063Sjoerg  /// .export_name
521834Swollman  virtual void emitExportName(const MCSymbolWasm *Sym,
53175232Sbde                              StringRef ExportName) = 0;
541834Swollman
551834Swollmanprotected:
561834Swollman  void emitValueType(wasm::ValType Type);
57175232Sbde};
58175232Sbde
591834Swollman/// This part is for ascii assembly output
601834Swollmanclass WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
611834Swollman  formatted_raw_ostream &OS;
621834Swollman
63175232Sbdepublic:
641834Swollman  WebAssemblyTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
651834Swollman
6613765Smpp  void emitLocal(ArrayRef<wasm::ValType> Types) override;
671834Swollman  void emitEndFunc() override;
681834Swollman  void emitFunctionType(const MCSymbolWasm *Sym) override;
6913765Smpp  void emitIndIdx(const MCExpr *Value) override;
701834Swollman  void emitGlobalType(const MCSymbolWasm *Sym) override;
711834Swollman  void emitEventType(const MCSymbolWasm *Sym) override;
721834Swollman  void emitImportModule(const MCSymbolWasm *Sym, StringRef ImportModule) override;
731834Swollman  void emitImportName(const MCSymbolWasm *Sym, StringRef ImportName) override;
741834Swollman  void emitExportName(const MCSymbolWasm *Sym, StringRef ExportName) override;
75175232Sbde};
761834Swollman
771834Swollman/// This part is for Wasm object output
781834Swollmanclass WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
791834Swollmanpublic:
801834Swollman  explicit WebAssemblyTargetWasmStreamer(MCStreamer &S);
811834Swollman
821834Swollman  void emitLocal(ArrayRef<wasm::ValType> Types) override;
8349081Scracauer  void emitEndFunc() override;
841834Swollman  void emitFunctionType(const MCSymbolWasm *Sym) override {}
851834Swollman  void emitIndIdx(const MCExpr *Value) override;
86175232Sbde  void emitGlobalType(const MCSymbolWasm *Sym) override {}
871834Swollman  void emitEventType(const MCSymbolWasm *Sym) override {}
881834Swollman  void emitImportModule(const MCSymbolWasm *Sym,
891834Swollman                        StringRef ImportModule) override {}
90175232Sbde  void emitImportName(const MCSymbolWasm *Sym,
91175232Sbde                      StringRef ImportName) override {}
92175232Sbde  void emitExportName(const MCSymbolWasm *Sym,
93175232Sbde                      StringRef ExportName) override {}
94175232Sbde};
951834Swollman
961834Swollman/// This part is for null output
971834Swollmanclass WebAssemblyTargetNullStreamer final : public WebAssemblyTargetStreamer {
98175232Sbdepublic:
991834Swollman  explicit WebAssemblyTargetNullStreamer(MCStreamer &S)
1001834Swollman      : WebAssemblyTargetStreamer(S) {}
1011834Swollman
102175232Sbde  void emitLocal(ArrayRef<wasm::ValType>) override {}
103175232Sbde  void emitEndFunc() override {}
104175232Sbde  void emitFunctionType(const MCSymbolWasm *) override {}
105175232Sbde  void emitIndIdx(const MCExpr *) override {}
106175232Sbde  void emitGlobalType(const MCSymbolWasm *) override {}
1071834Swollman  void emitEventType(const MCSymbolWasm *) override {}
1081834Swollman  void emitImportModule(const MCSymbolWasm *, StringRef) override {}
109143063Sjoerg  void emitImportName(const MCSymbolWasm *, StringRef) override {}
110109520Smarcel  void emitExportName(const MCSymbolWasm *, StringRef) override {}
111175234Sbde};
112109520Smarcel
113175233Sbde} // end namespace llvm
114175232Sbde
115109520Smarcel#endif
116109520Smarcel