Skip to content

Commit 3231e51

Browse files
committed
[WebAssembly] Added a .globaltype directive to .s output.
Summary: Assembly output can use globals like __stack_pointer implicitly, but has no way of indicating the type of such a global, which makes it hard for tools processing it (such as the MC Assembler) to reconstruct this information. The improved assembler directives parsing (in progress in https://reviews.llvm.org/D53842) will make use of this information. Also deleted code for the .import_global directive which was unused. New test case in userstack.ll Reviewers: dschuff, sbc100 Subscribers: jgravelle-google, aheejin, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D54012 llvm-svn: 345917
1 parent b2382c8 commit 3231e51

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,11 @@ void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType(
9999
OS << '\n';
100100
}
101101

102-
void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) {
103-
OS << "\t.import_global\t" << name << '\n';
102+
void WebAssemblyTargetAsmStreamer::emitGlobalType(MCSymbolWasm *Sym) {
103+
OS << "\t.globaltype\t" << Sym->getName() << ", " <<
104+
WebAssembly::TypeToString(
105+
static_cast<wasm::ValType>(Sym->getGlobalType().Type)) <<
106+
'\n';
104107
}
105108

106109
void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym,
@@ -152,8 +155,8 @@ void WebAssemblyTargetWasmStreamer::emitIndirectFunctionType(
152155
Symbol->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION);
153156
}
154157

155-
void WebAssemblyTargetWasmStreamer::emitGlobalImport(StringRef name) {
156-
llvm_unreachable(".global_import is not needed for direct wasm output");
158+
void WebAssemblyTargetWasmStreamer::emitGlobalType(MCSymbolWasm *Sym) {
159+
// Not needed.
157160
}
158161

159162
void WebAssemblyTargetWasmStreamer::emitImportModule(MCSymbolWasm *Sym,

llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ class WebAssemblyTargetStreamer : public MCTargetStreamer {
4343
virtual void emitIndirectFunctionType(MCSymbolWasm *Symbol) = 0;
4444
/// .indidx
4545
virtual void emitIndIdx(const MCExpr *Value) = 0;
46-
/// .import_global
47-
virtual void emitGlobalImport(StringRef name) = 0;
46+
/// .globaltype
47+
virtual void emitGlobalType(MCSymbolWasm *Sym) = 0;
4848
/// .import_module
4949
virtual void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) = 0;
5050

@@ -65,7 +65,7 @@ class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
6565
void emitEndFunc() override;
6666
void emitIndirectFunctionType(MCSymbolWasm *Symbol) override;
6767
void emitIndIdx(const MCExpr *Value) override;
68-
void emitGlobalImport(StringRef name) override;
68+
void emitGlobalType(MCSymbolWasm *Sym) override;
6969
void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override;
7070
};
7171

@@ -80,7 +80,7 @@ class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
8080
void emitEndFunc() override;
8181
void emitIndirectFunctionType(MCSymbolWasm *Symbol) override;
8282
void emitIndIdx(const MCExpr *Value) override;
83-
void emitGlobalImport(StringRef name) override;
83+
void emitGlobalType(MCSymbolWasm *Sym) override;
8484
void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override;
8585
};
8686

llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ WebAssemblyTargetStreamer *WebAssemblyAsmPrinter::getTargetStreamer() {
7878
//===----------------------------------------------------------------------===//
7979

8080
void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
81+
for (auto &It : OutContext.getSymbols()) {
82+
// Emit a .globaltype declaration.
83+
auto Sym = cast<MCSymbolWasm>(It.getValue());
84+
if (Sym->getType() == wasm::WASM_SYMBOL_TYPE_GLOBAL) {
85+
getTargetStreamer()->emitGlobalType(Sym);
86+
}
87+
}
88+
8189
for (const auto &F : M) {
8290
// Emit function type info for all undefined functions
8391
if (F.isDeclarationForLinker() && !F.isIntrinsic()) {
@@ -105,6 +113,7 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
105113
}
106114
}
107115
}
116+
108117
for (const auto &G : M.globals()) {
109118
if (!G.hasInitializer() && G.hasExternalLinkage()) {
110119
if (G.getValueType()->isSized()) {

llvm/test/CodeGen/WebAssembly/userstack.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,4 +330,6 @@ define void @inline_asm() {
330330
ret void
331331
}
332332

333+
; CHECK: .globaltype __stack_pointer, i32{{$}}
334+
333335
; TODO: test over-aligned alloca

0 commit comments

Comments
 (0)