Index: lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h =================================================================== --- lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h +++ lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h @@ -43,8 +43,8 @@ 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 @@ 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 @@ 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; }; Index: lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp =================================================================== --- lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp +++ lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp @@ -99,8 +99,11 @@ 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(Sym->getGlobalType().Type)) << + '\n'; } void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym, @@ -152,8 +155,8 @@ 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, Index: lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -78,6 +78,14 @@ //===----------------------------------------------------------------------===// void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { + for (auto &It : OutContext.getSymbols()) { + // Emit a .globaltype declaration. + auto Sym = cast(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 @@ } } } + for (const auto &G : M.globals()) { if (!G.hasInitializer() && G.hasExternalLinkage()) { if (G.getValueType()->isSized()) { Index: test/CodeGen/WebAssembly/userstack.ll =================================================================== --- test/CodeGen/WebAssembly/userstack.ll +++ test/CodeGen/WebAssembly/userstack.ll @@ -330,4 +330,6 @@ ret void } +; CHECK: .globaltype __stack_pointer, i32{{$}} + ; TODO: test over-aligned alloca