869 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=aarch64 < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-COMPAT %s3; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s4 5; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse DWARFCFI-V83A.6; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s7 8; RUN: llc -mtriple=aarch64-windows < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s9; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s10 11; Make sure no errors are detected when emitting SEH opcodes.12; Errors are only checked for when generating a binary, so emit a dummy object13; file and make sure llc produces zero exit code.14; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %s15; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a -o %t.dummy.o --filetype=obj < %s16 17define i32 @leaf(i32 %x) {18; CHECK-LABEL: leaf:19; CHECK: // %bb.0:20; CHECK-NEXT: ret21 ret i32 %x22}23 24define i32 @leaf_sign_none(i32 %x) {25; CHECK-LABEL: leaf_sign_none:26; CHECK: // %bb.0:27; CHECK-NEXT: ret28 ret i32 %x29}30 31define i32 @leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" {32; CHECK-LABEL: leaf_sign_non_leaf:33; CHECK: // %bb.0:34; CHECK-NEXT: ret35 ret i32 %x36}37 38define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {39; DWARFCFI-COMPAT-LABEL: leaf_sign_all:40; DWARFCFI-COMPAT: // %bb.0:41; DWARFCFI-COMPAT-NEXT: hint #2542; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state43; DWARFCFI-COMPAT-NEXT: hint #2944; DWARFCFI-COMPAT-NEXT: ret45;46; DWARFCFI-V83A-LABEL: leaf_sign_all:47; DWARFCFI-V83A: // %bb.0:48; DWARFCFI-V83A-NEXT: paciasp49; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state50; DWARFCFI-V83A-NEXT: retaa51;52; WINCFI-COMPAT-LABEL: leaf_sign_all:53; WINCFI-COMPAT: .seh_proc leaf_sign_all54; WINCFI-COMPAT-NEXT: // %bb.0:55; WINCFI-COMPAT-NEXT: hint #2756; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr57; WINCFI-COMPAT-NEXT: .seh_endprologue58; WINCFI-COMPAT-NEXT: .seh_startepilogue59; WINCFI-COMPAT-NEXT: hint #3160; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr61; WINCFI-COMPAT-NEXT: .seh_endepilogue62; WINCFI-COMPAT-NEXT: ret63; WINCFI-COMPAT-NEXT: .seh_endfunclet64; WINCFI-COMPAT-NEXT: .seh_endproc65;66; WINCFI-V83A-LABEL: leaf_sign_all:67; WINCFI-V83A: .seh_proc leaf_sign_all68; WINCFI-V83A-NEXT: // %bb.0:69; WINCFI-V83A-NEXT: pacibsp70; WINCFI-V83A-NEXT: .seh_pac_sign_lr71; WINCFI-V83A-NEXT: .seh_endprologue72; WINCFI-V83A-NEXT: .seh_startepilogue73; WINCFI-V83A-NEXT: autibsp74; WINCFI-V83A-NEXT: .seh_pac_sign_lr75; WINCFI-V83A-NEXT: .seh_endepilogue76; WINCFI-V83A-NEXT: ret77; WINCFI-V83A-NEXT: .seh_endfunclet78; WINCFI-V83A-NEXT: .seh_endproc79 ret i32 %x80}81 82define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf" {83; DWARFCFI-COMPAT-LABEL: leaf_clobbers_lr:84; DWARFCFI-COMPAT: // %bb.0:85; DWARFCFI-COMPAT-NEXT: hint #2586; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state87; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill88; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 1689; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -1690; DWARFCFI-COMPAT-NEXT: //APP91; DWARFCFI-COMPAT-NEXT: mov x30, x092; DWARFCFI-COMPAT-NEXT: //NO_APP93; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload94; DWARFCFI-COMPAT-NEXT: hint #2995; DWARFCFI-COMPAT-NEXT: ret96;97; DWARFCFI-V83A-LABEL: leaf_clobbers_lr:98; DWARFCFI-V83A: // %bb.0:99; DWARFCFI-V83A-NEXT: paciasp100; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state101; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill102; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16103; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16104; DWARFCFI-V83A-NEXT: //APP105; DWARFCFI-V83A-NEXT: mov x30, x0106; DWARFCFI-V83A-NEXT: //NO_APP107; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload108; DWARFCFI-V83A-NEXT: retaa109;110; WINCFI-COMPAT-LABEL: leaf_clobbers_lr:111; WINCFI-COMPAT: .seh_proc leaf_clobbers_lr112; WINCFI-COMPAT-NEXT: // %bb.0:113; WINCFI-COMPAT-NEXT: hint #27114; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr115; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill116; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16117; WINCFI-COMPAT-NEXT: .seh_endprologue118; WINCFI-COMPAT-NEXT: //APP119; WINCFI-COMPAT-NEXT: mov x30, x0120; WINCFI-COMPAT-NEXT: //NO_APP121; WINCFI-COMPAT-NEXT: .seh_startepilogue122; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload123; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16124; WINCFI-COMPAT-NEXT: hint #31125; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr126; WINCFI-COMPAT-NEXT: .seh_endepilogue127; WINCFI-COMPAT-NEXT: ret128; WINCFI-COMPAT-NEXT: .seh_endfunclet129; WINCFI-COMPAT-NEXT: .seh_endproc130;131; WINCFI-V83A-LABEL: leaf_clobbers_lr:132; WINCFI-V83A: .seh_proc leaf_clobbers_lr133; WINCFI-V83A-NEXT: // %bb.0:134; WINCFI-V83A-NEXT: pacibsp135; WINCFI-V83A-NEXT: .seh_pac_sign_lr136; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill137; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16138; WINCFI-V83A-NEXT: .seh_endprologue139; WINCFI-V83A-NEXT: //APP140; WINCFI-V83A-NEXT: mov x30, x0141; WINCFI-V83A-NEXT: //NO_APP142; WINCFI-V83A-NEXT: .seh_startepilogue143; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload144; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16145; WINCFI-V83A-NEXT: autibsp146; WINCFI-V83A-NEXT: .seh_pac_sign_lr147; WINCFI-V83A-NEXT: .seh_endepilogue148; WINCFI-V83A-NEXT: ret149; WINCFI-V83A-NEXT: .seh_endfunclet150; WINCFI-V83A-NEXT: .seh_endproc151 call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1152 ret i64 %x153}154 155declare i32 @foo(i32)156 157define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {158; DWARFCFI-COMPAT-LABEL: non_leaf_sign_all:159; DWARFCFI-COMPAT: // %bb.0:160; DWARFCFI-COMPAT-NEXT: hint #25161; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state162; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill163; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16164; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16165; DWARFCFI-COMPAT-NEXT: bl foo166; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload167; DWARFCFI-COMPAT-NEXT: hint #29168; DWARFCFI-COMPAT-NEXT: ret169;170; DWARFCFI-V83A-LABEL: non_leaf_sign_all:171; DWARFCFI-V83A: // %bb.0:172; DWARFCFI-V83A-NEXT: paciasp173; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state174; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill175; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16176; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16177; DWARFCFI-V83A-NEXT: bl foo178; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload179; DWARFCFI-V83A-NEXT: retaa180;181; WINCFI-COMPAT-LABEL: non_leaf_sign_all:182; WINCFI-COMPAT: .seh_proc non_leaf_sign_all183; WINCFI-COMPAT-NEXT: // %bb.0:184; WINCFI-COMPAT-NEXT: hint #27185; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr186; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill187; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16188; WINCFI-COMPAT-NEXT: .seh_endprologue189; WINCFI-COMPAT-NEXT: bl foo190; WINCFI-COMPAT-NEXT: .seh_startepilogue191; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload192; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16193; WINCFI-COMPAT-NEXT: hint #31194; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr195; WINCFI-COMPAT-NEXT: .seh_endepilogue196; WINCFI-COMPAT-NEXT: ret197; WINCFI-COMPAT-NEXT: .seh_endfunclet198; WINCFI-COMPAT-NEXT: .seh_endproc199;200; WINCFI-V83A-LABEL: non_leaf_sign_all:201; WINCFI-V83A: .seh_proc non_leaf_sign_all202; WINCFI-V83A-NEXT: // %bb.0:203; WINCFI-V83A-NEXT: pacibsp204; WINCFI-V83A-NEXT: .seh_pac_sign_lr205; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill206; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16207; WINCFI-V83A-NEXT: .seh_endprologue208; WINCFI-V83A-NEXT: bl foo209; WINCFI-V83A-NEXT: .seh_startepilogue210; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload211; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16212; WINCFI-V83A-NEXT: autibsp213; WINCFI-V83A-NEXT: .seh_pac_sign_lr214; WINCFI-V83A-NEXT: .seh_endepilogue215; WINCFI-V83A-NEXT: ret216; WINCFI-V83A-NEXT: .seh_endfunclet217; WINCFI-V83A-NEXT: .seh_endproc218 %call = call i32 @foo(i32 %x)219 ret i32 %call220}221 222define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" {223; DWARFCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:224; DWARFCFI-COMPAT: // %bb.0:225; DWARFCFI-COMPAT-NEXT: hint #25226; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state227; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill228; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16229; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16230; DWARFCFI-COMPAT-NEXT: bl foo231; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload232; DWARFCFI-COMPAT-NEXT: hint #29233; DWARFCFI-COMPAT-NEXT: ret234;235; DWARFCFI-V83A-LABEL: non_leaf_sign_non_leaf:236; DWARFCFI-V83A: // %bb.0:237; DWARFCFI-V83A-NEXT: paciasp238; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state239; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill240; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16241; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16242; DWARFCFI-V83A-NEXT: bl foo243; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload244; DWARFCFI-V83A-NEXT: retaa245;246; WINCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:247; WINCFI-COMPAT: .seh_proc non_leaf_sign_non_leaf248; WINCFI-COMPAT-NEXT: // %bb.0:249; WINCFI-COMPAT-NEXT: hint #27250; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr251; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill252; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16253; WINCFI-COMPAT-NEXT: .seh_endprologue254; WINCFI-COMPAT-NEXT: bl foo255; WINCFI-COMPAT-NEXT: .seh_startepilogue256; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload257; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16258; WINCFI-COMPAT-NEXT: hint #31259; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr260; WINCFI-COMPAT-NEXT: .seh_endepilogue261; WINCFI-COMPAT-NEXT: ret262; WINCFI-COMPAT-NEXT: .seh_endfunclet263; WINCFI-COMPAT-NEXT: .seh_endproc264;265; WINCFI-V83A-LABEL: non_leaf_sign_non_leaf:266; WINCFI-V83A: .seh_proc non_leaf_sign_non_leaf267; WINCFI-V83A-NEXT: // %bb.0:268; WINCFI-V83A-NEXT: pacibsp269; WINCFI-V83A-NEXT: .seh_pac_sign_lr270; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill271; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16272; WINCFI-V83A-NEXT: .seh_endprologue273; WINCFI-V83A-NEXT: bl foo274; WINCFI-V83A-NEXT: .seh_startepilogue275; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload276; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16277; WINCFI-V83A-NEXT: autibsp278; WINCFI-V83A-NEXT: .seh_pac_sign_lr279; WINCFI-V83A-NEXT: .seh_endepilogue280; WINCFI-V83A-NEXT: ret281; WINCFI-V83A-NEXT: .seh_endfunclet282; WINCFI-V83A-NEXT: .seh_endproc283 %call = call i32 @foo(i32 %x)284 ret i32 %call285}286 287; Should not use the RETAA instruction.288define i32 @non_leaf_scs(i32 %x) "sign-return-address"="non-leaf" shadowcallstack "target-features"="+v8.3a,+reserve-x18" {289; DWARFCFI-LABEL: non_leaf_scs:290; DWARFCFI: // %bb.0:291; DWARFCFI-NEXT: paciasp292; DWARFCFI-NEXT: .cfi_negate_ra_state293; DWARFCFI-NEXT: str x30, [x18], #8294; DWARFCFI-NEXT: .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //295; DWARFCFI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill296; DWARFCFI-NEXT: .cfi_def_cfa_offset 16297; DWARFCFI-NEXT: .cfi_offset w30, -16298; DWARFCFI-NEXT: bl foo299; DWARFCFI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload300; DWARFCFI-NEXT: ldr x30, [x18, #-8]!301; DWARFCFI-NEXT: autiasp302; DWARFCFI-NEXT: ret303;304; WINCFI-LABEL: non_leaf_scs:305; WINCFI: .seh_proc non_leaf_scs306; WINCFI-NEXT: // %bb.0:307; WINCFI-NEXT: pacibsp308; WINCFI-NEXT: .seh_pac_sign_lr309; WINCFI-NEXT: str x30, [x18], #8310; WINCFI-NEXT: .seh_nop311; WINCFI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill312; WINCFI-NEXT: .seh_save_reg_x x30, 16313; WINCFI-NEXT: .seh_endprologue314; WINCFI-NEXT: bl foo315; WINCFI-NEXT: .seh_startepilogue316; WINCFI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload317; WINCFI-NEXT: .seh_save_reg_x x30, 16318; WINCFI-NEXT: ldr x30, [x18, #-8]!319; WINCFI-NEXT: .seh_nop320; WINCFI-NEXT: autibsp321; WINCFI-NEXT: .seh_pac_sign_lr322; WINCFI-NEXT: .seh_endepilogue323; WINCFI-NEXT: ret324; WINCFI-NEXT: .seh_endfunclet325; WINCFI-NEXT: .seh_endproc326 %call = call i32 @foo(i32 %x)327 ret i32 %call328}329 330@var = dso_local global i64 0331 332; By default, pac-ret hardening respects shrink-wrapping optimization.333define void @shrink_wrap_sign_non_leaf(i32 %x, i32 %cond) "sign-return-address"="non-leaf" uwtable(async) {334; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:335; DWARFCFI-COMPAT: // %bb.0: // %entry336; DWARFCFI-COMPAT-NEXT: cbnz w1, .LBB8_2337; DWARFCFI-COMPAT-NEXT: // %bb.1: // %if.then338; DWARFCFI-COMPAT-NEXT: hint #25339; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state340; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill341; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16342; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16343; DWARFCFI-COMPAT-NEXT: bl foo344; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload345; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 0346; DWARFCFI-COMPAT-NEXT: .cfi_restore w30347; DWARFCFI-COMPAT-NEXT: hint #29348; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state349; DWARFCFI-COMPAT-NEXT: .LBB8_2: // %exit350; DWARFCFI-COMPAT-NEXT: adrp x8, var351; DWARFCFI-COMPAT-NEXT: mov w9, #42 // =0x2a352; DWARFCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]353; DWARFCFI-COMPAT-NEXT: ret354;355; DWARFCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:356; DWARFCFI-V83A: // %bb.0: // %entry357; DWARFCFI-V83A-NEXT: cbnz w1, .LBB8_2358; DWARFCFI-V83A-NEXT: // %bb.1: // %if.then359; DWARFCFI-V83A-NEXT: paciasp360; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state361; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill362; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16363; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16364; DWARFCFI-V83A-NEXT: bl foo365; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload366; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 0367; DWARFCFI-V83A-NEXT: .cfi_restore w30368; DWARFCFI-V83A-NEXT: autiasp369; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state370; DWARFCFI-V83A-NEXT: .LBB8_2: // %exit371; DWARFCFI-V83A-NEXT: adrp x8, var372; DWARFCFI-V83A-NEXT: mov w9, #42 // =0x2a373; DWARFCFI-V83A-NEXT: str x9, [x8, :lo12:var]374; DWARFCFI-V83A-NEXT: ret375;376; WINCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:377; WINCFI-COMPAT: .seh_proc shrink_wrap_sign_non_leaf378; WINCFI-COMPAT-NEXT: // %bb.0: // %entry379; WINCFI-COMPAT-NEXT: hint #27380; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr381; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill382; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16383; WINCFI-COMPAT-NEXT: .seh_endprologue384; WINCFI-COMPAT-NEXT: cbnz w1, .LBB8_2385; WINCFI-COMPAT-NEXT: // %bb.1: // %if.then386; WINCFI-COMPAT-NEXT: bl foo387; WINCFI-COMPAT-NEXT: .LBB8_2: // %exit388; WINCFI-COMPAT-NEXT: adrp x8, var389; WINCFI-COMPAT-NEXT: mov w9, #42 // =0x2a390; WINCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]391; WINCFI-COMPAT-NEXT: .seh_startepilogue392; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload393; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16394; WINCFI-COMPAT-NEXT: hint #31395; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr396; WINCFI-COMPAT-NEXT: .seh_endepilogue397; WINCFI-COMPAT-NEXT: ret398; WINCFI-COMPAT-NEXT: .seh_endfunclet399; WINCFI-COMPAT-NEXT: .seh_endproc400;401; WINCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:402; WINCFI-V83A: .seh_proc shrink_wrap_sign_non_leaf403; WINCFI-V83A-NEXT: // %bb.0: // %entry404; WINCFI-V83A-NEXT: pacibsp405; WINCFI-V83A-NEXT: .seh_pac_sign_lr406; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill407; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16408; WINCFI-V83A-NEXT: .seh_endprologue409; WINCFI-V83A-NEXT: cbnz w1, .LBB8_2410; WINCFI-V83A-NEXT: // %bb.1: // %if.then411; WINCFI-V83A-NEXT: bl foo412; WINCFI-V83A-NEXT: .LBB8_2: // %exit413; WINCFI-V83A-NEXT: adrp x8, var414; WINCFI-V83A-NEXT: mov w9, #42 // =0x2a415; WINCFI-V83A-NEXT: str x9, [x8, :lo12:var]416; WINCFI-V83A-NEXT: .seh_startepilogue417; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload418; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16419; WINCFI-V83A-NEXT: autibsp420; WINCFI-V83A-NEXT: .seh_pac_sign_lr421; WINCFI-V83A-NEXT: .seh_endepilogue422; WINCFI-V83A-NEXT: ret423; WINCFI-V83A-NEXT: .seh_endfunclet424; WINCFI-V83A-NEXT: .seh_endproc425entry:426 %cond.bool = icmp eq i32 %cond, 0427 br i1 %cond.bool, label %if.then, label %exit428if.then:429 %call = call i32 @foo(i32 %x)430 br label %exit431exit:432 store i64 42, ptr @var433 ret void434}435 436; When "+leaf" is specified to harden everything, pac-ret hardens the entire437; function, ignoring shrink-wrapping.438define void @shrink_wrap_sign_all(i32 %x, i32 %cond) "sign-return-address"="all" uwtable(async) {439; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_all:440; DWARFCFI-COMPAT: // %bb.0: // %entry441; DWARFCFI-COMPAT-NEXT: hint #25442; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state443; DWARFCFI-COMPAT-NEXT: cbnz w1, .LBB9_2444; DWARFCFI-COMPAT-NEXT: // %bb.1: // %if.then445; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill446; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16447; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16448; DWARFCFI-COMPAT-NEXT: bl foo449; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload450; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 0451; DWARFCFI-COMPAT-NEXT: .cfi_restore w30452; DWARFCFI-COMPAT-NEXT: .LBB9_2: // %exit453; DWARFCFI-COMPAT-NEXT: adrp x8, var454; DWARFCFI-COMPAT-NEXT: mov w9, #42 // =0x2a455; DWARFCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]456; DWARFCFI-COMPAT-NEXT: hint #29457; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state458; DWARFCFI-COMPAT-NEXT: ret459;460; DWARFCFI-V83A-LABEL: shrink_wrap_sign_all:461; DWARFCFI-V83A: // %bb.0: // %entry462; DWARFCFI-V83A-NEXT: paciasp463; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state464; DWARFCFI-V83A-NEXT: cbnz w1, .LBB9_2465; DWARFCFI-V83A-NEXT: // %bb.1: // %if.then466; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill467; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16468; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16469; DWARFCFI-V83A-NEXT: bl foo470; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload471; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 0472; DWARFCFI-V83A-NEXT: .cfi_restore w30473; DWARFCFI-V83A-NEXT: .LBB9_2: // %exit474; DWARFCFI-V83A-NEXT: adrp x8, var475; DWARFCFI-V83A-NEXT: mov w9, #42 // =0x2a476; DWARFCFI-V83A-NEXT: str x9, [x8, :lo12:var]477; DWARFCFI-V83A-NEXT: retaa478;479; WINCFI-COMPAT-LABEL: shrink_wrap_sign_all:480; WINCFI-COMPAT: .seh_proc shrink_wrap_sign_all481; WINCFI-COMPAT-NEXT: // %bb.0: // %entry482; WINCFI-COMPAT-NEXT: hint #27483; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr484; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill485; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16486; WINCFI-COMPAT-NEXT: .seh_endprologue487; WINCFI-COMPAT-NEXT: cbnz w1, .LBB9_2488; WINCFI-COMPAT-NEXT: // %bb.1: // %if.then489; WINCFI-COMPAT-NEXT: bl foo490; WINCFI-COMPAT-NEXT: .LBB9_2: // %exit491; WINCFI-COMPAT-NEXT: adrp x8, var492; WINCFI-COMPAT-NEXT: mov w9, #42 // =0x2a493; WINCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]494; WINCFI-COMPAT-NEXT: .seh_startepilogue495; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload496; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16497; WINCFI-COMPAT-NEXT: hint #31498; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr499; WINCFI-COMPAT-NEXT: .seh_endepilogue500; WINCFI-COMPAT-NEXT: ret501; WINCFI-COMPAT-NEXT: .seh_endfunclet502; WINCFI-COMPAT-NEXT: .seh_endproc503;504; WINCFI-V83A-LABEL: shrink_wrap_sign_all:505; WINCFI-V83A: .seh_proc shrink_wrap_sign_all506; WINCFI-V83A-NEXT: // %bb.0: // %entry507; WINCFI-V83A-NEXT: pacibsp508; WINCFI-V83A-NEXT: .seh_pac_sign_lr509; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill510; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16511; WINCFI-V83A-NEXT: .seh_endprologue512; WINCFI-V83A-NEXT: cbnz w1, .LBB9_2513; WINCFI-V83A-NEXT: // %bb.1: // %if.then514; WINCFI-V83A-NEXT: bl foo515; WINCFI-V83A-NEXT: .LBB9_2: // %exit516; WINCFI-V83A-NEXT: adrp x8, var517; WINCFI-V83A-NEXT: mov w9, #42 // =0x2a518; WINCFI-V83A-NEXT: str x9, [x8, :lo12:var]519; WINCFI-V83A-NEXT: .seh_startepilogue520; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload521; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16522; WINCFI-V83A-NEXT: autibsp523; WINCFI-V83A-NEXT: .seh_pac_sign_lr524; WINCFI-V83A-NEXT: .seh_endepilogue525; WINCFI-V83A-NEXT: ret526; WINCFI-V83A-NEXT: .seh_endfunclet527; WINCFI-V83A-NEXT: .seh_endproc528entry:529 %cond.bool = icmp eq i32 %cond, 0530 br i1 %cond.bool, label %if.then, label %exit531if.then:532 %call = call i32 @foo(i32 %x)533 br label %exit534exit:535 store i64 42, ptr @var536 ret void537}538 539define i32 @leaf_sign_all_v83(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" {540; DWARFCFI-LABEL: leaf_sign_all_v83:541; DWARFCFI: // %bb.0:542; DWARFCFI-NEXT: paciasp543; DWARFCFI-NEXT: .cfi_negate_ra_state544; DWARFCFI-NEXT: retaa545;546; WINCFI-LABEL: leaf_sign_all_v83:547; WINCFI: .seh_proc leaf_sign_all_v83548; WINCFI-NEXT: // %bb.0:549; WINCFI-NEXT: pacibsp550; WINCFI-NEXT: .seh_pac_sign_lr551; WINCFI-NEXT: .seh_endprologue552; WINCFI-NEXT: .seh_startepilogue553; WINCFI-NEXT: autibsp554; WINCFI-NEXT: .seh_pac_sign_lr555; WINCFI-NEXT: .seh_endepilogue556; WINCFI-NEXT: ret557; WINCFI-NEXT: .seh_endfunclet558; WINCFI-NEXT: .seh_endproc559 ret i32 %x560}561 562declare fastcc i64 @bar(i64)563 564define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {565; DWARFCFI-COMPAT-LABEL: spill_lr_and_tail_call:566; DWARFCFI-COMPAT: // %bb.0:567; DWARFCFI-COMPAT-NEXT: hint #25568; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state569; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill570; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16571; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16572; DWARFCFI-COMPAT-NEXT: //APP573; DWARFCFI-COMPAT-NEXT: mov x30, x0574; DWARFCFI-COMPAT-NEXT: //NO_APP575; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload576; DWARFCFI-COMPAT-NEXT: hint #29577; DWARFCFI-COMPAT-NEXT: b bar578;579; DWARFCFI-V83A-LABEL: spill_lr_and_tail_call:580; DWARFCFI-V83A: // %bb.0:581; DWARFCFI-V83A-NEXT: paciasp582; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state583; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill584; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16585; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16586; DWARFCFI-V83A-NEXT: //APP587; DWARFCFI-V83A-NEXT: mov x30, x0588; DWARFCFI-V83A-NEXT: //NO_APP589; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload590; DWARFCFI-V83A-NEXT: autiasp591; DWARFCFI-V83A-NEXT: b bar592;593; WINCFI-COMPAT-LABEL: spill_lr_and_tail_call:594; WINCFI-COMPAT: .seh_proc spill_lr_and_tail_call595; WINCFI-COMPAT-NEXT: // %bb.0:596; WINCFI-COMPAT-NEXT: hint #27597; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr598; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill599; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16600; WINCFI-COMPAT-NEXT: .seh_endprologue601; WINCFI-COMPAT-NEXT: //APP602; WINCFI-COMPAT-NEXT: mov x30, x0603; WINCFI-COMPAT-NEXT: //NO_APP604; WINCFI-COMPAT-NEXT: .seh_startepilogue605; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload606; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16607; WINCFI-COMPAT-NEXT: hint #31608; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr609; WINCFI-COMPAT-NEXT: .seh_endepilogue610; WINCFI-COMPAT-NEXT: b bar611; WINCFI-COMPAT-NEXT: .seh_endfunclet612; WINCFI-COMPAT-NEXT: .seh_endproc613;614; WINCFI-V83A-LABEL: spill_lr_and_tail_call:615; WINCFI-V83A: .seh_proc spill_lr_and_tail_call616; WINCFI-V83A-NEXT: // %bb.0:617; WINCFI-V83A-NEXT: pacibsp618; WINCFI-V83A-NEXT: .seh_pac_sign_lr619; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill620; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16621; WINCFI-V83A-NEXT: .seh_endprologue622; WINCFI-V83A-NEXT: //APP623; WINCFI-V83A-NEXT: mov x30, x0624; WINCFI-V83A-NEXT: //NO_APP625; WINCFI-V83A-NEXT: .seh_startepilogue626; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload627; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16628; WINCFI-V83A-NEXT: autibsp629; WINCFI-V83A-NEXT: .seh_pac_sign_lr630; WINCFI-V83A-NEXT: .seh_endepilogue631; WINCFI-V83A-NEXT: b bar632; WINCFI-V83A-NEXT: .seh_endfunclet633; WINCFI-V83A-NEXT: .seh_endproc634 call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1635 tail call fastcc i64 @bar(i64 %x)636 ret void637}638 639define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" {640; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key:641; DWARFCFI-COMPAT: // %bb.0:642; DWARFCFI-COMPAT-NEXT: hint #25643; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state644; DWARFCFI-COMPAT-NEXT: hint #29645; DWARFCFI-COMPAT-NEXT: ret646;647; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key:648; DWARFCFI-V83A: // %bb.0:649; DWARFCFI-V83A-NEXT: paciasp650; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state651; DWARFCFI-V83A-NEXT: retaa652;653; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key:654; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key655; WINCFI-COMPAT-NEXT: // %bb.0:656; WINCFI-COMPAT-NEXT: hint #25657; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr658; WINCFI-COMPAT-NEXT: .seh_endprologue659; WINCFI-COMPAT-NEXT: .seh_startepilogue660; WINCFI-COMPAT-NEXT: hint #29661; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr662; WINCFI-COMPAT-NEXT: .seh_endepilogue663; WINCFI-COMPAT-NEXT: ret664; WINCFI-COMPAT-NEXT: .seh_endfunclet665; WINCFI-COMPAT-NEXT: .seh_endproc666;667; WINCFI-V83A-LABEL: leaf_sign_all_a_key:668; WINCFI-V83A: .seh_proc leaf_sign_all_a_key669; WINCFI-V83A-NEXT: // %bb.0:670; WINCFI-V83A-NEXT: paciasp671; WINCFI-V83A-NEXT: .seh_pac_sign_lr672; WINCFI-V83A-NEXT: .seh_endprologue673; WINCFI-V83A-NEXT: .seh_startepilogue674; WINCFI-V83A-NEXT: autiasp675; WINCFI-V83A-NEXT: .seh_pac_sign_lr676; WINCFI-V83A-NEXT: .seh_endepilogue677; WINCFI-V83A-NEXT: ret678; WINCFI-V83A-NEXT: .seh_endfunclet679; WINCFI-V83A-NEXT: .seh_endproc680 ret i32 %x681}682 683define i32 @leaf_sign_all_b_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" {684; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key:685; DWARFCFI-COMPAT: // %bb.0:686; DWARFCFI-COMPAT-NEXT: .cfi_b_key_frame687; DWARFCFI-COMPAT-NEXT: hint #27688; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state689; DWARFCFI-COMPAT-NEXT: hint #31690; DWARFCFI-COMPAT-NEXT: ret691;692; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key:693; DWARFCFI-V83A: // %bb.0:694; DWARFCFI-V83A-NEXT: .cfi_b_key_frame695; DWARFCFI-V83A-NEXT: pacibsp696; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state697; DWARFCFI-V83A-NEXT: retab698;699; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key:700; WINCFI-COMPAT: .seh_proc leaf_sign_all_b_key701; WINCFI-COMPAT-NEXT: // %bb.0:702; WINCFI-COMPAT-NEXT: hint #27703; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr704; WINCFI-COMPAT-NEXT: .seh_endprologue705; WINCFI-COMPAT-NEXT: .seh_startepilogue706; WINCFI-COMPAT-NEXT: hint #31707; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr708; WINCFI-COMPAT-NEXT: .seh_endepilogue709; WINCFI-COMPAT-NEXT: ret710; WINCFI-COMPAT-NEXT: .seh_endfunclet711; WINCFI-COMPAT-NEXT: .seh_endproc712;713; WINCFI-V83A-LABEL: leaf_sign_all_b_key:714; WINCFI-V83A: .seh_proc leaf_sign_all_b_key715; WINCFI-V83A-NEXT: // %bb.0:716; WINCFI-V83A-NEXT: pacibsp717; WINCFI-V83A-NEXT: .seh_pac_sign_lr718; WINCFI-V83A-NEXT: .seh_endprologue719; WINCFI-V83A-NEXT: .seh_startepilogue720; WINCFI-V83A-NEXT: autibsp721; WINCFI-V83A-NEXT: .seh_pac_sign_lr722; WINCFI-V83A-NEXT: .seh_endepilogue723; WINCFI-V83A-NEXT: ret724; WINCFI-V83A-NEXT: .seh_endfunclet725; WINCFI-V83A-NEXT: .seh_endproc726 ret i32 %x727}728 729define i32 @leaf_sign_all_v83_b_key(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" {730; DWARFCFI-LABEL: leaf_sign_all_v83_b_key:731; DWARFCFI: // %bb.0:732; DWARFCFI-NEXT: .cfi_b_key_frame733; DWARFCFI-NEXT: pacibsp734; DWARFCFI-NEXT: .cfi_negate_ra_state735; DWARFCFI-NEXT: retab736;737; WINCFI-LABEL: leaf_sign_all_v83_b_key:738; WINCFI: .seh_proc leaf_sign_all_v83_b_key739; WINCFI-NEXT: // %bb.0:740; WINCFI-NEXT: pacibsp741; WINCFI-NEXT: .seh_pac_sign_lr742; WINCFI-NEXT: .seh_endprologue743; WINCFI-NEXT: .seh_startepilogue744; WINCFI-NEXT: autibsp745; WINCFI-NEXT: .seh_pac_sign_lr746; WINCFI-NEXT: .seh_endepilogue747; WINCFI-NEXT: ret748; WINCFI-NEXT: .seh_endfunclet749; WINCFI-NEXT: .seh_endproc750 ret i32 %x751}752 753; Note that BTI instruction is not needed before PACIASP.754define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" "branch-target-enforcement"{755; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:756; DWARFCFI-COMPAT: // %bb.0:757; DWARFCFI-COMPAT-NEXT: hint #25758; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state759; DWARFCFI-COMPAT-NEXT: hint #29760; DWARFCFI-COMPAT-NEXT: ret761;762; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key_bti:763; DWARFCFI-V83A: // %bb.0:764; DWARFCFI-V83A-NEXT: paciasp765; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state766; DWARFCFI-V83A-NEXT: retaa767;768; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:769; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key_bti770; WINCFI-COMPAT-NEXT: // %bb.0:771; WINCFI-COMPAT-NEXT: hint #25772; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr773; WINCFI-COMPAT-NEXT: .seh_endprologue774; WINCFI-COMPAT-NEXT: .seh_startepilogue775; WINCFI-COMPAT-NEXT: hint #29776; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr777; WINCFI-COMPAT-NEXT: .seh_endepilogue778; WINCFI-COMPAT-NEXT: ret779; WINCFI-COMPAT-NEXT: .seh_endfunclet780; WINCFI-COMPAT-NEXT: .seh_endproc781;782; WINCFI-V83A-LABEL: leaf_sign_all_a_key_bti:783; WINCFI-V83A: .seh_proc leaf_sign_all_a_key_bti784; WINCFI-V83A-NEXT: // %bb.0:785; WINCFI-V83A-NEXT: paciasp786; WINCFI-V83A-NEXT: .seh_pac_sign_lr787; WINCFI-V83A-NEXT: .seh_endprologue788; WINCFI-V83A-NEXT: .seh_startepilogue789; WINCFI-V83A-NEXT: autiasp790; WINCFI-V83A-NEXT: .seh_pac_sign_lr791; WINCFI-V83A-NEXT: .seh_endepilogue792; WINCFI-V83A-NEXT: ret793; WINCFI-V83A-NEXT: .seh_endfunclet794; WINCFI-V83A-NEXT: .seh_endproc795 ret i32 %x796}797 798; Note that BTI instruction is not needed before PACIBSP.799define i32 @leaf_sign_all_b_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" "branch-target-enforcement"{800; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:801; DWARFCFI-COMPAT: // %bb.0:802; DWARFCFI-COMPAT-NEXT: .cfi_b_key_frame803; DWARFCFI-COMPAT-NEXT: hint #27804; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state805; DWARFCFI-COMPAT-NEXT: hint #31806; DWARFCFI-COMPAT-NEXT: ret807;808; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key_bti:809; DWARFCFI-V83A: // %bb.0:810; DWARFCFI-V83A-NEXT: .cfi_b_key_frame811; DWARFCFI-V83A-NEXT: pacibsp812; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state813; DWARFCFI-V83A-NEXT: retab814;815; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:816; WINCFI-COMPAT: .seh_proc leaf_sign_all_b_key_bti817; WINCFI-COMPAT-NEXT: // %bb.0:818; WINCFI-COMPAT-NEXT: hint #27819; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr820; WINCFI-COMPAT-NEXT: .seh_endprologue821; WINCFI-COMPAT-NEXT: .seh_startepilogue822; WINCFI-COMPAT-NEXT: hint #31823; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr824; WINCFI-COMPAT-NEXT: .seh_endepilogue825; WINCFI-COMPAT-NEXT: ret826; WINCFI-COMPAT-NEXT: .seh_endfunclet827; WINCFI-COMPAT-NEXT: .seh_endproc828;829; WINCFI-V83A-LABEL: leaf_sign_all_b_key_bti:830; WINCFI-V83A: .seh_proc leaf_sign_all_b_key_bti831; WINCFI-V83A-NEXT: // %bb.0:832; WINCFI-V83A-NEXT: pacibsp833; WINCFI-V83A-NEXT: .seh_pac_sign_lr834; WINCFI-V83A-NEXT: .seh_endprologue835; WINCFI-V83A-NEXT: .seh_startepilogue836; WINCFI-V83A-NEXT: autibsp837; WINCFI-V83A-NEXT: .seh_pac_sign_lr838; WINCFI-V83A-NEXT: .seh_endepilogue839; WINCFI-V83A-NEXT: ret840; WINCFI-V83A-NEXT: .seh_endfunclet841; WINCFI-V83A-NEXT: .seh_endproc842 ret i32 %x843}844 845; Note that BTI instruction is not needed before PACIBSP.846define i32 @leaf_sign_all_v83_b_key_bti(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" "branch-target-enforcement" {847; DWARFCFI-LABEL: leaf_sign_all_v83_b_key_bti:848; DWARFCFI: // %bb.0:849; DWARFCFI-NEXT: .cfi_b_key_frame850; DWARFCFI-NEXT: pacibsp851; DWARFCFI-NEXT: .cfi_negate_ra_state852; DWARFCFI-NEXT: retab853;854; WINCFI-LABEL: leaf_sign_all_v83_b_key_bti:855; WINCFI: .seh_proc leaf_sign_all_v83_b_key_bti856; WINCFI-NEXT: // %bb.0:857; WINCFI-NEXT: pacibsp858; WINCFI-NEXT: .seh_pac_sign_lr859; WINCFI-NEXT: .seh_endprologue860; WINCFI-NEXT: .seh_startepilogue861; WINCFI-NEXT: autibsp862; WINCFI-NEXT: .seh_pac_sign_lr863; WINCFI-NEXT: .seh_endepilogue864; WINCFI-NEXT: ret865; WINCFI-NEXT: .seh_endfunclet866; WINCFI-NEXT: .seh_endproc867 ret i32 %x868}869