[lld][WebAssembly] Create optional symbols after handling --export/--undefined

Handling of --export/--undefined can pull in lazy symbols which in turn
can pull in referenced to optional symbols.  We need to delay the
creation of optional symbols until all possible references to them have
been created.

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

llvm-svn: 370012
This commit is contained in:
Sam Clegg 2019-08-27 04:27:57 +00:00
parent 5058dd0f49
commit 040ef1091d
3 changed files with 34 additions and 2 deletions

View File

@ -0,0 +1,7 @@
target triple = "wasm32-unknown-unknown"
@__dso_handle = external global i8*
define i8** @get_optional() {
ret i8** @__dso_handle
}

View File

@ -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

View File

@ -721,8 +721,6 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) {
if (errorCount())
return;
createOptionalSymbols();
// Handle the `--undefined <sym>` options.
for (auto *arg : args.filtered(OPT_undefined))
handleUndefined(arg->getValue());
@ -742,6 +740,8 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) {
config->entry);
}
createOptionalSymbols();
if (errorCount())
return;