forked from OSchip/llvm-project
[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:
parent
5058dd0f49
commit
040ef1091d
|
@ -0,0 +1,7 @@
|
|||
target triple = "wasm32-unknown-unknown"
|
||||
|
||||
@__dso_handle = external global i8*
|
||||
|
||||
define i8** @get_optional() {
|
||||
ret i8** @__dso_handle
|
||||
}
|
|
@ -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
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue