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

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 26 21:27:57 PDT 2019


Author: sbc
Date: Mon Aug 26 21:27:57 2019
New Revision: 370012

URL: http://llvm.org/viewvc/llvm-project?rev=370012&view=rev
Log:
[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

Added:
    lld/trunk/test/wasm/Inputs/optional-symbol.ll
    lld/trunk/test/wasm/export-optional-lazy.ll
Modified:
    lld/trunk/wasm/Driver.cpp

Added: lld/trunk/test/wasm/Inputs/optional-symbol.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/Inputs/optional-symbol.ll?rev=370012&view=auto
==============================================================================
--- lld/trunk/test/wasm/Inputs/optional-symbol.ll (added)
+++ lld/trunk/test/wasm/Inputs/optional-symbol.ll Mon Aug 26 21:27:57 2019
@@ -0,0 +1,7 @@
+target triple = "wasm32-unknown-unknown"
+
+ at __dso_handle = external global i8*
+
+define i8** @get_optional() {
+  ret i8** @__dso_handle
+}

Added: lld/trunk/test/wasm/export-optional-lazy.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/export-optional-lazy.ll?rev=370012&view=auto
==============================================================================
--- lld/trunk/test/wasm/export-optional-lazy.ll (added)
+++ lld/trunk/test/wasm/export-optional-lazy.ll Mon Aug 26 21:27:57 2019
@@ -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

Modified: lld/trunk/wasm/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=370012&r1=370011&r2=370012&view=diff
==============================================================================
--- lld/trunk/wasm/Driver.cpp (original)
+++ lld/trunk/wasm/Driver.cpp Mon Aug 26 21:27:57 2019
@@ -721,8 +721,6 @@ void LinkerDriver::link(ArrayRef<const c
   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 c
             config->entry);
   }
 
+  createOptionalSymbols();
+
   if (errorCount())
     return;
 




More information about the llvm-commits mailing list