diff options
Diffstat (limited to 'lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp')
| -rw-r--r-- | lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp | 143 |
1 files changed, 52 insertions, 91 deletions
diff --git a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp index 5272e188e1d0..50143fb0ece3 100644 --- a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp +++ b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp @@ -39,70 +39,80 @@ WebAssemblyTargetAsmStreamer::WebAssemblyTargetAsmStreamer( WebAssemblyTargetWasmStreamer::WebAssemblyTargetWasmStreamer(MCStreamer &S) : WebAssemblyTargetStreamer(S) {} -static void PrintTypes(formatted_raw_ostream &OS, ArrayRef<MVT> Types) { +static void printTypes(formatted_raw_ostream &OS, + ArrayRef<wasm::ValType> Types) { bool First = true; - for (MVT Type : Types) { + for (auto Type : Types) { if (First) First = false; else OS << ", "; - OS << WebAssembly::TypeToString(Type); + OS << WebAssembly::typeToString(Type); } OS << '\n'; } -void WebAssemblyTargetAsmStreamer::emitParam(MCSymbol *Symbol, - ArrayRef<MVT> Types) { +void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) { if (!Types.empty()) { - OS << "\t.param \t"; - - // FIXME: Currently this applies to the "current" function; it may - // be cleaner to specify an explicit symbol as part of the directive. - - PrintTypes(OS, Types); + OS << "\t.local \t"; + printTypes(OS, Types); } } -void WebAssemblyTargetAsmStreamer::emitResult(MCSymbol *Symbol, - ArrayRef<MVT> Types) { - if (!Types.empty()) { - OS << "\t.result \t"; +void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; } - // FIXME: Currently this applies to the "current" function; it may - // be cleaner to specify an explicit symbol as part of the directive. +void WebAssemblyTargetAsmStreamer::emitSignature( + const wasm::WasmSignature *Sig) { + OS << "("; + emitParamList(Sig); + OS << ") -> ("; + emitReturnList(Sig); + OS << ")"; +} - PrintTypes(OS, Types); +void WebAssemblyTargetAsmStreamer::emitParamList( + const wasm::WasmSignature *Sig) { + auto &Params = Sig->Params; + for (auto &Ty : Params) { + if (&Ty != &Params[0]) + OS << ", "; + OS << WebAssembly::typeToString(Ty); } } -void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<MVT> Types) { - if (!Types.empty()) { - OS << "\t.local \t"; - PrintTypes(OS, Types); +void WebAssemblyTargetAsmStreamer::emitReturnList( + const wasm::WasmSignature *Sig) { + auto &Returns = Sig->Returns; + for (auto &Ty : Returns) { + if (&Ty != &Returns[0]) + OS << ", "; + OS << WebAssembly::typeToString(Ty); } } -void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; } +void WebAssemblyTargetAsmStreamer::emitFunctionType(const MCSymbolWasm *Sym) { + assert(Sym->isFunction()); + OS << "\t.functype\t" << Sym->getName() << " "; + emitSignature(Sym->getSignature()); + OS << "\n"; +} -void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType( - MCSymbol *Symbol, SmallVectorImpl<MVT> &Params, SmallVectorImpl<MVT> &Results) { - OS << "\t.functype\t" << Symbol->getName(); - if (Results.empty()) - OS << ", void"; - else { - assert(Results.size() == 1); - OS << ", " << WebAssembly::TypeToString(Results.front()); - } - for (auto Ty : Params) - OS << ", " << WebAssembly::TypeToString(Ty); - OS << '\n'; +void WebAssemblyTargetAsmStreamer::emitGlobalType(const MCSymbolWasm *Sym) { + assert(Sym->isGlobal()); + OS << "\t.globaltype\t" << Sym->getName() << ", " + << WebAssembly::typeToString( + static_cast<wasm::ValType>(Sym->getGlobalType().Type)) + << '\n'; } -void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) { - OS << "\t.import_global\t" << name << '\n'; +void WebAssemblyTargetAsmStreamer::emitEventType(const MCSymbolWasm *Sym) { + assert(Sym->isEvent()); + OS << "\t.eventtype\t" << Sym->getName() << " "; + emitParamList(Sym->getSignature()); + OS << "\n"; } -void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym, +void WebAssemblyTargetAsmStreamer::emitImportModule(const MCSymbolWasm *Sym, StringRef ModuleName) { OS << "\t.import_module\t" << Sym->getName() << ", " << ModuleName << '\n'; } @@ -111,27 +121,9 @@ void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) { OS << "\t.indidx \t" << *Value << '\n'; } -void WebAssemblyTargetWasmStreamer::emitParam(MCSymbol *Symbol, - ArrayRef<MVT> Types) { - SmallVector<wasm::ValType, 4> Params; - for (MVT Ty : Types) - Params.push_back(WebAssembly::toValType(Ty)); - - cast<MCSymbolWasm>(Symbol)->setParams(std::move(Params)); -} - -void WebAssemblyTargetWasmStreamer::emitResult(MCSymbol *Symbol, - ArrayRef<MVT> Types) { - SmallVector<wasm::ValType, 4> Returns; - for (MVT Ty : Types) - Returns.push_back(WebAssembly::toValType(Ty)); - - cast<MCSymbolWasm>(Symbol)->setReturns(std::move(Returns)); -} - -void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<MVT> Types) { - SmallVector<std::pair<MVT, uint32_t>, 4> Grouped; - for (MVT Type : Types) { +void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<wasm::ValType> Types) { + SmallVector<std::pair<wasm::ValType, uint32_t>, 4> Grouped; + for (auto Type : Types) { if (Grouped.empty() || Grouped.back().first != Type) Grouped.push_back(std::make_pair(Type, 1)); else @@ -141,7 +133,7 @@ void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<MVT> Types) { Streamer.EmitULEB128IntValue(Grouped.size()); for (auto Pair : Grouped) { Streamer.EmitULEB128IntValue(Pair.second); - emitValueType(WebAssembly::toValType(Pair.first)); + emitValueType(Pair.first); } } @@ -152,34 +144,3 @@ void WebAssemblyTargetWasmStreamer::emitEndFunc() { void WebAssemblyTargetWasmStreamer::emitIndIdx(const MCExpr *Value) { llvm_unreachable(".indidx encoding not yet implemented"); } - -void WebAssemblyTargetWasmStreamer::emitIndirectFunctionType( - MCSymbol *Symbol, SmallVectorImpl<MVT> &Params, - SmallVectorImpl<MVT> &Results) { - MCSymbolWasm *WasmSym = cast<MCSymbolWasm>(Symbol); - if (WasmSym->isFunction()) { - // Symbol already has its arguments and result set. - return; - } - - SmallVector<wasm::ValType, 4> ValParams; - for (MVT Ty : Params) - ValParams.push_back(WebAssembly::toValType(Ty)); - - SmallVector<wasm::ValType, 1> ValResults; - for (MVT Ty : Results) - ValResults.push_back(WebAssembly::toValType(Ty)); - - WasmSym->setParams(std::move(ValParams)); - WasmSym->setReturns(std::move(ValResults)); - WasmSym->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION); -} - -void WebAssemblyTargetWasmStreamer::emitGlobalImport(StringRef name) { - llvm_unreachable(".global_import is not needed for direct wasm output"); -} - -void WebAssemblyTargetWasmStreamer::emitImportModule(MCSymbolWasm *Sym, - StringRef ModuleName) { - Sym->setModuleName(ModuleName); -} |
