| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s |
| |
| .globaltype __tls_base, i32 |
| .globaltype __tls_align, i32, immutable |
| |
| .globl tls1_addr |
| tls1_addr: |
| .functype tls1_addr () -> (i32) |
| global.get __tls_base |
| i32.const tls1@TLSREL |
| i32.add |
| end_function |
| |
| .globl tls2_addr |
| tls2_addr: |
| .functype tls2_addr () -> (i32) |
| global.get __tls_base |
| i32.const tls2@TLSREL |
| i32.add |
| end_function |
| |
| .globl tls3_addr |
| tls3_addr: |
| .functype tls3_addr () -> (i32) |
| global.get __tls_base |
| i32.const tls3 |
| i32.add |
| end_function |
| |
| .globl tls_align |
| tls_align: |
| .functype tls_align () -> (i32) |
| global.get __tls_align |
| end_function |
| |
| .section .bss.no_tls,"",@ |
| .globl no_tls |
| .p2align 2 |
| no_tls: |
| .int32 0 |
| .size no_tls, 4 |
| |
| .section .tdata.tls1,"",@ |
| .globl tls1 |
| .p2align 2 |
| tls1: |
| .int32 1 |
| .size tls1, 4 |
| |
| .section .tdata.tls2,"",@ |
| .globl tls2 |
| .p2align 2 |
| tls2: |
| .int32 1 |
| .size tls2, 4 |
| |
| .section .tbss.tls3,"",@ |
| .globl tls3 |
| .p2align 2 |
| tls3: |
| .int32 0 |
| .size tls3, 4 |
| |
| .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 --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o |
| # RUN: obj2yaml %t.wasm | FileCheck %s |
| |
| # RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t.wasm %t.o |
| # RUN: obj2yaml %t.wasm | FileCheck %s |
| |
| # CHECK: - Type: GLOBAL |
| # CHECK-NEXT: Globals: |
| # CHECK-NEXT: - Index: 0 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: true |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 66592 |
| |
| # __tls_base |
| # CHECK-NEXT: - Index: 1 |
| # 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: 2 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: false |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 12 |
| |
| # __tls_align |
| # CHECK-NEXT: - Index: 3 |
| # CHECK-NEXT: Type: I32 |
| # CHECK-NEXT: Mutable: false |
| # CHECK-NEXT: InitExpr: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 4 |
| |
| |
| # CHECK: - Type: CODE |
| # CHECK-NEXT: Functions: |
| # Skip __wasm_call_ctors and __wasm_init_memory |
| # CHECK: - Index: 2 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 2000240120004100410CFC0800000B |
| |
| # Expected body of __wasm_init_tls: |
| # local.get 0 |
| # global.set 1 |
| # local.get 0 |
| # i32.const 0 |
| # i32.const 12 |
| # memory.init 1, 0 |
| # end |
| |
| # CHECK-NEXT: - Index: 3 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 2381808080004180808080006A0B |
| |
| # Expected body of tls1_addr: |
| # global.get 1 |
| # i32.const 0 |
| # i32.add |
| # end |
| |
| # CHECK-NEXT: - Index: 4 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 2381808080004184808080006A0B |
| |
| # Expected body of tls2_addr: |
| # global.get 1 |
| # i32.const 4 |
| # i32.add |
| # end |
| |
| # CHECK-NEXT: - Index: 5 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 2381808080004188808080006A0B |
| |
| # Expected body of tls3_addr: |
| # global.get 1 |
| # i32.const 4 |
| # i32.add |
| # end |
| |
| # CHECK-NEXT: - Index: 6 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 2383808080000B |
| |
| # Expected body of tls_align: |
| # global.get 3 |
| # end |