[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / ptrauth-arm64-tls-dynamics.ll
blob89731e62dcc1e4b9893284c9bc78647fafcaace8
1 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \
2 ; RUN:   -verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \
4 ; RUN:   -filetype=obj < %s | llvm-readelf -r -s - | FileCheck --check-prefix=CHECK-OBJ %s
5 ; RUN: not --crash llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \
6 ; RUN:   -global-isel=1 < %s 2>&1 | FileCheck --check-prefix=CHECK-ERR %s
8 @general_dynamic_var = external thread_local global i32
10 define i32 @test_generaldynamic() {
11 ; CHECK-LABEL: test_generaldynamic:
13   %val = load i32, ptr @general_dynamic_var
14   ret i32 %val
16 ; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc_auth:general_dynamic_var
17 ; CHECK-NEXT: ldr x16, [x[[TLSDESC_HI]], :tlsdesc_auth_lo12:general_dynamic_var]
18 ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_auth_lo12:general_dynamic_var
19 ; CHECK-NEXT: blraa x16, x0
20 ; CHECK-NEXT: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0
21 ; CHECK-NEXT: ldr w0, [x[[TPIDR]], x0]
23 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADR_PAGE21
24 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12
25 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12
26 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL
28 ; CHECK-ERR: LLVM ERROR: cannot select: %1:gpr64sp(p0) = G_GLOBAL_VALUE @general_dynamic_var (in function: test_generaldynamic)
31 define ptr @test_generaldynamic_addr() {
32 ; CHECK-LABEL: test_generaldynamic_addr:
34   ret ptr @general_dynamic_var
36 ; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc_auth:general_dynamic_var
37 ; CHECK-NEXT: ldr x16, [x[[TLSDESC_HI]], :tlsdesc_auth_lo12:general_dynamic_var]
38 ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_auth_lo12:general_dynamic_var
39 ; CHECK-NEXT: blraa x16, x0
40 ; CHECK-NEXT: mrs [[TP:x[0-9]+]], TPIDR_EL0
41 ; CHECK-NEXT: add x0, [[TP]], x0
43 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADR_PAGE21
44 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12
45 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12
46 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL
49 ;; Note: with signed TLSDESC, general dynamic model is always used,
50 ;; even when local dynamic is requested.
52 @local_dynamic_var = external thread_local(localdynamic) global i32
54 define i32 @test_localdynamic() {
55 ; CHECK-LABEL: test_localdynamic:
57   %val = load i32, ptr @local_dynamic_var
58   ret i32 %val
60 ; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc_auth:local_dynamic_var
61 ; CHECK-NEXT: ldr x16, [x[[TLSDESC_HI]], :tlsdesc_auth_lo12:local_dynamic_var]
62 ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_auth_lo12:local_dynamic_var
63 ; CHECK-NEXT: blraa x16, x0
64 ; CHECK-NEXT: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0
65 ; CHECK-NEXT: ldr w0, [x[[TPIDR]], x0]
67 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADR_PAGE21
68 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12
69 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12
70 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL
73 define ptr @test_localdynamic_addr() {
74 ; CHECK-LABEL: test_localdynamic_addr:
76   ret ptr @local_dynamic_var
78 ; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc_auth:local_dynamic_var
79 ; CHECK-NEXT: ldr x16, [x[[TLSDESC_HI]], :tlsdesc_auth_lo12:local_dynamic_var]
80 ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_auth_lo12:local_dynamic_var
81 ; CHECK-NEXT: blraa x16, x0
82 ; CHECK-NEXT: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0
83 ; CHECK-NEXT: add x0, x[[TPIDR]], x0
85 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADR_PAGE21
86 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12
87 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12
88 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL
91 @extern_weak_var = extern_weak thread_local global i32
93 define i32 @test_extern_weak() {
94 ; CHECK-LABEL: test_extern_weak:
96   %val = load i32, ptr @extern_weak_var
97   ret i32 %val
99 ; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc_auth:extern_weak_var
100 ; CHECK-NEXT: ldr x16, [x[[TLSDESC_HI]], :tlsdesc_auth_lo12:extern_weak_var]
101 ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_auth_lo12:extern_weak_var
102 ; CHECK-NEXT: blraa x16, x0
103 ; CHECK-NEXT: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0
104 ; CHECK-NEXT: ldr w0, [x[[TPIDR]], x0]
106 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADR_PAGE21
107 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12
108 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12
109 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL
110 ; CHECK-OBJ: 0000000000000000     0 TLS     WEAK   DEFAULT   UND extern_weak_var
113 !llvm.module.flags = !{!0}
114 !0 = !{i32 8, !"ptrauth-elf-got", i32 1}