[PATCH] D111171: [lld][WebAssembly] Create optional internal symbols only after LTO object as been added

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 5 13:31:59 PDT 2021


sbc100 updated this revision to Diff 377338.
sbc100 edited the summary of this revision.
sbc100 added a comment.

- fix test


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111171/new/

https://reviews.llvm.org/D111171

Files:
  lld/test/wasm/lto/tls.ll
  lld/wasm/Driver.cpp
  lld/wasm/SymbolTable.cpp


Index: lld/wasm/SymbolTable.cpp
===================================================================
--- lld/wasm/SymbolTable.cpp
+++ lld/wasm/SymbolTable.cpp
@@ -258,11 +258,11 @@
 
 DefinedGlobal *SymbolTable::addOptionalGlobalSymbol(StringRef name,
                                                     InputGlobal *global) {
-  LLVM_DEBUG(dbgs() << "addOptionalGlobalSymbol: " << name << " -> " << global
-                    << "\n");
   Symbol *s = find(name);
   if (!s || s->isDefined())
     return nullptr;
+  LLVM_DEBUG(dbgs() << "addOptionalGlobalSymbol: " << name << " -> " << global
+                    << "\n");
   syntheticGlobals.emplace_back(global);
   return replaceSymbol<DefinedGlobal>(s, name, WASM_SYMBOL_VISIBILITY_HIDDEN,
                                       nullptr, global);
Index: lld/wasm/Driver.cpp
===================================================================
--- lld/wasm/Driver.cpp
+++ lld/wasm/Driver.cpp
@@ -947,8 +947,6 @@
     }
   }
 
-  createOptionalSymbols();
-
   if (errorCount())
     return;
 
@@ -976,6 +974,8 @@
   if (errorCount())
     return;
 
+  createOptionalSymbols();
+
   // Resolve any variant symbols that were created due to signature
   // mismatchs.
   symtab->handleSymbolVariants();
Index: lld/test/wasm/lto/tls.ll
===================================================================
--- /dev/null
+++ lld/test/wasm/lto/tls.ll
@@ -0,0 +1,45 @@
+; Test that LTO objects build with TLS and threading support can be linked into
+; a single threaded binary.  Specifically the references to `__tls_base` that
+; can be generated at LTO-time need to trigger the creation of the internal/fake
+; `__tls_base` symbol in the linker.
+
+; RUN: llvm-as %s -o %t1.o
+; RUN: wasm-ld --export=tls_int --export=get_tls %t1.o -o %t
+; RUN: obj2yaml %t | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-f128:64-n32:64-S128-ni:1:10:20"
+target triple = "wasm32-unknown-emscripten"
+
+ at tls_int = dso_local thread_local global i32 99
+
+define i32 @get_tls() #0 {
+  %val = load i32, i32* @tls_int
+  ret i32 %val
+}
+
+define void @_start() #0 {
+  ret void
+}
+
+attributes #0 = { noinline nounwind optnone "target-features"="+atomics,+bulk-memory,+mutable-globals,+sign-ext" }
+
+;      CHECK:   - Type:            GLOBAL
+; CHECK-NEXT:     Globals:
+; CHECK-NEXT:       - Index:           0
+; CHECK-NEXT:         Type:            I32
+; CHECK-NEXT:         Mutable:         true
+; CHECK-NEXT:         InitExpr:
+; CHECK-NEXT:           Opcode:          I32_CONST
+; CHECK-NEXT:           Value:           66576
+; CHECK-NEXT:       - Index:           1
+; CHECK-NEXT:         Type:            I32
+; CHECK-NEXT:         Mutable:         false
+; CHECK-NEXT:         InitExpr:
+; CHECK-NEXT:           Opcode:          I32_CONST
+; CHECK-NEXT:           Value:           1024
+
+;      CHECK:     GlobalNames:
+; CHECK-NEXT:       - Index:           0
+; CHECK-NEXT:         Name:            __stack_pointer
+; CHECK-NEXT:       - Index:           1
+; CHECK-NEXT:         Name:            __tls_base


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111171.377338.patch
Type: text/x-patch
Size: 3066 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211005/949a048a/attachment.bin>


More information about the llvm-commits mailing list