[llvm] b717568 - [AArch64] Fix the emission of WinCFI for pac-ret+leaf and SCS (#147518)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 12 03:45:52 PDT 2025
Author: Anatoly Trosinenko
Date: 2025-07-12T13:45:48+03:00
New Revision: b71756852f5a41b35a74918374a11ae00365ee04
URL: https://github.com/llvm/llvm-project/commit/b71756852f5a41b35a74918374a11ae00365ee04
DIFF: https://github.com/llvm/llvm-project/commit/b71756852f5a41b35a74918374a11ae00365ee04.diff
LOG: [AArch64] Fix the emission of WinCFI for pac-ret+leaf and SCS (#147518)
This commit fixes WinCFI opcodes being incorrectly emitted for test
cases in sign-return-address.ll.
Emit SEH_Nop opcode in emitShadowCallStackEpilogue the same way it is
done in emitShadowCallStackPrologue function - this fixes
12 bytes of instructions in range, but .seh directives corresponding to 8 bytes
error being reported for the epilogue of non_leaf_scs function.
Emit SEH_PrologEnd on the code path in emitPrologue function that may be
taken when pac-ret protection is emitted for a leaf function - this
fixes errors like the following:
starting epilogue (.seh_startepilogue) before prologue has ended (.seh_endprologue) in leaf_sign_all_v83
Stray .seh_endepilogue in leaf_sign_all_v83
Added:
Modified:
llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
llvm/test/CodeGen/AArch64/sign-return-address.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index 666ff8bbab42a..00fbeef9d35df 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -1746,7 +1746,7 @@ static void emitShadowCallStackEpilogue(const TargetInstrInfo &TII,
MachineFunction &MF,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI,
- const DebugLoc &DL) {
+ const DebugLoc &DL, bool NeedsWinCFI) {
// Shadow call stack epilog: ldr x30, [x18, #-8]!
BuildMI(MBB, MBBI, DL, TII.get(AArch64::LDRXpre))
.addReg(AArch64::X18, RegState::Define)
@@ -1755,6 +1755,10 @@ static void emitShadowCallStackEpilogue(const TargetInstrInfo &TII,
.addImm(-8)
.setMIFlag(MachineInstr::FrameDestroy);
+ if (NeedsWinCFI)
+ BuildMI(MBB, MBBI, DL, TII.get(AArch64::SEH_Nop))
+ .setMIFlag(MachineInstr::FrameDestroy);
+
if (MF.getInfo<AArch64FunctionInfo>()->needsAsyncDwarfUnwindInfo(MF))
CFIInstBuilder(MBB, MBBI, MachineInstr::FrameDestroy)
.buildRestore(AArch64::X18);
@@ -1899,13 +1903,15 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
BuildMI(MBB, MBBI, DL, TII->get(AArch64::PAUTH_PROLOGUE))
.setMIFlag(MachineInstr::FrameSetup);
}
- if (NeedsWinCFI)
- HasWinCFI = true; // AArch64PointerAuth pass will insert SEH_PACSignLR
+ // AArch64PointerAuth pass will insert SEH_PACSignLR
+ HasWinCFI |= NeedsWinCFI;
}
- if (MFnI.needsShadowCallStackPrologueEpilogue(MF))
+ if (MFnI.needsShadowCallStackPrologueEpilogue(MF)) {
emitShadowCallStackPrologue(*TII, MF, MBB, MBBI, DL, NeedsWinCFI,
MFnI.needsDwarfUnwindInfo(MF));
+ HasWinCFI |= NeedsWinCFI;
+ }
if (EmitCFI && MFnI.isMTETagged()) {
BuildMI(MBB, MBBI, DL, TII->get(AArch64::EMITMTETAGGED))
@@ -1990,8 +1996,13 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
"unexpected function without stack frame but with SVE objects");
// All of the stack allocation is for locals.
AFI->setLocalStackSize(NumBytes);
- if (!NumBytes)
+ if (!NumBytes) {
+ if (NeedsWinCFI && HasWinCFI) {
+ BuildMI(MBB, MBBI, DL, TII->get(AArch64::SEH_PrologEnd))
+ .setMIFlag(MachineInstr::FrameSetup);
+ }
return;
+ }
// REDZONE: If the stack size is less than 128 bytes, we don't need
// to actually allocate.
if (canUseRedZone(MF)) {
@@ -2460,8 +2471,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
MachineBasicBlock::iterator EpilogStartI = MBB.end();
auto FinishingTouches = make_scope_exit([&]() {
- if (AFI->needsShadowCallStackPrologueEpilogue(MF))
- emitShadowCallStackEpilogue(*TII, MF, MBB, MBB.getFirstTerminator(), DL);
+ if (AFI->needsShadowCallStackPrologueEpilogue(MF)) {
+ emitShadowCallStackEpilogue(*TII, MF, MBB, MBB.getFirstTerminator(), DL,
+ NeedsWinCFI);
+ HasWinCFI |= NeedsWinCFI;
+ }
if (EmitCFI)
emitCalleeSavedGPRRestores(MBB, MBB.getFirstTerminator());
if (AFI->shouldSignReturnAddress(MF)) {
@@ -2472,8 +2486,8 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
TII->get(AArch64::PAUTH_EPILOGUE))
.setMIFlag(MachineInstr::FrameDestroy);
}
- if (NeedsWinCFI)
- HasWinCFI = true; // AArch64PointerAuth pass will insert SEH_PACSignLR
+ // AArch64PointerAuth pass will insert SEH_PACSignLR
+ HasWinCFI |= NeedsWinCFI;
}
if (HasWinCFI) {
BuildMI(MBB, MBB.getFirstTerminator(), DL,
diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll
index b0ab4775cb388..7267ce0e3afbf 100644
--- a/llvm/test/CodeGen/AArch64/sign-return-address.ll
+++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll
@@ -1,9 +1,18 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -mtriple=aarch64 < %s | FileCheck --check-prefixes=CHECK,COMPAT %s
-; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,V83A %s
+; RUN: llc -mtriple=aarch64 < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-COMPAT %s
+; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s
-; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse V83A.
-; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,V83A %s
+; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse DWARFCFI-V83A.
+; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s
+
+; RUN: llc -mtriple=aarch64-windows < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s
+
+; Make sure no errors are detected when emitting SEH opcodes.
+; Errors are only checked for when generating a binary, so emit a dummy object
+; file and make sure llc produces zero exit code.
+; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %s
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a -o %t.dummy.o --filetype=obj < %s
define i32 @leaf(i32 %x) {
; CHECK-LABEL: leaf:
@@ -27,48 +36,118 @@ define i32 @leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" {
}
define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: leaf_sign_all:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_sign_all:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all:
+; WINCFI-COMPAT: .seh_proc leaf_sign_all
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all:
+; WINCFI-V83A: .seh_proc leaf_sign_all
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf" {
-; COMPAT-LABEL: leaf_clobbers_lr:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: //APP
-; COMPAT-NEXT: mov x30, x0
-; COMPAT-NEXT: //NO_APP
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_clobbers_lr:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: //APP
-; V83A-NEXT: mov x30, x0
-; V83A-NEXT: //NO_APP
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: leaf_clobbers_lr:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: //APP
+; DWARFCFI-COMPAT-NEXT: mov x30, x0
+; DWARFCFI-COMPAT-NEXT: //NO_APP
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_clobbers_lr:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: //APP
+; DWARFCFI-V83A-NEXT: mov x30, x0
+; DWARFCFI-V83A-NEXT: //NO_APP
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_clobbers_lr:
+; WINCFI-COMPAT: .seh_proc leaf_clobbers_lr
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: //APP
+; WINCFI-COMPAT-NEXT: mov x30, x0
+; WINCFI-COMPAT-NEXT: //NO_APP
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_clobbers_lr:
+; WINCFI-V83A: .seh_proc leaf_clobbers_lr
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: //APP
+; WINCFI-V83A-NEXT: mov x30, x0
+; WINCFI-V83A-NEXT: //NO_APP
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
ret i64 %x
}
@@ -76,75 +155,174 @@ define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf" {
declare i32 @foo(i32)
define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: non_leaf_sign_all:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: bl foo
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: non_leaf_sign_all:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: bl foo
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: non_leaf_sign_all:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: bl foo
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: non_leaf_sign_all:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: bl foo
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: non_leaf_sign_all:
+; WINCFI-COMPAT: .seh_proc non_leaf_sign_all
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: bl foo
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: non_leaf_sign_all:
+; WINCFI-V83A: .seh_proc non_leaf_sign_all
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: bl foo
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
%call = call i32 @foo(i32 %x)
ret i32 %call
}
define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" {
-; COMPAT-LABEL: non_leaf_sign_non_leaf:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: bl foo
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: non_leaf_sign_non_leaf:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: bl foo
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: bl foo
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: non_leaf_sign_non_leaf:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: bl foo
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:
+; WINCFI-COMPAT: .seh_proc non_leaf_sign_non_leaf
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: bl foo
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: non_leaf_sign_non_leaf:
+; WINCFI-V83A: .seh_proc non_leaf_sign_non_leaf
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: bl foo
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
%call = call i32 @foo(i32 %x)
ret i32 %call
}
; Should not use the RETAA instruction.
define i32 @non_leaf_scs(i32 %x) "sign-return-address"="non-leaf" shadowcallstack "target-features"="+v8.3a,+reserve-x18" {
-; CHECK-LABEL: non_leaf_scs:
-; CHECK: // %bb.0:
-; CHECK-NEXT: paciasp
-; CHECK-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: str x30, [x18], #8
-; CHECK-NEXT: .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
-; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: .cfi_offset w30, -16
-; CHECK-NEXT: bl foo
-; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-NEXT: ldr x30, [x18, #-8]!
-; CHECK-NEXT: autiasp
-; CHECK-NEXT: ret
+; DWARFCFI-LABEL: non_leaf_scs:
+; DWARFCFI: // %bb.0:
+; DWARFCFI-NEXT: paciasp
+; DWARFCFI-NEXT: .cfi_negate_ra_state
+; DWARFCFI-NEXT: str x30, [x18], #8
+; DWARFCFI-NEXT: .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
+; DWARFCFI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-NEXT: .cfi_offset w30, -16
+; DWARFCFI-NEXT: bl foo
+; DWARFCFI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-NEXT: ldr x30, [x18, #-8]!
+; DWARFCFI-NEXT: autiasp
+; DWARFCFI-NEXT: ret
+;
+; WINCFI-LABEL: non_leaf_scs:
+; WINCFI: .seh_proc non_leaf_scs
+; WINCFI-NEXT: // %bb.0:
+; WINCFI-NEXT: pacibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: str x30, [x18], #8
+; WINCFI-NEXT: .seh_nop
+; WINCFI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-NEXT: .seh_endprologue
+; WINCFI-NEXT: bl foo
+; WINCFI-NEXT: .seh_startepilogue
+; WINCFI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-NEXT: ldr x30, [x18, #-8]!
+; WINCFI-NEXT: .seh_nop
+; WINCFI-NEXT: autibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endepilogue
+; WINCFI-NEXT: ret
+; WINCFI-NEXT: .seh_endfunclet
+; WINCFI-NEXT: .seh_endproc
%call = call i32 @foo(i32 %x)
ret i32 %call
}
@@ -153,47 +331,97 @@ define i32 @non_leaf_scs(i32 %x) "sign-return-address"="non-leaf" shadowcallstac
; By default, pac-ret hardening respects shrink-wrapping optimization.
define void @shrink_wrap_sign_non_leaf(i32 %x, i32 %cond) "sign-return-address"="non-leaf" uwtable(async) {
-; COMPAT-LABEL: shrink_wrap_sign_non_leaf:
-; COMPAT: // %bb.0: // %entry
-; COMPAT-NEXT: cbnz w1, .LBB8_2
-; COMPAT-NEXT: // %bb.1: // %if.then
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: bl foo
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: .cfi_def_cfa_offset 0
-; COMPAT-NEXT: .cfi_restore w30
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: .LBB8_2: // %exit
-; COMPAT-NEXT: adrp x8, var
-; COMPAT-NEXT: mov w9, #42 // =0x2a
-; COMPAT-NEXT: str x9, [x8, :lo12:var]
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: shrink_wrap_sign_non_leaf:
-; V83A: // %bb.0: // %entry
-; V83A-NEXT: cbnz w1, .LBB8_2
-; V83A-NEXT: // %bb.1: // %if.then
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: bl foo
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: .cfi_def_cfa_offset 0
-; V83A-NEXT: .cfi_restore w30
-; V83A-NEXT: autiasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: .LBB8_2: // %exit
-; V83A-NEXT: adrp x8, var
-; V83A-NEXT: mov w9, #42 // =0x2a
-; V83A-NEXT: str x9, [x8, :lo12:var]
-; V83A-NEXT: ret
+; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:
+; DWARFCFI-COMPAT: // %bb.0: // %entry
+; DWARFCFI-COMPAT-NEXT: cbnz w1, .LBB8_2
+; DWARFCFI-COMPAT-NEXT: // %bb.1: // %if.then
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: bl foo
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 0
+; DWARFCFI-COMPAT-NEXT: .cfi_restore w30
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: .LBB8_2: // %exit
+; DWARFCFI-COMPAT-NEXT: adrp x8, var
+; DWARFCFI-COMPAT-NEXT: mov w9, #42 // =0x2a
+; DWARFCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:
+; DWARFCFI-V83A: // %bb.0: // %entry
+; DWARFCFI-V83A-NEXT: cbnz w1, .LBB8_2
+; DWARFCFI-V83A-NEXT: // %bb.1: // %if.then
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: bl foo
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 0
+; DWARFCFI-V83A-NEXT: .cfi_restore w30
+; DWARFCFI-V83A-NEXT: autiasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: .LBB8_2: // %exit
+; DWARFCFI-V83A-NEXT: adrp x8, var
+; DWARFCFI-V83A-NEXT: mov w9, #42 // =0x2a
+; DWARFCFI-V83A-NEXT: str x9, [x8, :lo12:var]
+; DWARFCFI-V83A-NEXT: ret
+;
+; WINCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:
+; WINCFI-COMPAT: .seh_proc shrink_wrap_sign_non_leaf
+; WINCFI-COMPAT-NEXT: // %bb.0: // %entry
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: cbnz w1, .LBB8_2
+; WINCFI-COMPAT-NEXT: // %bb.1: // %if.then
+; WINCFI-COMPAT-NEXT: bl foo
+; WINCFI-COMPAT-NEXT: .LBB8_2: // %exit
+; WINCFI-COMPAT-NEXT: adrp x8, var
+; WINCFI-COMPAT-NEXT: mov w9, #42 // =0x2a
+; WINCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:
+; WINCFI-V83A: .seh_proc shrink_wrap_sign_non_leaf
+; WINCFI-V83A-NEXT: // %bb.0: // %entry
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: cbnz w1, .LBB8_2
+; WINCFI-V83A-NEXT: // %bb.1: // %if.then
+; WINCFI-V83A-NEXT: bl foo
+; WINCFI-V83A-NEXT: .LBB8_2: // %exit
+; WINCFI-V83A-NEXT: adrp x8, var
+; WINCFI-V83A-NEXT: mov w9, #42 // =0x2a
+; WINCFI-V83A-NEXT: str x9, [x8, :lo12:var]
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
entry:
%cond.bool = icmp eq i32 %cond, 0
br i1 %cond.bool, label %if.then, label %exit
@@ -208,45 +436,95 @@ exit:
; When "+leaf" is specified to harden everything, pac-ret hardens the entire
; function, ignoring shrink-wrapping.
define void @shrink_wrap_sign_all(i32 %x, i32 %cond) "sign-return-address"="all" uwtable(async) {
-; COMPAT-LABEL: shrink_wrap_sign_all:
-; COMPAT: // %bb.0: // %entry
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: cbnz w1, .LBB9_2
-; COMPAT-NEXT: // %bb.1: // %if.then
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: bl foo
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: .cfi_def_cfa_offset 0
-; COMPAT-NEXT: .cfi_restore w30
-; COMPAT-NEXT: .LBB9_2: // %exit
-; COMPAT-NEXT: adrp x8, var
-; COMPAT-NEXT: mov w9, #42 // =0x2a
-; COMPAT-NEXT: str x9, [x8, :lo12:var]
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: shrink_wrap_sign_all:
-; V83A: // %bb.0: // %entry
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: cbnz w1, .LBB9_2
-; V83A-NEXT: // %bb.1: // %if.then
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: bl foo
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: .cfi_def_cfa_offset 0
-; V83A-NEXT: .cfi_restore w30
-; V83A-NEXT: .LBB9_2: // %exit
-; V83A-NEXT: adrp x8, var
-; V83A-NEXT: mov w9, #42 // =0x2a
-; V83A-NEXT: str x9, [x8, :lo12:var]
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_all:
+; DWARFCFI-COMPAT: // %bb.0: // %entry
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: cbnz w1, .LBB9_2
+; DWARFCFI-COMPAT-NEXT: // %bb.1: // %if.then
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: bl foo
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 0
+; DWARFCFI-COMPAT-NEXT: .cfi_restore w30
+; DWARFCFI-COMPAT-NEXT: .LBB9_2: // %exit
+; DWARFCFI-COMPAT-NEXT: adrp x8, var
+; DWARFCFI-COMPAT-NEXT: mov w9, #42 // =0x2a
+; DWARFCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: shrink_wrap_sign_all:
+; DWARFCFI-V83A: // %bb.0: // %entry
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: cbnz w1, .LBB9_2
+; DWARFCFI-V83A-NEXT: // %bb.1: // %if.then
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: bl foo
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 0
+; DWARFCFI-V83A-NEXT: .cfi_restore w30
+; DWARFCFI-V83A-NEXT: .LBB9_2: // %exit
+; DWARFCFI-V83A-NEXT: adrp x8, var
+; DWARFCFI-V83A-NEXT: mov w9, #42 // =0x2a
+; DWARFCFI-V83A-NEXT: str x9, [x8, :lo12:var]
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: shrink_wrap_sign_all:
+; WINCFI-COMPAT: .seh_proc shrink_wrap_sign_all
+; WINCFI-COMPAT-NEXT: // %bb.0: // %entry
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: cbnz w1, .LBB9_2
+; WINCFI-COMPAT-NEXT: // %bb.1: // %if.then
+; WINCFI-COMPAT-NEXT: bl foo
+; WINCFI-COMPAT-NEXT: .LBB9_2: // %exit
+; WINCFI-COMPAT-NEXT: adrp x8, var
+; WINCFI-COMPAT-NEXT: mov w9, #42 // =0x2a
+; WINCFI-COMPAT-NEXT: str x9, [x8, :lo12:var]
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: shrink_wrap_sign_all:
+; WINCFI-V83A: .seh_proc shrink_wrap_sign_all
+; WINCFI-V83A-NEXT: // %bb.0: // %entry
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: cbnz w1, .LBB9_2
+; WINCFI-V83A-NEXT: // %bb.1: // %if.then
+; WINCFI-V83A-NEXT: bl foo
+; WINCFI-V83A-NEXT: .LBB9_2: // %exit
+; WINCFI-V83A-NEXT: adrp x8, var
+; WINCFI-V83A-NEXT: mov w9, #42 // =0x2a
+; WINCFI-V83A-NEXT: str x9, [x8, :lo12:var]
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
entry:
%cond.bool = icmp eq i32 %cond, 0
br i1 %cond.bool, label %if.then, label %exit
@@ -259,136 +537,332 @@ exit:
}
define i32 @leaf_sign_all_v83(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" {
-; CHECK-LABEL: leaf_sign_all_v83:
-; CHECK: // %bb.0:
-; CHECK-NEXT: paciasp
-; CHECK-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: retaa
+; DWARFCFI-LABEL: leaf_sign_all_v83:
+; DWARFCFI: // %bb.0:
+; DWARFCFI-NEXT: paciasp
+; DWARFCFI-NEXT: .cfi_negate_ra_state
+; DWARFCFI-NEXT: retaa
+;
+; WINCFI-LABEL: leaf_sign_all_v83:
+; WINCFI: .seh_proc leaf_sign_all_v83
+; WINCFI-NEXT: // %bb.0:
+; WINCFI-NEXT: pacibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endprologue
+; WINCFI-NEXT: .seh_startepilogue
+; WINCFI-NEXT: autibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endepilogue
+; WINCFI-NEXT: ret
+; WINCFI-NEXT: .seh_endfunclet
+; WINCFI-NEXT: .seh_endproc
ret i32 %x
}
declare fastcc i64 @bar(i64)
define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: spill_lr_and_tail_call:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT: .cfi_def_cfa_offset 16
-; COMPAT-NEXT: .cfi_offset w30, -16
-; COMPAT-NEXT: //APP
-; COMPAT-NEXT: mov x30, x0
-; COMPAT-NEXT: //NO_APP
-; COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: b bar
-;
-; V83A-LABEL: spill_lr_and_tail_call:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT: .cfi_def_cfa_offset 16
-; V83A-NEXT: .cfi_offset w30, -16
-; V83A-NEXT: //APP
-; V83A-NEXT: mov x30, x0
-; V83A-NEXT: //NO_APP
-; V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT: autiasp
-; V83A-NEXT: b bar
+; DWARFCFI-COMPAT-LABEL: spill_lr_and_tail_call:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT: .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT: //APP
+; DWARFCFI-COMPAT-NEXT: mov x30, x0
+; DWARFCFI-COMPAT-NEXT: //NO_APP
+; DWARFCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: b bar
+;
+; DWARFCFI-V83A-LABEL: spill_lr_and_tail_call:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT: .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT: .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT: //APP
+; DWARFCFI-V83A-NEXT: mov x30, x0
+; DWARFCFI-V83A-NEXT: //NO_APP
+; DWARFCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT: autiasp
+; DWARFCFI-V83A-NEXT: b bar
+;
+; WINCFI-COMPAT-LABEL: spill_lr_and_tail_call:
+; WINCFI-COMPAT: .seh_proc spill_lr_and_tail_call
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: //APP
+; WINCFI-COMPAT-NEXT: mov x30, x0
+; WINCFI-COMPAT-NEXT: //NO_APP
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: b bar
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: spill_lr_and_tail_call:
+; WINCFI-V83A: .seh_proc spill_lr_and_tail_call
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: //APP
+; WINCFI-V83A-NEXT: mov x30, x0
+; WINCFI-V83A-NEXT: //NO_APP
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT: .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: b bar
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
tail call fastcc i64 @bar(i64 %x)
ret void
}
define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" {
-; COMPAT-LABEL: leaf_sign_all_a_key:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_sign_all_a_key:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key:
+; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #25
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: hint #29
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_a_key:
+; WINCFI-V83A: .seh_proc leaf_sign_all_a_key
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: paciasp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: autiasp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
define i32 @leaf_sign_all_b_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" {
-; COMPAT-LABEL: leaf_sign_all_b_key:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: .cfi_b_key_frame
-; COMPAT-NEXT: hint #27
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: hint #31
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_sign_all_b_key:
-; V83A: // %bb.0:
-; V83A-NEXT: .cfi_b_key_frame
-; V83A-NEXT: pacibsp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: retab
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: .cfi_b_key_frame
+; DWARFCFI-COMPAT-NEXT: hint #27
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: hint #31
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: .cfi_b_key_frame
+; DWARFCFI-V83A-NEXT: pacibsp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: retab
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key:
+; WINCFI-COMPAT: .seh_proc leaf_sign_all_b_key
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_b_key:
+; WINCFI-V83A: .seh_proc leaf_sign_all_b_key
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
define i32 @leaf_sign_all_v83_b_key(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" {
-; CHECK-LABEL: leaf_sign_all_v83_b_key:
-; CHECK: // %bb.0:
-; CHECK-NEXT: .cfi_b_key_frame
-; CHECK-NEXT: pacibsp
-; CHECK-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: retab
+; DWARFCFI-LABEL: leaf_sign_all_v83_b_key:
+; DWARFCFI: // %bb.0:
+; DWARFCFI-NEXT: .cfi_b_key_frame
+; DWARFCFI-NEXT: pacibsp
+; DWARFCFI-NEXT: .cfi_negate_ra_state
+; DWARFCFI-NEXT: retab
+;
+; WINCFI-LABEL: leaf_sign_all_v83_b_key:
+; WINCFI: .seh_proc leaf_sign_all_v83_b_key
+; WINCFI-NEXT: // %bb.0:
+; WINCFI-NEXT: pacibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endprologue
+; WINCFI-NEXT: .seh_startepilogue
+; WINCFI-NEXT: autibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endepilogue
+; WINCFI-NEXT: ret
+; WINCFI-NEXT: .seh_endfunclet
+; WINCFI-NEXT: .seh_endproc
ret i32 %x
}
; Note that BTI instruction is not needed before PACIASP.
define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" "branch-target-enforcement"{
-; COMPAT-LABEL: leaf_sign_all_a_key_bti:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: hint #25
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: hint #29
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_sign_all_a_key_bti:
-; V83A: // %bb.0:
-; V83A-NEXT: paciasp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: hint #25
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: hint #29
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key_bti:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: paciasp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
+; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key_bti
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #25
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: hint #29
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_a_key_bti:
+; WINCFI-V83A: .seh_proc leaf_sign_all_a_key_bti
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: paciasp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: autiasp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
; Note that BTI instruction is not needed before PACIBSP.
define i32 @leaf_sign_all_b_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" "branch-target-enforcement"{
-; COMPAT-LABEL: leaf_sign_all_b_key_bti:
-; COMPAT: // %bb.0:
-; COMPAT-NEXT: .cfi_b_key_frame
-; COMPAT-NEXT: hint #27
-; COMPAT-NEXT: .cfi_negate_ra_state
-; COMPAT-NEXT: hint #31
-; COMPAT-NEXT: ret
-;
-; V83A-LABEL: leaf_sign_all_b_key_bti:
-; V83A: // %bb.0:
-; V83A-NEXT: .cfi_b_key_frame
-; V83A-NEXT: pacibsp
-; V83A-NEXT: .cfi_negate_ra_state
-; V83A-NEXT: retab
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:
+; DWARFCFI-COMPAT: // %bb.0:
+; DWARFCFI-COMPAT-NEXT: .cfi_b_key_frame
+; DWARFCFI-COMPAT-NEXT: hint #27
+; DWARFCFI-COMPAT-NEXT: .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT: hint #31
+; DWARFCFI-COMPAT-NEXT: ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key_bti:
+; DWARFCFI-V83A: // %bb.0:
+; DWARFCFI-V83A-NEXT: .cfi_b_key_frame
+; DWARFCFI-V83A-NEXT: pacibsp
+; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT: retab
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:
+; WINCFI-COMPAT: .seh_proc leaf_sign_all_b_key_bti
+; WINCFI-COMPAT-NEXT: // %bb.0:
+; WINCFI-COMPAT-NEXT: hint #27
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endprologue
+; WINCFI-COMPAT-NEXT: .seh_startepilogue
+; WINCFI-COMPAT-NEXT: hint #31
+; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT: .seh_endepilogue
+; WINCFI-COMPAT-NEXT: ret
+; WINCFI-COMPAT-NEXT: .seh_endfunclet
+; WINCFI-COMPAT-NEXT: .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_b_key_bti:
+; WINCFI-V83A: .seh_proc leaf_sign_all_b_key_bti
+; WINCFI-V83A-NEXT: // %bb.0:
+; WINCFI-V83A-NEXT: pacibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endprologue
+; WINCFI-V83A-NEXT: .seh_startepilogue
+; WINCFI-V83A-NEXT: autibsp
+; WINCFI-V83A-NEXT: .seh_pac_sign_lr
+; WINCFI-V83A-NEXT: .seh_endepilogue
+; WINCFI-V83A-NEXT: ret
+; WINCFI-V83A-NEXT: .seh_endfunclet
+; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
; Note that BTI instruction is not needed before PACIBSP.
define 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" {
-; CHECK-LABEL: leaf_sign_all_v83_b_key_bti:
-; CHECK: // %bb.0:
-; CHECK-NEXT: .cfi_b_key_frame
-; CHECK-NEXT: pacibsp
-; CHECK-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: retab
+; DWARFCFI-LABEL: leaf_sign_all_v83_b_key_bti:
+; DWARFCFI: // %bb.0:
+; DWARFCFI-NEXT: .cfi_b_key_frame
+; DWARFCFI-NEXT: pacibsp
+; DWARFCFI-NEXT: .cfi_negate_ra_state
+; DWARFCFI-NEXT: retab
+;
+; WINCFI-LABEL: leaf_sign_all_v83_b_key_bti:
+; WINCFI: .seh_proc leaf_sign_all_v83_b_key_bti
+; WINCFI-NEXT: // %bb.0:
+; WINCFI-NEXT: pacibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endprologue
+; WINCFI-NEXT: .seh_startepilogue
+; WINCFI-NEXT: autibsp
+; WINCFI-NEXT: .seh_pac_sign_lr
+; WINCFI-NEXT: .seh_endepilogue
+; WINCFI-NEXT: ret
+; WINCFI-NEXT: .seh_endfunclet
+; WINCFI-NEXT: .seh_endproc
ret i32 %x
}
More information about the llvm-commits
mailing list