[WebAssembly] Honor --allow-undefined even for explicit exports
authorSam Clegg <sbc@chromium.org>
Thu, 8 Mar 2018 01:16:05 +0000 (01:16 +0000)
committerSam Clegg <sbc@chromium.org>
Thu, 8 Mar 2018 01:16:05 +0000 (01:16 +0000)
When a symbol is exported via --export=foo but --allow-undefined
is also specified, the symbol is now allowed to be undefined.
Previously we were special casing such symbols.

This combinations of behavior is exactly what emescripten
requires. Although we are trying hard not to allow emscripten
specific features in lld, this one makes sense.

Enforce this behavior by added this case to test/wasm/undefined.ll.

Differential Revision: https://reviews.llvm.org/D44237

llvm-svn: 326976

lld/test/wasm/undefined.ll
lld/wasm/Driver.cpp

index 69b7a82..a74dd6d 100644 (file)
@@ -6,10 +6,13 @@
 ; CHECK: error: {{.*}}.o: undefined symbol: foo
 ; CHECK: error: undefined symbol: baz
 
-; But succeeds if we pass a file containing 'foo' as --allow-undefined-file.
+; Succeeds if we pass a file containing 'foo' as --allow-undefined-file.
 ; RUN: echo 'foo' > %t.txt
 ; RUN: wasm-ld --check-signatures --allow-undefined-file=%t.txt -o %t.wasm %t.o
 
+; Succeeds even if a missing symbol is added via --export
+; RUN: wasm-ld --check-signatures --allow-undefined --export=xxx -o %t.wasm %t.o
+
 target triple = "wasm32-unknown-unknown-wasm"
 
 ; Takes the address of the external foo() resulting in undefined external
index ef0794c..a97026d 100644 (file)
@@ -346,7 +346,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
     Symbol *Sym = Symtab->find(Name);
     if (Sym && Sym->isDefined())
       Sym->setHidden(false);
-    else
+    else if (!Config->AllowUndefined)
       error("symbol exported via --export not found: " + Name);
   }