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