[lld][WebAssembly] Fix crash on un-used __tls_base symbol
authorSam Clegg <sbc@chromium.org>
Thu, 9 Sep 2021 15:55:08 +0000 (11:55 -0400)
committerSam Clegg <sbc@chromium.org>
Thu, 9 Sep 2021 16:45:58 +0000 (12:45 -0400)
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

lld/test/wasm/tls-non-shared-memory-basic.s [new file with mode: 0644]
lld/wasm/Driver.cpp
lld/wasm/Writer.cpp

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 (file)
index 0000000..8ef0173
--- /dev/null
@@ -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
index 7e0c030..9285baa 100644 (file)
@@ -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);
index eff5bf5..0adc971 100644 (file)
@@ -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);
       }