| # 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 |
| |