1; Run the tests with the `localexec` TLS mode specified. 2; RUN: sed -e 's/\[\[TLS_MODE\]\]/(localexec)/' %s | llc -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+bulk-memory,atomics - | FileCheck --check-prefixes=CHECK,TLS %s 3; RUN: sed -e 's/\[\[TLS_MODE\]\]/(localexec)/' %s | llc -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+bulk-memory,atomics -fast-isel - | FileCheck --check-prefixes=CHECK,TLS %s 4 5; Also, run the same tests without a specified TLS mode--this should still emit `localexec` code on non-Emscripten targtes which don't currently support dynamic linking. 6; RUN: sed -e 's/\[\[TLS_MODE\]\]//' %s | llc -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+bulk-memory,atomics - | FileCheck --check-prefixes=CHECK,TLS %s 7; RUN: sed -e 's/\[\[TLS_MODE\]\]//' %s | llc -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+bulk-memory,atomics -fast-isel - | FileCheck --check-prefixes=CHECK,TLS %s 8 9; Finally, when bulk memory is disabled, no TLS code should be generated. 10; RUN: sed -e 's/\[\[TLS_MODE\]\]/(localexec)/' %s | llc -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=-bulk-memory,atomics - | FileCheck --check-prefixes=CHECK,NO-TLS %s 11target triple = "wasm32-unknown-unknown" 12 13; CHECK-LABEL: address_of_tls: 14; CHECK-NEXT: .functype address_of_tls () -> (i32) 15define i32 @address_of_tls() { 16 ; TLS-DAG: global.get __tls_base 17 ; TLS-DAG: i32.const tls@TLSREL 18 ; TLS-NEXT: i32.add 19 ; TLS-NEXT: return 20 21 ; NO-TLS-NEXT: i32.const tls 22 ; NO-TLS-NEXT: return 23 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls) 24 %r = ptrtoint ptr %p to i32 25 ret i32 %r 26} 27 28; CHECK-LABEL: address_of_tls_external: 29; CHECK-NEXT: .functype address_of_tls_external () -> (i32) 30define i32 @address_of_tls_external() { 31 ; TLS-DAG: global.get __tls_base 32 ; TLS-DAG: i32.const tls_external@TLSREL 33 ; TLS-NEXT: i32.add 34 ; TLS-NEXT: return 35 36 ; NO-TLS-NEXT: i32.const tls_external 37 ; NO-TLS-NEXT: return 38 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external) 39 %r = ptrtoint ptr %p to i32 40 ret i32 %r 41} 42 43; CHECK-LABEL: ptr_to_tls: 44; CHECK-NEXT: .functype ptr_to_tls () -> (i32) 45define ptr @ptr_to_tls() { 46 ; TLS-DAG: global.get __tls_base 47 ; TLS-DAG: i32.const tls@TLSREL 48 ; TLS-NEXT: i32.add 49 ; TLS-NEXT: return 50 51 ; NO-TLS-NEXT: i32.const tls 52 ; NO-TLS-NEXT: return 53 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls) 54 ret ptr %p 55} 56 57; CHECK-LABEL: tls_load: 58; CHECK-NEXT: .functype tls_load () -> (i32) 59define i32 @tls_load() { 60 ; TLS-DAG: global.get __tls_base 61 ; TLS-DAG: i32.const tls@TLSREL 62 ; TLS-NEXT: i32.add 63 ; TLS-NEXT: i32.load 0 64 ; TLS-NEXT: return 65 66 ; NO-TLS-NEXT: i32.const 0 67 ; NO-TLS-NEXT: i32.load tls 68 ; NO-TLS-NEXT: return 69 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls) 70 %tmp = load i32, ptr %p, align 4 71 ret i32 %tmp 72} 73 74; CHECK-LABEL: tls_store: 75; CHECK-NEXT: .functype tls_store (i32) -> () 76define void @tls_store(i32 %x) { 77 ; TLS-DAG: global.get __tls_base 78 ; TLS-DAG: i32.const tls@TLSREL 79 ; TLS-NEXT: i32.add 80 ; TLS-NEXT: i32.store 0 81 ; TLS-NEXT: return 82 83 ; NO-TLS-NEXT: i32.const 0 84 ; NO-TLS-NEXT: i32.store tls 85 ; NO-TLS-NEXT: return 86 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls) 87 store i32 %x, ptr %p, align 4 88 ret void 89} 90 91; CHECK-LABEL: tls_size: 92; CHECK-NEXT: .functype tls_size () -> (i32) 93define i32 @tls_size() { 94; CHECK-NEXT: global.get __tls_size 95; CHECK-NEXT: return 96 %1 = call i32 @llvm.wasm.tls.size.i32() 97 ret i32 %1 98} 99 100; CHECK: .type tls,@object 101; TLS-NEXT: .section .tbss.tls,"T",@ 102; NO-TLS-NEXT: .section .bss.tls,"",@ 103; CHECK-NEXT: .p2align 2 104; CHECK-NEXT: tls: 105; CHECK-NEXT: .int32 0 106@tls = internal thread_local[[TLS_MODE]] global i32 0 107 108@tls_external = external thread_local[[TLS_MODE]] global i32, align 4 109 110declare i32 @llvm.wasm.tls.size.i32() 111