[PATCH] D121931: [lld][WebAssembly] Fix crash accessing non-live __tls_base symbol

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 17 14:02:44 PDT 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rGa04a5077140b: [lld][WebAssembly] Fix crash accessing non-live __tls_base symbol (authored by sbc100).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121931

Files:
  lld/test/wasm/tls_init_symbols.s
  lld/wasm/Writer.cpp


Index: lld/wasm/Writer.cpp
===================================================================
--- lld/wasm/Writer.cpp
+++ lld/wasm/Writer.cpp
@@ -1010,6 +1010,8 @@
         make<SyntheticFunction>(nullSignature,
                                 "__wasm_apply_global_tls_relocs"));
     WasmSym::applyGlobalTLSRelocs->markLive();
+    // TLS relocations depend on  the __tls_base symbols
+    WasmSym::tlsBase->markLive();
   }
 
   if (config->isPic ||
@@ -1438,6 +1440,7 @@
 
       writeU8(os, WASM_OPCODE_GLOBAL_SET, "global.set");
       writeUleb128(os, WasmSym::tlsBase->getGlobalIndex(), "global index");
+      WasmSym::tlsBase->markLive();
 
       // FIXME(wvo): this local needs to be I64 in wasm64, or we need an extend op.
       writeU8(os, WASM_OPCODE_LOCAL_GET, "local.get");
Index: lld/test/wasm/tls_init_symbols.s
===================================================================
--- /dev/null
+++ lld/test/wasm/tls_init_symbols.s
@@ -0,0 +1,69 @@
+# Regression test based on https://github.com/llvm/llvm-project/issues/54386
+# Test that that linker synthetic functions such as __wasm_tls_init and
+# __wasm_apply_global_tls_relocs can be created successfully in programs
+# that don't reference __tls_base or __wasm_tls_init.  These function both
+# reference __tls_base which need to be marks as alive if they are generated.
+
+# This is very basic TLS-using program that doesn't reference any of the
+# linker-generated symbols.
+
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld -no-gc-sections --shared-memory -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+# RUN: llvm-objdump -d --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DIS
+
+.globl _start
+_start:
+  .functype _start () -> (i32)
+  global.get tls_sym at GOT@TLS
+  end_function
+
+.section  .tdata.tls_sym,"",@
+.globl  tls_sym
+.p2align  2
+tls_sym:
+  .int32  1
+  .size tls_sym, 4
+
+.section  .custom_section.target_features,"",@
+  .int8 2
+  .int8 43
+  .int8 7
+  .ascii  "atomics"
+  .int8 43
+  .int8 11
+  .ascii  "bulk-memory"
+
+# CHECK:       - Type:            CUSTOM
+# CHECK-NEXT:    Name:            name
+# CHECK-NEXT:    FunctionNames:
+# CHECK-NEXT:      - Index:           0
+# CHECK-NEXT:        Name:            __wasm_call_ctors
+# CHECK-NEXT:      - Index:           1
+# CHECK-NEXT:        Name:            __wasm_init_tls
+# CHECK-NEXT:      - Index:           2
+# CHECK-NEXT:        Name:            __wasm_apply_global_tls_relocs
+# CHECK-NEXT:      - Index:           3
+# CHECK-NEXT:        Name:            _start
+
+# DIS:       <__wasm_init_tls>:
+# DIS:        local.get 0
+# DIS-NEXT:   global.set  1
+# DIS-NEXT:   local.get 0
+# DIS-NEXT:   i32.const 0
+# DIS-NEXT:   i32.const 4
+# DIS-NEXT:   memory.init 0, 0
+# DIS-NEXT:   call  2
+# DIS-NEXT:   end
+
+# DIS:      <__wasm_apply_global_tls_relocs>:
+# DIS:        global.get  1
+# DIS-NEXT:   i32.const 0
+# DIS-NEXT:   i32.add
+# DIS-NEXT:   global.set  4
+# DIS-NEXT:   end
+
+# DIS:      <_start>:
+# DIS:        global.get  4
+# DIS-NEXT:   end
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121931.416311.patch
Type: text/x-patch
Size: 3107 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220317/cbd685ad/attachment.bin>


More information about the llvm-commits mailing list