llvm/lld/test/wasm/tls-init-symbols.s

# 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@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_init_memory
# CHECK-NEXT:      - Index:           3
# CHECK-NEXT:        Name:            __wasm_apply_global_tls_relocs
# CHECK-NEXT:      - Index:           4
# 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  3
# 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