xref: /llvm-project/llvm/test/CodeGen/AArch64/sign-return-address-pauth-lr.ll (revision 0b73b5af60f2c544892b9dd68b4fa43eeff52fc1)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2
3; PauthLR is controlled via a combination of -mbranch-protection and +pauth-lr.
4; -mbranch-protection=+pc enables branch protection. If the feature +pauth-lr
5; is available (v9.5a onwards) then non-NOP instructions are used; otherwise
6; NOP instructions are used.
7
8; There are 6 cases to cover:
9
10; feature \ -mbranch-protection= |    none    | pac-ret |   pac-ret+pc
11; ------------------------------------------------------------------------
12; without +pauth-lr              | no codegen | old pac |     NOP pauth-lr
13;    with +pauth-lr              | no codegen | old pac | non-NOP pauth-lr
14
15; sign-return-address.ll tests combinations of -mbranch-protection=none/pac-ret
16; and whether +pauth-lr is present or not.
17
18; sign-return-address-pauth-lr.ll is identical, with the addition of the function
19; attribute, which enables -mbranch-protection=pac-ret+pc, and therefore tests
20; the remaining parameter combinations in the table:
21
22; RUN: llc -mtriple=aarch64              < %s | FileCheck --check-prefixes=CHECK,COMPAT %s
23; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,V83A %s
24; RUN: llc -mtriple=aarch64 -mattr=v9a -mattr=pauth-lr < %s | FileCheck --check-prefixes=PAUTHLR %s
25
26define i32 @leaf(i32 %x) "branch-protection-pauth-lr" {
27; CHECK-LABEL: leaf:
28; CHECK:       // %bb.0:
29; CHECK-NEXT:    ret
30;
31; PAUTHLR-LABEL: leaf:
32; PAUTHLR:       // %bb.0:
33; PAUTHLR-NEXT:    ret
34  ret i32 %x
35}
36
37define i32 @leaf_sign_none(i32 %x) "branch-protection-pauth-lr"   {
38; CHECK-LABEL: leaf_sign_none:
39; CHECK:       // %bb.0:
40; CHECK-NEXT:    ret
41;
42; PAUTHLR-LABEL: leaf_sign_none:
43; PAUTHLR:       // %bb.0:
44; PAUTHLR-NEXT:    ret
45  ret i32 %x
46}
47
48define i32 @leaf_sign_non_leaf(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="non-leaf"  {
49; CHECK-LABEL: leaf_sign_non_leaf:
50; CHECK:       // %bb.0:
51; CHECK-NEXT:    ret
52;
53; PAUTHLR-LABEL: leaf_sign_non_leaf:
54; PAUTHLR:       // %bb.0:
55; PAUTHLR-NEXT:    ret
56  ret i32 %x
57}
58
59define i32 @leaf_sign_all(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" {
60; COMPAT-LABEL: leaf_sign_all:
61; COMPAT:       // %bb.0:
62; COMPAT-NEXT:    hint #39
63; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
64; COMPAT-NEXT:  .Ltmp0:
65; COMPAT-NEXT:    hint #25
66; COMPAT-NEXT:    adrp x16, .Ltmp0
67; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp0
68; COMPAT-NEXT:    hint #39
69; COMPAT-NEXT:    hint #29
70; COMPAT-NEXT:    ret
71;
72; V83A-LABEL: leaf_sign_all:
73; V83A:       // %bb.0:
74; V83A-NEXT:    hint #39
75; V83A-NEXT:    .cfi_negate_ra_state_with_pc
76; V83A-NEXT:  .Ltmp0:
77; V83A-NEXT:    paciasp
78; V83A-NEXT:    adrp x16, .Ltmp0
79; V83A-NEXT:    add x16, x16, :lo12:.Ltmp0
80; V83A-NEXT:    hint #39
81; V83A-NEXT:    retaa
82;
83; PAUTHLR-LABEL: leaf_sign_all:
84; PAUTHLR:       // %bb.0:
85; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
86; PAUTHLR-NEXT:  .Ltmp0:
87; PAUTHLR-NEXT:    paciasppc
88; PAUTHLR-NEXT:    adrp x16, .Ltmp0
89; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp0
90; PAUTHLR-NEXT:    retaasppc .Ltmp0
91  ret i32 %x
92}
93
94define i64 @leaf_clobbers_lr(i64 %x) "branch-protection-pauth-lr" "sign-return-address"="non-leaf"  {
95; COMPAT-LABEL: leaf_clobbers_lr:
96; COMPAT:       // %bb.0:
97; COMPAT-NEXT:    hint #39
98; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
99; COMPAT-NEXT:  .Ltmp1:
100; COMPAT-NEXT:    hint #25
101; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
102; COMPAT-NEXT:    .cfi_def_cfa_offset 16
103; COMPAT-NEXT:    .cfi_offset w30, -16
104; COMPAT-NEXT:    //APP
105; COMPAT-NEXT:    mov x30, x0
106; COMPAT-NEXT:    //NO_APP
107; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
108; COMPAT-NEXT:    adrp x16, .Ltmp1
109; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp1
110; COMPAT-NEXT:    hint #39
111; COMPAT-NEXT:    hint #29
112; COMPAT-NEXT:    ret
113;
114; V83A-LABEL: leaf_clobbers_lr:
115; V83A:       // %bb.0:
116; V83A-NEXT:    hint #39
117; V83A-NEXT:    .cfi_negate_ra_state_with_pc
118; V83A-NEXT:  .Ltmp1:
119; V83A-NEXT:    paciasp
120; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
121; V83A-NEXT:    .cfi_def_cfa_offset 16
122; V83A-NEXT:    .cfi_offset w30, -16
123; V83A-NEXT:    //APP
124; V83A-NEXT:    mov x30, x0
125; V83A-NEXT:    //NO_APP
126; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
127; V83A-NEXT:    adrp x16, .Ltmp1
128; V83A-NEXT:    add x16, x16, :lo12:.Ltmp1
129; V83A-NEXT:    hint #39
130; V83A-NEXT:    retaa
131;
132; PAUTHLR-LABEL: leaf_clobbers_lr:
133; PAUTHLR:       // %bb.0:
134; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
135; PAUTHLR-NEXT:  .Ltmp1:
136; PAUTHLR-NEXT:    paciasppc
137; PAUTHLR-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
138; PAUTHLR-NEXT:    .cfi_def_cfa_offset 16
139; PAUTHLR-NEXT:    .cfi_offset w30, -16
140; PAUTHLR-NEXT:    //APP
141; PAUTHLR-NEXT:    mov x30, x0
142; PAUTHLR-NEXT:    //NO_APP
143; PAUTHLR-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
144; PAUTHLR-NEXT:    adrp x16, .Ltmp1
145; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp1
146; PAUTHLR-NEXT:    retaasppc .Ltmp1
147  call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
148  ret i64 %x
149}
150
151declare i32 @foo(i32)
152
153define i32 @non_leaf_sign_all(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" {
154; COMPAT-LABEL: non_leaf_sign_all:
155; COMPAT:       // %bb.0:
156; COMPAT-NEXT:    hint #39
157; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
158; COMPAT-NEXT:  .Ltmp2:
159; COMPAT-NEXT:    hint #25
160; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
161; COMPAT-NEXT:    .cfi_def_cfa_offset 16
162; COMPAT-NEXT:    .cfi_offset w30, -16
163; COMPAT-NEXT:    bl foo
164; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
165; COMPAT-NEXT:    adrp x16, .Ltmp2
166; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp2
167; COMPAT-NEXT:    hint #39
168; COMPAT-NEXT:    hint #29
169; COMPAT-NEXT:    ret
170;
171; V83A-LABEL: non_leaf_sign_all:
172; V83A:       // %bb.0:
173; V83A-NEXT:    hint #39
174; V83A-NEXT:    .cfi_negate_ra_state_with_pc
175; V83A-NEXT:  .Ltmp2:
176; V83A-NEXT:    paciasp
177; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
178; V83A-NEXT:    .cfi_def_cfa_offset 16
179; V83A-NEXT:    .cfi_offset w30, -16
180; V83A-NEXT:    bl foo
181; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
182; V83A-NEXT:    adrp x16, .Ltmp2
183; V83A-NEXT:    add x16, x16, :lo12:.Ltmp2
184; V83A-NEXT:    hint #39
185; V83A-NEXT:    retaa
186;
187; PAUTHLR-LABEL: non_leaf_sign_all:
188; PAUTHLR:       // %bb.0:
189; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
190; PAUTHLR-NEXT:  .Ltmp2:
191; PAUTHLR-NEXT:    paciasppc
192; PAUTHLR-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
193; PAUTHLR-NEXT:    .cfi_def_cfa_offset 16
194; PAUTHLR-NEXT:    .cfi_offset w30, -16
195; PAUTHLR-NEXT:    bl foo
196; PAUTHLR-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
197; PAUTHLR-NEXT:    adrp x16, .Ltmp2
198; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp2
199; PAUTHLR-NEXT:    retaasppc .Ltmp2
200  %call = call i32 @foo(i32 %x)
201  ret i32 %call
202}
203
204define i32 @non_leaf_sign_non_leaf(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="non-leaf"  {
205; COMPAT-LABEL: non_leaf_sign_non_leaf:
206; COMPAT:       // %bb.0:
207; COMPAT-NEXT:    hint #39
208; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
209; COMPAT-NEXT:  .Ltmp3:
210; COMPAT-NEXT:    hint #25
211; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
212; COMPAT-NEXT:    .cfi_def_cfa_offset 16
213; COMPAT-NEXT:    .cfi_offset w30, -16
214; COMPAT-NEXT:    bl foo
215; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
216; COMPAT-NEXT:    adrp x16, .Ltmp3
217; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp3
218; COMPAT-NEXT:    hint #39
219; COMPAT-NEXT:    hint #29
220; COMPAT-NEXT:    ret
221;
222; V83A-LABEL: non_leaf_sign_non_leaf:
223; V83A:       // %bb.0:
224; V83A-NEXT:    hint #39
225; V83A-NEXT:    .cfi_negate_ra_state_with_pc
226; V83A-NEXT:  .Ltmp3:
227; V83A-NEXT:    paciasp
228; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
229; V83A-NEXT:    .cfi_def_cfa_offset 16
230; V83A-NEXT:    .cfi_offset w30, -16
231; V83A-NEXT:    bl foo
232; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
233; V83A-NEXT:    adrp x16, .Ltmp3
234; V83A-NEXT:    add x16, x16, :lo12:.Ltmp3
235; V83A-NEXT:    hint #39
236; V83A-NEXT:    retaa
237;
238; PAUTHLR-LABEL: non_leaf_sign_non_leaf:
239; PAUTHLR:       // %bb.0:
240; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
241; PAUTHLR-NEXT:  .Ltmp3:
242; PAUTHLR-NEXT:    paciasppc
243; PAUTHLR-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
244; PAUTHLR-NEXT:    .cfi_def_cfa_offset 16
245; PAUTHLR-NEXT:    .cfi_offset w30, -16
246; PAUTHLR-NEXT:    bl foo
247; PAUTHLR-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
248; PAUTHLR-NEXT:    adrp x16, .Ltmp3
249; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp3
250; PAUTHLR-NEXT:    retaasppc .Ltmp3
251  %call = call i32 @foo(i32 %x)
252  ret i32 %call
253}
254
255; Should not use the RETAA instruction.
256define i32 @non_leaf_scs(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="non-leaf" shadowcallstack "target-features"="+v8.3a,+reserve-x18"  {
257; CHECK-LABEL: non_leaf_scs:
258; CHECK:       // %bb.0:
259; CHECK-NEXT:    str x30, [x18], #8
260; CHECK-NEXT:    .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
261; CHECK-NEXT:    hint #39
262; CHECK-NEXT:    .cfi_negate_ra_state_with_pc
263; CHECK-NEXT:  .Ltmp4:
264; CHECK-NEXT:    paciasp
265; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
266; CHECK-NEXT:    .cfi_def_cfa_offset 16
267; CHECK-NEXT:    .cfi_offset w30, -16
268; CHECK-NEXT:    bl foo
269; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
270; CHECK-NEXT:    adrp x16, .Ltmp4
271; CHECK-NEXT:    add x16, x16, :lo12:.Ltmp4
272; CHECK-NEXT:    hint #39
273; CHECK-NEXT:    autiasp
274; CHECK-NEXT:    ldr x30, [x18, #-8]!
275; CHECK-NEXT:    ret
276;
277; PAUTHLR-LABEL: non_leaf_scs:
278; PAUTHLR:       // %bb.0:
279; PAUTHLR-NEXT:    str x30, [x18], #8
280; PAUTHLR-NEXT:    .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
281; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
282; PAUTHLR-NEXT:  .Ltmp4:
283; PAUTHLR-NEXT:    paciasppc
284; PAUTHLR-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
285; PAUTHLR-NEXT:    .cfi_def_cfa_offset 16
286; PAUTHLR-NEXT:    .cfi_offset w30, -16
287; PAUTHLR-NEXT:    bl foo
288; PAUTHLR-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
289; PAUTHLR-NEXT:    adrp x16, .Ltmp4
290; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp4
291; PAUTHLR-NEXT:    autiasppc .Ltmp4
292; PAUTHLR-NEXT:    ldr x30, [x18, #-8]!
293; PAUTHLR-NEXT:    ret
294  %call = call i32 @foo(i32 %x)
295  ret i32 %call
296}
297
298define i32 @leaf_sign_all_v83(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "target-features"="+v8.3a" {
299; CHECK-LABEL: leaf_sign_all_v83:
300; CHECK:       // %bb.0:
301; CHECK-NEXT:    hint #39
302; CHECK-NEXT:    .cfi_negate_ra_state_with_pc
303; CHECK-NEXT:  .Ltmp5:
304; CHECK-NEXT:    paciasp
305; CHECK-NEXT:    adrp x16, .Ltmp5
306; CHECK-NEXT:    add x16, x16, :lo12:.Ltmp5
307; CHECK-NEXT:    hint #39
308; CHECK-NEXT:    retaa
309;
310; PAUTHLR-LABEL: leaf_sign_all_v83:
311; PAUTHLR:       // %bb.0:
312; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
313; PAUTHLR-NEXT:  .Ltmp5:
314; PAUTHLR-NEXT:    paciasppc
315; PAUTHLR-NEXT:    adrp x16, .Ltmp5
316; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp5
317; PAUTHLR-NEXT:    retaasppc .Ltmp5
318  ret i32 %x
319}
320
321declare fastcc i64 @bar(i64)
322
323define fastcc void @spill_lr_and_tail_call(i64 %x) "branch-protection-pauth-lr" "sign-return-address"="all" {
324; COMPAT-LABEL: spill_lr_and_tail_call:
325; COMPAT:       // %bb.0:
326; COMPAT-NEXT:    hint #39
327; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
328; COMPAT-NEXT:  .Ltmp6:
329; COMPAT-NEXT:    hint #25
330; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
331; COMPAT-NEXT:    .cfi_def_cfa_offset 16
332; COMPAT-NEXT:    .cfi_offset w30, -16
333; COMPAT-NEXT:    //APP
334; COMPAT-NEXT:    mov x30, x0
335; COMPAT-NEXT:    //NO_APP
336; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
337; COMPAT-NEXT:    adrp x16, .Ltmp6
338; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp6
339; COMPAT-NEXT:    hint #39
340; COMPAT-NEXT:    hint #29
341; COMPAT-NEXT:    b bar
342;
343; V83A-LABEL: spill_lr_and_tail_call:
344; V83A:       // %bb.0:
345; V83A-NEXT:    hint #39
346; V83A-NEXT:    .cfi_negate_ra_state_with_pc
347; V83A-NEXT:  .Ltmp6:
348; V83A-NEXT:    paciasp
349; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
350; V83A-NEXT:    .cfi_def_cfa_offset 16
351; V83A-NEXT:    .cfi_offset w30, -16
352; V83A-NEXT:    //APP
353; V83A-NEXT:    mov x30, x0
354; V83A-NEXT:    //NO_APP
355; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
356; V83A-NEXT:    adrp x16, .Ltmp6
357; V83A-NEXT:    add x16, x16, :lo12:.Ltmp6
358; V83A-NEXT:    hint #39
359; V83A-NEXT:    autiasp
360; V83A-NEXT:    b bar
361;
362; PAUTHLR-LABEL: spill_lr_and_tail_call:
363; PAUTHLR:       // %bb.0:
364; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
365; PAUTHLR-NEXT:  .Ltmp6:
366; PAUTHLR-NEXT:    paciasppc
367; PAUTHLR-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
368; PAUTHLR-NEXT:    .cfi_def_cfa_offset 16
369; PAUTHLR-NEXT:    .cfi_offset w30, -16
370; PAUTHLR-NEXT:    //APP
371; PAUTHLR-NEXT:    mov x30, x0
372; PAUTHLR-NEXT:    //NO_APP
373; PAUTHLR-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
374; PAUTHLR-NEXT:    adrp x16, .Ltmp6
375; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp6
376; PAUTHLR-NEXT:    autiasppc .Ltmp6
377; PAUTHLR-NEXT:    b bar
378  call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
379  tail call fastcc i64 @bar(i64 %x)
380  ret void
381}
382
383define i32 @leaf_sign_all_a_key(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="a_key" {
384; COMPAT-LABEL: leaf_sign_all_a_key:
385; COMPAT:       // %bb.0:
386; COMPAT-NEXT:    hint #39
387; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
388; COMPAT-NEXT:  .Ltmp7:
389; COMPAT-NEXT:    hint #25
390; COMPAT-NEXT:    adrp x16, .Ltmp7
391; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp7
392; COMPAT-NEXT:    hint #39
393; COMPAT-NEXT:    hint #29
394; COMPAT-NEXT:    ret
395;
396; V83A-LABEL: leaf_sign_all_a_key:
397; V83A:       // %bb.0:
398; V83A-NEXT:    hint #39
399; V83A-NEXT:    .cfi_negate_ra_state_with_pc
400; V83A-NEXT:  .Ltmp7:
401; V83A-NEXT:    paciasp
402; V83A-NEXT:    adrp x16, .Ltmp7
403; V83A-NEXT:    add x16, x16, :lo12:.Ltmp7
404; V83A-NEXT:    hint #39
405; V83A-NEXT:    retaa
406;
407; PAUTHLR-LABEL: leaf_sign_all_a_key:
408; PAUTHLR:       // %bb.0:
409; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
410; PAUTHLR-NEXT:  .Ltmp7:
411; PAUTHLR-NEXT:    paciasppc
412; PAUTHLR-NEXT:    adrp x16, .Ltmp7
413; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp7
414; PAUTHLR-NEXT:    retaasppc .Ltmp7
415  ret i32 %x
416}
417
418define i32 @leaf_sign_all_b_key(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" {
419; COMPAT-LABEL: leaf_sign_all_b_key:
420; COMPAT:       // %bb.0:
421; COMPAT-NEXT:    .cfi_b_key_frame
422; COMPAT-NEXT:    hint #39
423; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
424; COMPAT-NEXT:  .Ltmp8:
425; COMPAT-NEXT:    hint #27
426; COMPAT-NEXT:    adrp x16, .Ltmp8
427; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp8
428; COMPAT-NEXT:    hint #39
429; COMPAT-NEXT:    hint #31
430; COMPAT-NEXT:    ret
431;
432; V83A-LABEL: leaf_sign_all_b_key:
433; V83A:       // %bb.0:
434; V83A-NEXT:    .cfi_b_key_frame
435; V83A-NEXT:    hint #39
436; V83A-NEXT:    .cfi_negate_ra_state_with_pc
437; V83A-NEXT:  .Ltmp8:
438; V83A-NEXT:    pacibsp
439; V83A-NEXT:    adrp x16, .Ltmp8
440; V83A-NEXT:    add x16, x16, :lo12:.Ltmp8
441; V83A-NEXT:    hint #39
442; V83A-NEXT:    retab
443;
444; PAUTHLR-LABEL: leaf_sign_all_b_key:
445; PAUTHLR:       // %bb.0:
446; PAUTHLR-NEXT:    .cfi_b_key_frame
447; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
448; PAUTHLR-NEXT:  .Ltmp8:
449; PAUTHLR-NEXT:    pacibsppc
450; PAUTHLR-NEXT:    adrp x16, .Ltmp8
451; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp8
452; PAUTHLR-NEXT:    retabsppc .Ltmp8
453  ret i32 %x
454}
455
456define i32 @leaf_sign_all_v83_b_key(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" {
457; CHECK-LABEL: leaf_sign_all_v83_b_key:
458; CHECK:       // %bb.0:
459; CHECK-NEXT:    .cfi_b_key_frame
460; CHECK-NEXT:    hint #39
461; CHECK-NEXT:    .cfi_negate_ra_state_with_pc
462; CHECK-NEXT:  .Ltmp9:
463; CHECK-NEXT:    pacibsp
464; CHECK-NEXT:    adrp x16, .Ltmp9
465; CHECK-NEXT:    add x16, x16, :lo12:.Ltmp9
466; CHECK-NEXT:    hint #39
467; CHECK-NEXT:    retab
468;
469; PAUTHLR-LABEL: leaf_sign_all_v83_b_key:
470; PAUTHLR:       // %bb.0:
471; PAUTHLR-NEXT:    .cfi_b_key_frame
472; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
473; PAUTHLR-NEXT:  .Ltmp9:
474; PAUTHLR-NEXT:    pacibsppc
475; PAUTHLR-NEXT:    adrp x16, .Ltmp9
476; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp9
477; PAUTHLR-NEXT:    retabsppc .Ltmp9
478  ret i32 %x
479}
480
481; Note that BTI instruction is not needed before PACIASP.
482define i32 @leaf_sign_all_a_key_bti(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="a_key" "branch-target-enforcement" {
483; COMPAT-LABEL: leaf_sign_all_a_key_bti:
484; COMPAT:       // %bb.0:
485; COMPAT-NEXT:    hint #34
486; COMPAT-NEXT:    hint #39
487; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
488; COMPAT-NEXT:  .Ltmp10:
489; COMPAT-NEXT:    hint #25
490; COMPAT-NEXT:    adrp x16, .Ltmp10
491; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp10
492; COMPAT-NEXT:    hint #39
493; COMPAT-NEXT:    hint #29
494; COMPAT-NEXT:    ret
495;
496; V83A-LABEL: leaf_sign_all_a_key_bti:
497; V83A:       // %bb.0:
498; V83A-NEXT:    hint #34
499; V83A-NEXT:    hint #39
500; V83A-NEXT:    .cfi_negate_ra_state_with_pc
501; V83A-NEXT:  .Ltmp10:
502; V83A-NEXT:    paciasp
503; V83A-NEXT:    adrp x16, .Ltmp10
504; V83A-NEXT:    add x16, x16, :lo12:.Ltmp10
505; V83A-NEXT:    hint #39
506; V83A-NEXT:    retaa
507;
508; PAUTHLR-LABEL: leaf_sign_all_a_key_bti:
509; PAUTHLR:       // %bb.0:
510; PAUTHLR-NEXT:    bti c
511; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
512; PAUTHLR-NEXT:  .Ltmp10:
513; PAUTHLR-NEXT:    paciasppc
514; PAUTHLR-NEXT:    adrp x16, .Ltmp10
515; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp10
516; PAUTHLR-NEXT:    retaasppc .Ltmp10
517  ret i32 %x
518}
519
520; Note that BTI instruction is not needed before PACIBSP.
521define i32 @leaf_sign_all_b_key_bti(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" "branch-target-enforcement" {
522; COMPAT-LABEL: leaf_sign_all_b_key_bti:
523; COMPAT:       // %bb.0:
524; COMPAT-NEXT:    hint #34
525; COMPAT-NEXT:    .cfi_b_key_frame
526; COMPAT-NEXT:    hint #39
527; COMPAT-NEXT:    .cfi_negate_ra_state_with_pc
528; COMPAT-NEXT:  .Ltmp11:
529; COMPAT-NEXT:    hint #27
530; COMPAT-NEXT:    adrp x16, .Ltmp11
531; COMPAT-NEXT:    add x16, x16, :lo12:.Ltmp11
532; COMPAT-NEXT:    hint #39
533; COMPAT-NEXT:    hint #31
534; COMPAT-NEXT:    ret
535;
536; V83A-LABEL: leaf_sign_all_b_key_bti:
537; V83A:       // %bb.0:
538; V83A-NEXT:    hint #34
539; V83A-NEXT:    .cfi_b_key_frame
540; V83A-NEXT:    hint #39
541; V83A-NEXT:    .cfi_negate_ra_state_with_pc
542; V83A-NEXT:  .Ltmp11:
543; V83A-NEXT:    pacibsp
544; V83A-NEXT:    adrp x16, .Ltmp11
545; V83A-NEXT:    add x16, x16, :lo12:.Ltmp11
546; V83A-NEXT:    hint #39
547; V83A-NEXT:    retab
548;
549; PAUTHLR-LABEL: leaf_sign_all_b_key_bti:
550; PAUTHLR:       // %bb.0:
551; PAUTHLR-NEXT:    bti c
552; PAUTHLR-NEXT:    .cfi_b_key_frame
553; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
554; PAUTHLR-NEXT:  .Ltmp11:
555; PAUTHLR-NEXT:    pacibsppc
556; PAUTHLR-NEXT:    adrp x16, .Ltmp11
557; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp11
558; PAUTHLR-NEXT:    retabsppc .Ltmp11
559  ret i32 %x
560}
561
562; Note that BTI instruction is not needed before PACIBSP.
563define i32 @leaf_sign_all_v83_b_key_bti(i32 %x) "branch-protection-pauth-lr" "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" "branch-target-enforcement" {
564; CHECK-LABEL: leaf_sign_all_v83_b_key_bti:
565; CHECK:       // %bb.0:
566; CHECK-NEXT:    hint #34
567; CHECK-NEXT:    .cfi_b_key_frame
568; CHECK-NEXT:    hint #39
569; CHECK-NEXT:    .cfi_negate_ra_state_with_pc
570; CHECK-NEXT:  .Ltmp12:
571; CHECK-NEXT:    pacibsp
572; CHECK-NEXT:    adrp x16, .Ltmp12
573; CHECK-NEXT:    add x16, x16, :lo12:.Ltmp12
574; CHECK-NEXT:    hint #39
575; CHECK-NEXT:    retab
576;
577; PAUTHLR-LABEL: leaf_sign_all_v83_b_key_bti:
578; PAUTHLR:       // %bb.0:
579; PAUTHLR-NEXT:    bti c
580; PAUTHLR-NEXT:    .cfi_b_key_frame
581; PAUTHLR-NEXT:    .cfi_negate_ra_state_with_pc
582; PAUTHLR-NEXT:  .Ltmp12:
583; PAUTHLR-NEXT:    pacibsppc
584; PAUTHLR-NEXT:    adrp x16, .Ltmp12
585; PAUTHLR-NEXT:    add x16, x16, :lo12:.Ltmp12
586; PAUTHLR-NEXT:    retabsppc .Ltmp12
587  ret i32 %x
588}
589