From: Derek Schuff Date: Thu, 1 Dec 2016 00:11:15 +0000 (+0000) Subject: [WebAssembly] Emit .import_global assembler directives X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a95cded1a3fcecc1aa8ba8ddfc241b9e7ab6a17a;p=llvm [WebAssembly] Emit .import_global assembler directives Support a new assembler directive, .import_global, to declare imported global variables (i.e. those with external linkage and no initializer). The linker turns these into wasm imports. Patch by Jacob Gravelle Differential Revision: https://reviews.llvm.org/D26875 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288296 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp index f0886880802..3cee8b2a184 100644 --- a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp +++ b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp @@ -80,6 +80,10 @@ void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType( OS << '\n'; } +void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) { + OS << "\t.import_global\t" << name << '\n'; +} + void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) { OS << "\t.indidx \t" << *Value << '\n'; } @@ -111,3 +115,6 @@ void WebAssemblyTargetELFStreamer::emitIndirectFunctionType( // Nothing to emit here. TODO: Re-design how linking works and re-evaluate // whether it's necessary for .o files to declare indirect function types. } + +void WebAssemblyTargetELFStreamer::emitGlobalImport(StringRef name) { +} \ No newline at end of file diff --git a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h index cf164ca5924..23ac3190243 100644 --- a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h +++ b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h @@ -45,6 +45,8 @@ public: } /// .indidx virtual void emitIndIdx(const MCExpr *Value) = 0; + /// .import_global + virtual void emitGlobalImport(StringRef name) = 0; }; /// This part is for ascii assembly output @@ -62,6 +64,7 @@ public: SmallVectorImpl &Params, SmallVectorImpl &Results) override; void emitIndIdx(const MCExpr *Value) override; + void emitGlobalImport(StringRef name) override; }; /// This part is for ELF object output @@ -77,6 +80,7 @@ public: SmallVectorImpl &Params, SmallVectorImpl &Results) override; void emitIndIdx(const MCExpr *Value) override; + void emitGlobalImport(StringRef name) override; }; } // end namespace llvm diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index f53cfca9db3..5b4b82eb560 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -133,6 +133,11 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { Results); } } + for (const auto &G : M.globals()) { + if (!G.hasInitializer() && G.hasExternalLinkage()) { + getTargetStreamer()->emitGlobalImport(G.getGlobalIdentifier()); + } + } } void WebAssemblyAsmPrinter::EmitConstantPool() { diff --git a/test/CodeGen/WebAssembly/globl.ll b/test/CodeGen/WebAssembly/globl.ll index 91d3ade4666..3ebd3d88fb4 100644 --- a/test/CodeGen/WebAssembly/globl.ll +++ b/test/CodeGen/WebAssembly/globl.ll @@ -8,3 +8,7 @@ target triple = "wasm32-unknown-unknown" define void @foo() { ret void } + +; Check import directives - must be at the end of the file +; CHECK: .import_global bar{{$}} +@bar = external global i32