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

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 26 14:42:41 PDT 2019


sbc100 created this revision.
Herald added subscribers: llvm-commits, sunfish, aheejin, jgravelle-google, dschuff.
Herald added a project: LLVM.
sbc100 added a reviewer: ruiu.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66768

Files:
  lld/test/wasm/Inputs/optional-symbol.ll
  lld/test/wasm/export-optional-lazy.ll
  lld/wasm/Driver.cpp


Index: lld/wasm/Driver.cpp
===================================================================
--- lld/wasm/Driver.cpp
+++ lld/wasm/Driver.cpp
@@ -721,8 +721,6 @@
   if (errorCount())
     return;
 
-  createOptionalSymbols();
-
   // Handle the `--undefined <sym>` options.
   for (auto *arg : args.filtered(OPT_undefined))
     handleUndefined(arg->getValue());
@@ -742,6 +740,8 @@
             config->entry);
   }
 
+  createOptionalSymbols();
+
   if (errorCount())
     return;
 
Index: lld/test/wasm/export-optional-lazy.ll
===================================================================
--- /dev/null
+++ 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
Index: lld/test/wasm/Inputs/optional-symbol.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/Inputs/optional-symbol.ll
@@ -0,0 +1,7 @@
+target triple = "wasm32-unknown-unknown"
+
+ at __dso_handle = external global i8*
+
+define i8** @get_optional() {
+  ret i8** @__dso_handle
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66768.217243.patch
Type: text/x-patch
Size: 1848 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190826/e4fb6c52/attachment.bin>


More information about the llvm-commits mailing list