111 lines · plain
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 %s3; 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 %s4 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 %s7; 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 %s8 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 %s11target 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_base17 ; TLS-DAG: i32.const tls@TLSREL18 ; TLS-NEXT: i32.add19 ; TLS-NEXT: return20 21 ; NO-TLS-NEXT: i32.const tls22 ; NO-TLS-NEXT: return23 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)24 %r = ptrtoint ptr %p to i3225 ret i32 %r26}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_base32 ; TLS-DAG: i32.const tls_external@TLSREL33 ; TLS-NEXT: i32.add34 ; TLS-NEXT: return35 36 ; NO-TLS-NEXT: i32.const tls_external37 ; NO-TLS-NEXT: return38 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls_external)39 %r = ptrtoint ptr %p to i3240 ret i32 %r41}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_base47 ; TLS-DAG: i32.const tls@TLSREL48 ; TLS-NEXT: i32.add49 ; TLS-NEXT: return50 51 ; NO-TLS-NEXT: i32.const tls52 ; NO-TLS-NEXT: return53 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)54 ret ptr %p55}56 57; CHECK-LABEL: tls_load:58; CHECK-NEXT: .functype tls_load () -> (i32)59define i32 @tls_load() {60 ; TLS-DAG: global.get __tls_base61 ; TLS-DAG: i32.const tls@TLSREL62 ; TLS-NEXT: i32.add63 ; TLS-NEXT: i32.load 064 ; TLS-NEXT: return65 66 ; NO-TLS-NEXT: i32.const 067 ; NO-TLS-NEXT: i32.load tls68 ; NO-TLS-NEXT: return69 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)70 %tmp = load i32, ptr %p, align 471 ret i32 %tmp72}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_base78 ; TLS-DAG: i32.const tls@TLSREL79 ; TLS-NEXT: i32.add80 ; TLS-NEXT: i32.store 081 ; TLS-NEXT: return82 83 ; NO-TLS-NEXT: i32.const 084 ; NO-TLS-NEXT: i32.store tls85 ; NO-TLS-NEXT: return86 %p = call ptr @llvm.threadlocal.address.p0(ptr @tls)87 store i32 %x, ptr %p, align 488 ret void89}90 91; CHECK-LABEL: tls_size:92; CHECK-NEXT: .functype tls_size () -> (i32)93define i32 @tls_size() {94; CHECK-NEXT: global.get __tls_size95; CHECK-NEXT: return96 %1 = call i32 @llvm.wasm.tls.size.i32()97 ret i32 %198}99 100; CHECK: .type tls,@object101; TLS-NEXT: .section .tbss.tls,"T",@102; NO-TLS-NEXT: .section .bss.tls,"",@103; CHECK-NEXT: .p2align 2104; CHECK-NEXT: tls:105; CHECK-NEXT: .int32 0106@tls = internal thread_local[[TLS_MODE]] global i32 0107 108@tls_external = external thread_local[[TLS_MODE]] global i32, align 4109 110declare i32 @llvm.wasm.tls.size.i32()111