diff --git a/lld/test/wasm/Inputs/optional-symbol.ll b/lld/test/wasm/Inputs/optional-symbol.ll new file mode 100644 --- /dev/null +++ b/lld/test/wasm/Inputs/optional-symbol.ll @@ -0,0 +1,7 @@ +target triple = "wasm32-unknown-unknown" + +@__dso_handle = external global i8* + +define i8** @get_optional() { + ret i8** @__dso_handle +} diff --git a/lld/test/wasm/export-optional-lazy.ll b/lld/test/wasm/export-optional-lazy.ll new file mode 100644 --- /dev/null +++ b/lld/test/wasm/export-optional-lazy.ll @@ -0,0 +1,25 @@ +; Optional linker-synthetic symbols are only created if they are undefined +; in the final output. +; This test is for a regression where an explict --export of an lazy archive +; symbol caused an undefined referece to an optional symbol to occur *after* +; the optional symbols were created. + +; RUN: llc -filetype=obj %s -o %t.o +; RUN: llc -filetype=obj %S/Inputs/optional-symbol.ll -o %t.a1.o +; RUN: rm -f %t.a +; RUN: llvm-ar rcs %t.a %t.a1.o +; RUN: wasm-ld --export=get_optional %t.o %t.a -o %t.wasm +; RUN: obj2yaml %t.wasm | FileCheck %s + +target triple = "wasm32-unknown-unknown" + +define void @_start() { +entry: + ret void +} + +; CHECK: FunctionNames: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Name: _start +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Name: get_optional diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -721,8 +721,6 @@ if (errorCount()) return; - createOptionalSymbols(); - // Handle the `--undefined ` options. for (auto *arg : args.filtered(OPT_undefined)) handleUndefined(arg->getValue()); @@ -742,6 +740,8 @@ config->entry); } + createOptionalSymbols(); + if (errorCount()) return;