Index: lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h =================================================================== --- lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h +++ lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h @@ -44,7 +44,7 @@ /// .indidx virtual void emitIndIdx(const MCExpr *Value) = 0; /// .import_global - virtual void emitGlobalImport(StringRef name) = 0; + 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,13 @@ //===----------------------------------------------------------------------===// 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()) { @@ -114,7 +121,6 @@ } } } - if (const NamedMDNode *Named = M.getNamedMetadata("wasm.custom_sections")) { for (const Metadata *MD : Named->operands()) { const MDTuple *Tuple = dyn_cast(MD); 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