From 040ef1091d1150ef3ceda7dab8fa1b6f98762033 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 27 Aug 2019 04:27:57 +0000 Subject: [PATCH] [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 --- lld/test/wasm/Inputs/optional-symbol.ll | 7 +++++++ lld/test/wasm/export-optional-lazy.ll | 25 +++++++++++++++++++++++++ lld/wasm/Driver.cpp | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 lld/test/wasm/Inputs/optional-symbol.ll create mode 100644 lld/test/wasm/export-optional-lazy.ll diff --git a/lld/test/wasm/Inputs/optional-symbol.ll b/lld/test/wasm/Inputs/optional-symbol.ll new file mode 100644 index 000000000000..d39a8a4db637 --- /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 index 000000000000..5662b0b056d9 --- /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 index a28b85d770c4..833a20959a9c 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -721,8 +721,6 @@ void LinkerDriver::link(ArrayRef argsArr) { if (errorCount()) return; - createOptionalSymbols(); - // Handle the `--undefined ` options. for (auto *arg : args.filtered(OPT_undefined)) handleUndefined(arg->getValue()); @@ -742,6 +740,8 @@ void LinkerDriver::link(ArrayRef argsArr) { config->entry); } + createOptionalSymbols(); + if (errorCount()) return;