[lld] r339047 - [WebAssembly] --export should fetch lazy symbols
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 6 12:45:12 PDT 2018
Author: sbc
Date: Mon Aug 6 12:45:12 2018
New Revision: 339047
URL: http://llvm.org/viewvc/llvm-project?rev=339047&view=rev
Log:
[WebAssembly] --export should fetch lazy symbols
--export now implies --undefined
This is really a requirement from emscripten but I think it
makes sense in general too.
Differential Revision: https://reviews.llvm.org/D50287
Added:
lld/trunk/test/wasm/archive-export.ll
Modified:
lld/trunk/wasm/Driver.cpp
Added: lld/trunk/test/wasm/archive-export.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/archive-export.ll?rev=339047&view=auto
==============================================================================
--- lld/trunk/test/wasm/archive-export.ll (added)
+++ lld/trunk/test/wasm/archive-export.ll Mon Aug 6 12:45:12 2018
@@ -0,0 +1,50 @@
+Test that --export will also fetch lazy symbols from archives
+
+RUN: llc -filetype=obj %S/Inputs/start.ll -o %t.o
+RUN: llc -filetype=obj %S/Inputs/archive1.ll -o %t.a1.o
+RUN: llc -filetype=obj %S/Inputs/archive2.ll -o %t.a2.o
+RUN: rm -f %t.a
+RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o
+RUN: wasm-ld --export=archive2_symbol -o %t.wasm %t.a %t.o
+RUN: obj2yaml %t.wasm | FileCheck %s
+RUN: wasm-ld -o %t.wasm %t.a %t.o
+RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=NOEXPORT
+
+CHECK: Exports:
+CHECK-NEXT: - Name: memory
+CHECK-NEXT: Kind: MEMORY
+CHECK-NEXT: Index: 0
+CHECK-NEXT: - Name: __heap_base
+CHECK-NEXT: Kind: GLOBAL
+CHECK-NEXT: Index: 1
+CHECK-NEXT: - Name: __data_end
+CHECK-NEXT: Kind: GLOBAL
+CHECK-NEXT: Index: 2
+CHECK-NEXT: - Name: foo
+CHECK-NEXT: Kind: FUNCTION
+CHECK-NEXT: Index: 2
+CHECK-NEXT: - Name: bar
+CHECK-NEXT: Kind: FUNCTION
+CHECK-NEXT: Index: 3
+CHECK-NEXT: - Name: archive2_symbol
+CHECK-NEXT: Kind: FUNCTION
+CHECK-NEXT: Index: 4
+CHECK-NEXT: - Name: _start
+CHECK-NEXT: Kind: FUNCTION
+CHECK-NEXT: Index: 1
+CHECK-NEXT: - Type: CODE
+
+NOEXPORT: Exports:
+NOEXPORT-NEXT: - Name: memory
+NOEXPORT-NEXT: Kind: MEMORY
+NOEXPORT-NEXT: Index: 0
+NOEXPORT-NEXT: - Name: __heap_base
+NOEXPORT-NEXT: Kind: GLOBAL
+NOEXPORT-NEXT: Index: 1
+NOEXPORT-NEXT: - Name: __data_end
+NOEXPORT-NEXT: Kind: GLOBAL
+NOEXPORT-NEXT: Index: 2
+NOEXPORT-NEXT: - Name: _start
+NOEXPORT-NEXT: Kind: FUNCTION
+NOEXPORT-NEXT: Index: 1
+NOEXPORT-NEXT: - Type: CODE
Modified: lld/trunk/wasm/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=339047&r1=339046&r2=339047&view=diff
==============================================================================
--- lld/trunk/wasm/Driver.cpp (original)
+++ lld/trunk/wasm/Driver.cpp Mon Aug 6 12:45:12 2018
@@ -484,6 +484,17 @@ void LinkerDriver::link(ArrayRef<const c
for (auto *Arg : Args.filtered(OPT_undefined))
handleUndefined(Arg->getValue());
+ // Handle the `--export <sym>` options
+ // This works like --undefined but also exports the symbol if its found
+ for (auto *Arg : Args.filtered(OPT_export)) {
+ Symbol *Sym = handleUndefined(Arg->getValue());
+ if (Sym && Sym->isDefined())
+ Sym->ForceExport = true;
+ else if (!Config->AllowUndefined)
+ error(Twine("symbol exported via --export not found: ") +
+ Arg->getValue());
+ }
+
if (!Config->Relocatable) {
// Add synthetic dummies for weak undefined functions.
handleWeakUndefines();
@@ -503,16 +514,6 @@ void LinkerDriver::link(ArrayRef<const c
if (errorCount())
return;
- // Handle --export.
- for (auto *Arg : Args.filtered(OPT_export)) {
- StringRef Name = Arg->getValue();
- Symbol *Sym = Symtab->find(Name);
- if (Sym && Sym->isDefined())
- Sym->ForceExport = true;
- else if (!Config->AllowUndefined)
- error("symbol exported via --export not found: " + Name);
- }
-
// Do link-time optimization if given files are LLVM bitcode files.
// This compiles bitcode files into real object files.
Symtab->addCombinedLTOObject();
More information about the llvm-commits
mailing list