| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s |
| |
| .section data,"",@ |
| .int32 41 |
| data_sym: |
| .int32 42 |
| .size data_sym, 4 |
| |
| # TLS data section of size 16 with as relocations at offset 8 and 12 |
| .section tls_sec,"T",@ |
| .globl tls_sym |
| .p2align 2 |
| .int32 0x50 |
| tls_sym: |
| .int32 0x51 |
| .int32 data_sym |
| .int32 tls_sym |
| .size tls_sym, 4 |
| |
| .section .custom_section.target_features,"",@ |
| .int8 2 |
| .int8 43 |
| .int8 7 |
| .ascii "atomics" |
| .int8 43 |
| .int8 11 |
| .ascii "bulk-memory" |
| |
| # RUN: wasm-ld --experimental-pic -pie -no-gc-sections --shared-memory --no-entry -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 --check-prefix=ASM %s -- |
| |
| # CHECK: - Type: GLOBAL |
| |
| # __tls_base |
| # CHECK-NEXT: Globals: |
| # CHECK-NEXT: - Index: 3 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: true |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 0 |
| |
| # __tls_size |
| # CHECK-NEXT: - Index: 4 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: false |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 16 |
| |
| # __tls_align |
| # CHECK-NEXT: - Index: 5 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: false |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 4 |
| |
| # ASM: <__wasm_init_tls>: |
| # ASM-EMPTY: |
| # ASM-NEXT: local.get 0 |
| # ASM-NEXT: global.set 3 |
| # ASM-NEXT: local.get 0 |
| # ASM-NEXT: i32.const 0 |
| # ASM-NEXT: i32.const 16 |
| # ASM-NEXT: memory.init 0, 0 |
| # call to __wasm_apply_tls_relocs |
| # ASM-NEXT: call 4 |
| # ASM-NEXT: end |
| |
| # ASM: <__wasm_apply_tls_relocs>: |
| # ASM-EMPTY: |
| # ASM-NEXT: i32.const 8 |
| # ASM-NEXT: global.get 3 |
| # ASM-NEXT: i32.add |
| # ASM-NEXT: global.get 1 |
| # ASM-NEXT: i32.const 20 |
| # ASM-NEXT: i32.add |
| # ASM-NEXT: i32.store 0 |
| # ASM-NEXT: i32.const 12 |
| # ASM-NEXT: global.get 3 |
| # ASM-NEXT: i32.add |
| # ASM-NEXT: global.get 3 |
| # ASM-NEXT: i32.const 4 |
| # ASM-NEXT: i32.add |
| # ASM-NEXT: i32.store 0 |
| # ASM-NEXT: end |