1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.o
target triple = "wasm32-unknown-unknown"
@no_tls = global i32 0, align 4
@tls1 = thread_local(localexec) global i32 1, align 4
@tls2 = thread_local(localexec) global i32 1, align 4
define i32* @tls1_addr() {
ret i32* @tls1
}
define i32* @tls2_addr() {
ret i32* @tls2
}
define i32 @tls_align() {
%1 = call i32 @llvm.wasm.tls.align.i32()
ret i32 %1
}
declare i32 @llvm.wasm.tls.align.i32()
; 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: 66576
; __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: 8
; __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: 20002401200041004108FC0800000B
; Expected body of __wasm_init_tls:
; local.get 0
; global.set 1
; local.get 0
; i32.const 0
; i32.const 8
; 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 tls1_addr:
; global.get 1
; i32.const 4
; i32.add
; end
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: Locals: []
; CHECK-NEXT: Body: 2383808080000B
; Expected body of tls1_addr:
; global.get 3
; end
|