blob: e05efef7201b24e52f1fd0da674466feb809d86c [file] [log] [blame]
Dan Gohman3469ee12016-01-12 20:30:51 +00001//==-- WebAssemblyTargetStreamer.cpp - WebAssembly Target Streamer Methods --=//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Dan Gohman3469ee12016-01-12 20:30:51 +00006//
7//===----------------------------------------------------------------------===//
8///
9/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000010/// This file defines WebAssembly-specific target streamer classes.
Dan Gohman3469ee12016-01-12 20:30:51 +000011/// These are for implementing support for target-specific assembly directives.
12///
13//===----------------------------------------------------------------------===//
14
David L. Jonesa263aa22019-05-13 03:32:41 +000015#include "MCTargetDesc/WebAssemblyTargetStreamer.h"
16#include "MCTargetDesc/WebAssemblyInstPrinter.h"
17#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000018#include "llvm/MC/MCContext.h"
Dan Gohman18eafb62017-02-22 01:23:18 +000019#include "llvm/MC/MCSectionWasm.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000020#include "llvm/MC/MCSubtargetInfo.h"
Dan Gohman18eafb62017-02-22 01:23:18 +000021#include "llvm/MC/MCSymbolWasm.h"
Dan Gohmand934cb82017-02-24 23:18:00 +000022#include "llvm/Support/Casting.h"
Dan Gohman3469ee12016-01-12 20:30:51 +000023#include "llvm/Support/ErrorHandling.h"
24#include "llvm/Support/FormattedStream.h"
25using namespace llvm;
26
27WebAssemblyTargetStreamer::WebAssemblyTargetStreamer(MCStreamer &S)
28 : MCTargetStreamer(S) {}
29
Derek Schuffb8795392017-03-16 20:49:48 +000030void WebAssemblyTargetStreamer::emitValueType(wasm::ValType Type) {
Sam Clegg03e101f2018-03-01 18:06:21 +000031 Streamer.EmitIntValue(uint8_t(Type), 1);
Derek Schuffb8795392017-03-16 20:49:48 +000032}
33
Dan Gohman3469ee12016-01-12 20:30:51 +000034WebAssemblyTargetAsmStreamer::WebAssemblyTargetAsmStreamer(
35 MCStreamer &S, formatted_raw_ostream &OS)
36 : WebAssemblyTargetStreamer(S), OS(OS) {}
37
Dan Gohman18eafb62017-02-22 01:23:18 +000038WebAssemblyTargetWasmStreamer::WebAssemblyTargetWasmStreamer(MCStreamer &S)
39 : WebAssemblyTargetStreamer(S) {}
40
Heejin Ahn21d45a22018-12-11 00:53:59 +000041static void printTypes(formatted_raw_ostream &OS,
42 ArrayRef<wasm::ValType> Types) {
Dan Gohman3469ee12016-01-12 20:30:51 +000043 bool First = true;
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000044 for (auto Type : Types) {
Dan Gohman3469ee12016-01-12 20:30:51 +000045 if (First)
46 First = false;
47 else
48 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000049 OS << WebAssembly::typeToString(Type);
Dan Gohman3469ee12016-01-12 20:30:51 +000050 }
51 OS << '\n';
52}
53
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000054void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) {
Dan Gohman3acb1872016-10-24 23:27:49 +000055 if (!Types.empty()) {
56 OS << "\t.local \t";
Heejin Ahn21d45a22018-12-11 00:53:59 +000057 printTypes(OS, Types);
Dan Gohman3acb1872016-10-24 23:27:49 +000058 }
Dan Gohman3469ee12016-01-12 20:30:51 +000059}
60
61void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; }
62
Heejin Ahnbe5e5872018-12-11 01:11:04 +000063void WebAssemblyTargetAsmStreamer::emitSignature(
64 const wasm::WasmSignature *Sig) {
65 OS << "(";
66 emitParamList(Sig);
67 OS << ") -> (";
68 emitReturnList(Sig);
69 OS << ")";
70}
71
72void WebAssemblyTargetAsmStreamer::emitParamList(
73 const wasm::WasmSignature *Sig) {
74 auto &Params = Sig->Params;
75 for (auto &Ty : Params) {
76 if (&Ty != &Params[0])
77 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000078 OS << WebAssembly::typeToString(Ty);
Heejin Ahnbe5e5872018-12-11 01:11:04 +000079 }
80}
81
82void WebAssemblyTargetAsmStreamer::emitReturnList(
83 const wasm::WasmSignature *Sig) {
84 auto &Returns = Sig->Returns;
85 for (auto &Ty : Returns) {
86 if (&Ty != &Returns[0])
87 OS << ", ";
Wouter van Oortmerssen98432952019-01-03 22:59:59 +000088 OS << WebAssembly::typeToString(Ty);
Heejin Ahnbe5e5872018-12-11 01:11:04 +000089 }
90}
91
Heejin Ahn21d45a22018-12-11 00:53:59 +000092void WebAssemblyTargetAsmStreamer::emitFunctionType(const MCSymbolWasm *Sym) {
93 assert(Sym->isFunction());
Heejin Ahnbe5e5872018-12-11 01:11:04 +000094 OS << "\t.functype\t" << Sym->getName() << " ";
95 emitSignature(Sym->getSignature());
96 OS << "\n";
Derek Schuff5859a9ed2016-06-03 18:34:36 +000097}
98
Heejin Ahn21d45a22018-12-11 00:53:59 +000099void WebAssemblyTargetAsmStreamer::emitGlobalType(const MCSymbolWasm *Sym) {
Heejin Ahnda419bd2018-11-14 02:46:21 +0000100 assert(Sym->isGlobal());
Wouter van Oortmerssen98432952019-01-03 22:59:59 +0000101 OS << "\t.globaltype\t" << Sym->getName() << ", "
102 << WebAssembly::typeToString(
103 static_cast<wasm::ValType>(Sym->getGlobalType().Type))
104 << '\n';
Derek Schuff7747d703e2016-12-01 00:11:15 +0000105}
106
Heejin Ahn21d45a22018-12-11 00:53:59 +0000107void WebAssemblyTargetAsmStreamer::emitEventType(const MCSymbolWasm *Sym) {
Heejin Ahnda419bd2018-11-14 02:46:21 +0000108 assert(Sym->isEvent());
Heejin Ahnbe5e5872018-12-11 01:11:04 +0000109 OS << "\t.eventtype\t" << Sym->getName() << " ";
110 emitParamList(Sym->getSignature());
111 OS << "\n";
Heejin Ahnda419bd2018-11-14 02:46:21 +0000112}
113
Heejin Ahn21d45a22018-12-11 00:53:59 +0000114void WebAssemblyTargetAsmStreamer::emitImportModule(const MCSymbolWasm *Sym,
Dan Gohmanf726e442019-02-01 22:27:34 +0000115 StringRef ImportModule) {
116 OS << "\t.import_module\t" << Sym->getName() << ", "
117 << ImportModule << '\n';
118}
119
120void WebAssemblyTargetAsmStreamer::emitImportName(const MCSymbolWasm *Sym,
121 StringRef ImportName) {
122 OS << "\t.import_name\t" << Sym->getName() << ", "
123 << ImportName << '\n';
Dan Gohmandb1916a2018-02-09 23:13:22 +0000124}
125
Derek Schuffc64d7652016-08-01 22:25:02 +0000126void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) {
127 OS << "\t.indidx \t" << *Value << '\n';
128}
129
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000130void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) {
131 SmallVector<std::pair<wasm::ValType, uint32_t>, 4> Grouped;
132 for (auto Type : Types) {
Dan Gohmand934cb82017-02-24 23:18:00 +0000133 if (Grouped.empty() || Grouped.back().first != Type)
134 Grouped.push_back(std::make_pair(Type, 1));
135 else
136 ++Grouped.back().second;
137 }
138
139 Streamer.EmitULEB128IntValue(Grouped.size());
140 for (auto Pair : Grouped) {
141 Streamer.EmitULEB128IntValue(Pair.second);
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000142 emitValueType(Pair.first);
Dan Gohmand934cb82017-02-24 23:18:00 +0000143 }
Dan Gohman18eafb62017-02-22 01:23:18 +0000144}
145
146void WebAssemblyTargetWasmStreamer::emitEndFunc() {
Dan Gohmand934cb82017-02-24 23:18:00 +0000147 llvm_unreachable(".end_func is not needed for direct wasm output");
Dan Gohman18eafb62017-02-22 01:23:18 +0000148}
149
150void WebAssemblyTargetWasmStreamer::emitIndIdx(const MCExpr *Value) {
151 llvm_unreachable(".indidx encoding not yet implemented");
152}