blob: 50143fb0ece3626feb3fd32966096b01758d938e [file] [log] [blame]
Dan Gohman3469ee12016-01-12 20:30:51 +00001//==-- WebAssemblyTargetStreamer.cpp - WebAssembly Target Streamer Methods --=//
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
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// This file defines WebAssembly-specific target streamer classes.
Dan Gohman3469ee12016-01-12 20:30:51 +000012/// These are for implementing support for target-specific assembly directives.
13///
14//===----------------------------------------------------------------------===//
15
16#include "WebAssemblyTargetStreamer.h"
17#include "InstPrinter/WebAssemblyInstPrinter.h"
18#include "WebAssemblyMCTargetDesc.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000019#include "llvm/MC/MCContext.h"
Dan Gohman18eafb62017-02-22 01:23:18 +000020#include "llvm/MC/MCSectionWasm.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000021#include "llvm/MC/MCSubtargetInfo.h"
Dan Gohman18eafb62017-02-22 01:23:18 +000022#include "llvm/MC/MCSymbolWasm.h"
Dan Gohmand934cb82017-02-24 23:18:00 +000023#include "llvm/Support/Casting.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000024#include "llvm/Support/ErrorHandling.h"
25#include "llvm/Support/FormattedStream.h"
26using namespace llvm;
27
28WebAssemblyTargetStreamer::WebAssemblyTargetStreamer(MCStreamer &S)
29 : MCTargetStreamer(S) {}
30
Derek Schuffb8795392017-03-16 20:49:48 +000031void WebAssemblyTargetStreamer::emitValueType(wasm::ValType Type) {
Sam Clegg03e101f2018-03-01 18:06:21 +000032 Streamer.EmitIntValue(uint8_t(Type), 1);
Derek Schuffb8795392017-03-16 20:49:48 +000033}
34
Dan Gohman3469ee12016-01-12 20:30:51 +000035WebAssemblyTargetAsmStreamer::WebAssemblyTargetAsmStreamer(
36 MCStreamer &S, formatted_raw_ostream &OS)
37 : WebAssemblyTargetStreamer(S), OS(OS) {}
38
Dan Gohman18eafb62017-02-22 01:23:18 +000039WebAssemblyTargetWasmStreamer::WebAssemblyTargetWasmStreamer(MCStreamer &S)
40 : WebAssemblyTargetStreamer(S) {}
41
Heejin Ahn21d45a22018-12-11 00:53:59 +000042static void printTypes(formatted_raw_ostream &OS,
43 ArrayRef<wasm::ValType> Types) {
Dan Gohman3469ee12016-01-12 20:30:51 +000044 bool First = true;
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000045 for (auto Type : Types) {
Dan Gohman3469ee12016-01-12 20:30:51 +000046 if (First)
47 First = false;
48 else
49 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000050 OS << WebAssembly::typeToString(Type);
Dan Gohman3469ee12016-01-12 20:30:51 +000051 }
52 OS << '\n';
53}
54
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000055void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) {
Dan Gohman3acb1872016-10-24 23:27:49 +000056 if (!Types.empty()) {
57 OS << "\t.local \t";
Heejin Ahn21d45a22018-12-11 00:53:59 +000058 printTypes(OS, Types);
Dan Gohman3acb1872016-10-24 23:27:49 +000059 }
Dan Gohman3469ee12016-01-12 20:30:51 +000060}
61
62void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; }
63
Heejin Ahnbe5e5872018-12-11 01:11:04 +000064void WebAssemblyTargetAsmStreamer::emitSignature(
65 const wasm::WasmSignature *Sig) {
66 OS << "(";
67 emitParamList(Sig);
68 OS << ") -> (";
69 emitReturnList(Sig);
70 OS << ")";
71}
72
73void WebAssemblyTargetAsmStreamer::emitParamList(
74 const wasm::WasmSignature *Sig) {
75 auto &Params = Sig->Params;
76 for (auto &Ty : Params) {
77 if (&Ty != &Params[0])
78 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000079 OS << WebAssembly::typeToString(Ty);
Heejin Ahnbe5e5872018-12-11 01:11:04 +000080 }
81}
82
83void WebAssemblyTargetAsmStreamer::emitReturnList(
84 const wasm::WasmSignature *Sig) {
85 auto &Returns = Sig->Returns;
86 for (auto &Ty : Returns) {
87 if (&Ty != &Returns[0])
88 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000089 OS << WebAssembly::typeToString(Ty);
Heejin Ahnbe5e5872018-12-11 01:11:04 +000090 }
91}
92
Heejin Ahn21d45a22018-12-11 00:53:59 +000093void WebAssemblyTargetAsmStreamer::emitFunctionType(const MCSymbolWasm *Sym) {
94 assert(Sym->isFunction());
Heejin Ahnbe5e5872018-12-11 01:11:04 +000095 OS << "\t.functype\t" << Sym->getName() << " ";
96 emitSignature(Sym->getSignature());
97 OS << "\n";
Derek Schuff5859a9ed2016-06-03 18:34:36 +000098}
99
Heejin Ahn21d45a22018-12-11 00:53:59 +0000100void WebAssemblyTargetAsmStreamer::emitGlobalType(const MCSymbolWasm *Sym) {
Heejin Ahnda419bd2018-11-14 02:46:21 +0000101 assert(Sym->isGlobal());
Wouter van Oortmerssen98432952019-01-03 22:59:59 +0000102 OS << "\t.globaltype\t" << Sym->getName() << ", "
103 << WebAssembly::typeToString(
104 static_cast<wasm::ValType>(Sym->getGlobalType().Type))
105 << '\n';
Derek Schuff7747d703e2016-12-01 00:11:15 +0000106}
107
Heejin Ahn21d45a22018-12-11 00:53:59 +0000108void WebAssemblyTargetAsmStreamer::emitEventType(const MCSymbolWasm *Sym) {
Heejin Ahnda419bd2018-11-14 02:46:21 +0000109 assert(Sym->isEvent());
Heejin Ahnbe5e5872018-12-11 01:11:04 +0000110 OS << "\t.eventtype\t" << Sym->getName() << " ";
111 emitParamList(Sym->getSignature());
112 OS << "\n";
Heejin Ahnda419bd2018-11-14 02:46:21 +0000113}
114
Heejin Ahn21d45a22018-12-11 00:53:59 +0000115void WebAssemblyTargetAsmStreamer::emitImportModule(const MCSymbolWasm *Sym,
Dan Gohmandb1916a2018-02-09 23:13:22 +0000116 StringRef ModuleName) {
117 OS << "\t.import_module\t" << Sym->getName() << ", " << ModuleName << '\n';
118}
119
Derek Schuffc64d7652016-08-01 22:25:02 +0000120void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) {
121 OS << "\t.indidx \t" << *Value << '\n';
122}
123
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000124void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) {
125 SmallVector<std::pair<wasm::ValType, uint32_t>, 4> Grouped;
126 for (auto Type : Types) {
Dan Gohmand934cb82017-02-24 23:18:00 +0000127 if (Grouped.empty() || Grouped.back().first != Type)
128 Grouped.push_back(std::make_pair(Type, 1));
129 else
130 ++Grouped.back().second;
131 }
132
133 Streamer.EmitULEB128IntValue(Grouped.size());
134 for (auto Pair : Grouped) {
135 Streamer.EmitULEB128IntValue(Pair.second);
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000136 emitValueType(Pair.first);
Dan Gohmand934cb82017-02-24 23:18:00 +0000137 }
Dan Gohman18eafb62017-02-22 01:23:18 +0000138}
139
140void WebAssemblyTargetWasmStreamer::emitEndFunc() {
Dan Gohmand934cb82017-02-24 23:18:00 +0000141 llvm_unreachable(".end_func is not needed for direct wasm output");
Dan Gohman18eafb62017-02-22 01:23:18 +0000142}
143
144void WebAssemblyTargetWasmStreamer::emitIndIdx(const MCExpr *Value) {
145 llvm_unreachable(".indidx encoding not yet implemented");
146}