diff options
Diffstat (limited to 'llvm/lib')
3 files changed, 20 insertions, 8 deletions
diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp index 2158ee3be04..4c4ca4e599c 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp @@ -99,8 +99,11 @@ void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType( OS << '\n'; } -void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) { - OS << "\t.import_global\t" << name << '\n'; +void WebAssemblyTargetAsmStreamer::emitGlobalType(MCSymbolWasm *Sym) { + OS << "\t.globaltype\t" << Sym->getName() << ", " << + WebAssembly::TypeToString( + static_cast<wasm::ValType>(Sym->getGlobalType().Type)) << + '\n'; } void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym, @@ -152,8 +155,8 @@ void WebAssemblyTargetWasmStreamer::emitIndirectFunctionType( Symbol->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION); } -void WebAssemblyTargetWasmStreamer::emitGlobalImport(StringRef name) { - llvm_unreachable(".global_import is not needed for direct wasm output"); +void WebAssemblyTargetWasmStreamer::emitGlobalType(MCSymbolWasm *Sym) { + // Not needed. } void WebAssemblyTargetWasmStreamer::emitImportModule(MCSymbolWasm *Sym, diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h index 43c422d593a..e60158b5def 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h @@ -43,8 +43,8 @@ public: virtual void emitIndirectFunctionType(MCSymbolWasm *Symbol) = 0; /// .indidx virtual void emitIndIdx(const MCExpr *Value) = 0; - /// .import_global - virtual void emitGlobalImport(StringRef name) = 0; + /// .globaltype + virtual void emitGlobalType(MCSymbolWasm *Sym) = 0; /// .import_module virtual void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) = 0; @@ -65,7 +65,7 @@ public: void emitEndFunc() override; void emitIndirectFunctionType(MCSymbolWasm *Symbol) override; void emitIndIdx(const MCExpr *Value) override; - void emitGlobalImport(StringRef name) override; + void emitGlobalType(MCSymbolWasm *Sym) override; void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; }; @@ -80,7 +80,7 @@ public: void emitEndFunc() override; void emitIndirectFunctionType(MCSymbolWasm *Symbol) override; void emitIndIdx(const MCExpr *Value) override; - void emitGlobalImport(StringRef name) override; + void emitGlobalType(MCSymbolWasm *Sym) override; void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; }; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index b8ac85943eb..1e21ab92b62 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -78,6 +78,14 @@ WebAssemblyTargetStreamer *WebAssemblyAsmPrinter::getTargetStreamer() { //===----------------------------------------------------------------------===// void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { + for (auto &It : OutContext.getSymbols()) { + // Emit a .globaltype declaration. + auto Sym = cast<MCSymbolWasm>(It.getValue()); + if (Sym->getType() == wasm::WASM_SYMBOL_TYPE_GLOBAL) { + getTargetStreamer()->emitGlobalType(Sym); + } + } + for (const auto &F : M) { // Emit function type info for all undefined functions if (F.isDeclarationForLinker() && !F.isIntrinsic()) { @@ -105,6 +113,7 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { } } } + for (const auto &G : M.globals()) { if (!G.hasInitializer() && G.hasExternalLinkage()) { if (G.getValueType()->isSized()) { |