[lld] r368310 - [lld][WebAssembly] Add optional symbols after input file handling

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 8 09:58:36 PDT 2019


Author: sbc
Date: Thu Aug  8 09:58:36 2019
New Revision: 368310

URL: http://llvm.org/viewvc/llvm-project?rev=368310&view=rev
Log:
[lld][WebAssembly] Add optional symbols after input file handling

This allows undefined references in input files be resolved by the
optional symbols.  Previously we were doing this before input file
reading which means it was working only for command line symbols
references (i.e. -u or --export).

Also use addOptionalDataSymbol for __dso_handle and make all optional
symbols hidden by default.

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

Added:
    lld/trunk/test/wasm/optional-symbol.ll
Modified:
    lld/trunk/test/wasm/global-base.test
    lld/trunk/test/wasm/stack-first.test
    lld/trunk/wasm/Driver.cpp
    lld/trunk/wasm/SymbolTable.cpp
    lld/trunk/wasm/SymbolTable.h

Modified: lld/trunk/test/wasm/global-base.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/global-base.test?rev=368310&r1=368309&r2=368310&view=diff
==============================================================================
--- lld/trunk/test/wasm/global-base.test (original)
+++ lld/trunk/test/wasm/global-base.test Thu Aug  8 09:58:36 2019
@@ -24,11 +24,7 @@ CHECK-1024-NEXT:          Opcode:
 CHECK-1024-NEXT:          Value:           1024
 
 CHECK-1024:       - Type:            EXPORT
-CHECK-1024-NEXT:    Exports:
-CHECK-1024-NEXT:      - Name:            memory
-CHECK-1024-NEXT:        Kind:            MEMORY
-CHECK-1024-NEXT:        Index:           0
-CHECK-1024-NEXT:      - Name:            __data_end
+CHECK-1024:           - Name:            __data_end
 CHECK-1024-NEXT:        Kind:            GLOBAL
 CHECK-1024-NEXT:        Index:           1
 CHECK-1024-NEXT:      - Name:            __global_base
@@ -59,11 +55,7 @@ CHECK-16777216-NEXT:          Opcode:
 CHECK-16777216-NEXT:          Value:           16777216
 
 CHECK-16777216:       - Type:            EXPORT
-CHECK-16777216-NEXT:    Exports:
-CHECK-16777216-NEXT:      - Name:            memory
-CHECK-16777216-NEXT:        Kind:            MEMORY
-CHECK-16777216-NEXT:        Index:           0
-CHECK-16777216-NEXT:      - Name:            __data_end
+CHECK-16777216:           - Name:            __data_end
 CHECK-16777216-NEXT:        Kind:            GLOBAL
 CHECK-16777216-NEXT:        Index:           1
 CHECK-16777216-NEXT:      - Name:            __global_base

Added: lld/trunk/test/wasm/optional-symbol.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/optional-symbol.ll?rev=368310&view=auto
==============================================================================
--- lld/trunk/test/wasm/optional-symbol.ll (added)
+++ lld/trunk/test/wasm/optional-symbol.ll Thu Aug  8 09:58:36 2019
@@ -0,0 +1,14 @@
+; RUN: llc -filetype=obj -o %t.o %s
+; RUN: wasm-ld --export=get_handle %t.o -o %t.wasm
+
+target triple = "wasm32-unknown-unknown"
+
+ at __dso_handle = external global i8*
+
+define i8** @get_handle() {
+  ret i8** @__dso_handle
+}
+
+define void @_start() {
+  ret void
+}

Modified: lld/trunk/test/wasm/stack-first.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/stack-first.test?rev=368310&r1=368309&r2=368310&view=diff
==============================================================================
--- lld/trunk/test/wasm/stack-first.test (original)
+++ lld/trunk/test/wasm/stack-first.test Thu Aug  8 09:58:36 2019
@@ -32,12 +32,12 @@ CHECK-NEXT:     Exports:
 CHECK-NEXT:       - Name:            memory
 CHECK-NEXT:         Kind:            MEMORY
 CHECK-NEXT:         Index:           0
+CHECK-NEXT:       - Name:            _start
+CHECK-NEXT:         Kind:            FUNCTION
+CHECK-NEXT:         Index:           0
 CHECK-NEXT:       - Name:            __data_end
 CHECK-NEXT:         Kind:            GLOBAL
 CHECK-NEXT:         Index:           1
 CHECK-NEXT:       - Name:            __heap_base
 CHECK-NEXT:         Kind:            GLOBAL
 CHECK-NEXT:         Index:           2
-CHECK-NEXT:       - Name:            _start
-CHECK-NEXT:         Kind:            FUNCTION
-CHECK-NEXT:         Index:           0

Modified: lld/trunk/wasm/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=368310&r1=368309&r2=368310&view=diff
==============================================================================
--- lld/trunk/wasm/Driver.cpp (original)
+++ lld/trunk/wasm/Driver.cpp Thu Aug  8 09:58:36 2019
@@ -493,8 +493,6 @@ static void createSyntheticSymbols() {
     }
   }
 
-  if (!config->shared)
-    WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
 
   if (config->isPic) {
     WasmSym::stackPointer =
@@ -523,8 +521,6 @@ static void createSyntheticSymbols() {
     // See: https://github.com/WebAssembly/mutable-global
     WasmSym::stackPointer = symtab->addSyntheticGlobal(
         "__stack_pointer", WASM_SYMBOL_VISIBILITY_HIDDEN, stackPointer);
-    WasmSym::globalBase = symtab->addOptionalDataSymbol("__global_base");
-    WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
   }
 
   if (config->sharedMemory && !config->shared) {
@@ -535,9 +531,17 @@ static void createSyntheticSymbols() {
         "__wasm_init_tls", WASM_SYMBOL_VISIBILITY_HIDDEN,
         make<SyntheticFunction>(i32ArgSignature, "__wasm_init_tls"));
   }
+}
+
+static void createOptionalSymbols() {
+  if (!config->relocatable)
+    WasmSym::dsoHandle = symtab->addOptionalDataSymbol("__dso_handle");
 
-  WasmSym::dsoHandle = symtab->addSyntheticDataSymbol(
-      "__dso_handle", WASM_SYMBOL_VISIBILITY_HIDDEN);
+  if (!config->isPic) {
+    WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
+    WasmSym::globalBase = symtab->addOptionalDataSymbol("__global_base");
+    WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
+  }
 }
 
 // Reconstructs command line arguments so that so that you can re-run
@@ -720,6 +724,8 @@ 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());

Modified: lld/trunk/wasm/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/SymbolTable.cpp?rev=368310&r1=368309&r2=368310&view=diff
==============================================================================
--- lld/trunk/wasm/SymbolTable.cpp (original)
+++ lld/trunk/wasm/SymbolTable.cpp Thu Aug  8 09:58:36 2019
@@ -205,15 +205,15 @@ DefinedFunction *SymbolTable::addSynthet
 // Adds an optional, linker generated, data symbols.  The symbol will only be
 // added if there is an undefine reference to it, or if it is explictly exported
 // via the --export flag.  Otherwise we don't add the symbol and return nullptr.
-DefinedData *SymbolTable::addOptionalDataSymbol(StringRef name, uint32_t value,
-                                                uint32_t flags) {
+DefinedData *SymbolTable::addOptionalDataSymbol(StringRef name,
+                                                uint32_t value) {
   Symbol *s = find(name);
   if (!s && (config->exportAll || config->exportedSymbols.count(name) != 0))
     s = insertName(name).first;
   else if (!s || s->isDefined())
     return nullptr;
   LLVM_DEBUG(dbgs() << "addOptionalDataSymbol: " << name << "\n");
-  auto *rtn = replaceSymbol<DefinedData>(s, name, flags);
+  auto *rtn = replaceSymbol<DefinedData>(s, name, WASM_SYMBOL_VISIBILITY_HIDDEN);
   rtn->setVirtualAddress(value);
   rtn->referenced = true;
   return rtn;

Modified: lld/trunk/wasm/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/SymbolTable.h?rev=368310&r1=368309&r2=368310&view=diff
==============================================================================
--- lld/trunk/wasm/SymbolTable.h (original)
+++ lld/trunk/wasm/SymbolTable.h Thu Aug  8 09:58:36 2019
@@ -77,8 +77,7 @@ public:
                                     InputGlobal *global);
   DefinedFunction *addSyntheticFunction(StringRef name, uint32_t flags,
                                         InputFunction *function);
-  DefinedData *addOptionalDataSymbol(StringRef name, uint32_t value = 0,
-                                     uint32_t flags = 0);
+  DefinedData *addOptionalDataSymbol(StringRef name, uint32_t value = 0);
 
   void handleSymbolVariants();
   void handleWeakUndefines();




More information about the llvm-commits mailing list