[lld] 6355234 - [lld][WebAssembly] Fix crash on un-used __tls_base symbol

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 9 09:46:29 PDT 2021


Author: Sam Clegg
Date: 2021-09-09T12:45:58-04:00
New Revision: 6355234660551e7562e2ace512ccaefacbbb9065

URL: https://github.com/llvm/llvm-project/commit/6355234660551e7562e2ace512ccaefacbbb9065
DIFF: https://github.com/llvm/llvm-project/commit/6355234660551e7562e2ace512ccaefacbbb9065.diff

LOG: [lld][WebAssembly] Fix crash on un-used __tls_base symbol

In the case that TLS is used in the single-threaded program, and
therefore effectively lowered away, we still optionally create a
`__tls_base` symbols, but the code for setting it was assuming it was
always created.

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

Added: 
    lld/test/wasm/tls-non-shared-memory-basic.s

Modified: 
    lld/wasm/Driver.cpp
    lld/wasm/Writer.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/tls-non-shared-memory-basic.s b/lld/test/wasm/tls-non-shared-memory-basic.s
new file mode 100644
index 000000000000..8ef0173ba72d
--- /dev/null
+++ b/lld/test/wasm/tls-non-shared-memory-basic.s
@@ -0,0 +1,63 @@
+# Simplified version of tls-non-shared-memory.s that does not reference
+# __tls_base
+
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+
+.section  .tdata.tls1,"",@
+.globl  tls1
+.p2align  2
+tls1:
+  .int32  43
+  .size tls1, 2
+
+.section  .custom_section.target_features,"",@
+  .int8 2
+  .int8 43
+  .int8 7
+  .ascii  "atomics"
+  .int8 43
+  .int8 11
+  .ascii  "bulk-memory"
+
+# RUN: wasm-ld --no-gc-sections --no-entry -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# RUN: wasm-ld --experimental-pic -shared -o %t.so %t.o
+# RUN: obj2yaml %t.so | FileCheck %s --check-prefix=PIC
+
+#      CHECK:  - Type:            DATA
+# CHECK-NEXT:    Segments:
+# CHECK-NEXT:      - SectionOffset:   7
+# CHECK-NEXT:        InitFlags:       0
+# CHECK-NEXT:        Offset:
+# CHECK-NEXT:          Opcode:          I32_CONST
+# CHECK-NEXT:          Value:           1024
+# CHECK-NEXT:        Content:         2B000000
+# CHECK-NEXT:  - Type:            CUSTOM
+# CHECK-NOT:   - Type:            IMPORT
+
+
+# In PIC mode we expect TLS data and non-TLS data to be merged into
+# a single segment which is initialized via the  __memory_base import
+
+#      PIC:  - Type:            IMPORT
+# PIC-NEXT:    Imports:
+# PIC-NEXT:      - Module:          env
+# PIC-NEXT:        Field:           memory
+# PIC-NEXT:        Kind:            MEMORY
+# PIC-NEXT:        Memory:
+# PIC-NEXT:          Minimum:         0x1
+# PIC-NEXT:      - Module:          env
+# PIC-NEXT:        Field:           __memory_base
+# PIC-NEXT:        Kind:            GLOBAL
+# PIC-NEXT:        GlobalType:      I32
+
+#      PIC:  - Type:            DATA
+# PIC-NEXT:    Segments:
+# PIC-NEXT:      - SectionOffset:   6
+# PIC-NEXT:        InitFlags:       0
+# PIC-NEXT:        Offset:
+# PIC-NEXT:          Opcode:          GLOBAL_GET
+# PIC-NEXT:          Index:           0
+# PIC-NEXT:        Content:         2B000000
+# PIC-NEXT:  - Type:            CUSTOM

diff  --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 7e0c030482fb..9285baab9642 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -651,7 +651,7 @@ static void createSyntheticSymbols() {
     WasmSym::stackPointer->markLive();
   }
 
-  if (config->sharedMemory && !config->relocatable) {
+  if (config->sharedMemory) {
     WasmSym::tlsBase = createGlobalVariable("__tls_base", true);
     WasmSym::tlsSize = createGlobalVariable("__tls_size", false);
     WasmSym::tlsAlign = createGlobalVariable("__tls_align", false);

diff  --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index eff5bf5b4213..0adc971b499c 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -278,7 +278,7 @@ void Writer::layoutMemory() {
 
         auto *tlsAlign = cast<DefinedGlobal>(WasmSym::tlsAlign);
         setGlobalPtr(tlsAlign, int64_t{1} << seg->alignment);
-      } else {
+      } else if (WasmSym::tlsBase) {
         auto *tlsBase = cast<DefinedGlobal>(WasmSym::tlsBase);
         setGlobalPtr(tlsBase, memoryPtr);
       }


        


More information about the llvm-commits mailing list