[llvm] r348035 - AArch64: Don't emit CFI for SCS register in nounwind functions.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 30 13:04:25 PST 2018
Author: pcc
Date: Fri Nov 30 13:04:25 2018
New Revision: 348035
URL: http://llvm.org/viewvc/llvm-project?rev=348035&view=rev
Log:
AArch64: Don't emit CFI for SCS register in nounwind functions.
All that you can legitimately do with the CFI for a nounwind function
is get a backtrace, and adjusting the SCS register is not (currently)
required for this purpose.
Differential Revision: https://reviews.llvm.org/D54988
Modified:
llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp
llvm/trunk/test/CodeGen/AArch64/shadow-call-stack.ll
Modified: llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp?rev=348035&r1=348034&r2=348035&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64FrameLowering.cpp Fri Nov 30 13:04:25 2018
@@ -1733,20 +1733,22 @@ bool AArch64FrameLowering::spillCalleeSa
BuildMI(MBB, MI, DL, TII.get(AArch64::SEH_Nop))
.setMIFlag(MachineInstr::FrameSetup);
- // Emit a CFI instruction that causes 8 to be subtracted from the value of
- // x18 when unwinding past this frame.
- static const char CFIInst[] = {
- dwarf::DW_CFA_val_expression,
- 18, // register
- 2, // length
- static_cast<char>(unsigned(dwarf::DW_OP_breg18)),
- static_cast<char>(-8) & 0x7f, // addend (sleb128)
- };
- unsigned CFIIndex =
- MF.addFrameInst(MCCFIInstruction::createEscape(nullptr, CFIInst));
- BuildMI(MBB, MI, DL, TII.get(AArch64::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex)
- .setMIFlag(MachineInstr::FrameSetup);
+ if (!MF.getFunction().hasFnAttribute(Attribute::NoUnwind)) {
+ // Emit a CFI instruction that causes 8 to be subtracted from the value of
+ // x18 when unwinding past this frame.
+ static const char CFIInst[] = {
+ dwarf::DW_CFA_val_expression,
+ 18, // register
+ 2, // length
+ static_cast<char>(unsigned(dwarf::DW_OP_breg18)),
+ static_cast<char>(-8) & 0x7f, // addend (sleb128)
+ };
+ unsigned CFIIndex =
+ MF.addFrameInst(MCCFIInstruction::createEscape(nullptr, CFIInst));
+ BuildMI(MBB, MI, DL, TII.get(AArch64::CFI_INSTRUCTION))
+ .addCFIIndex(CFIIndex)
+ .setMIFlag(MachineInstr::FrameSetup);
+ }
// This instruction also makes x18 live-in to the entry block.
MBB.addLiveIn(AArch64::X18);
Modified: llvm/trunk/test/CodeGen/AArch64/shadow-call-stack.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/shadow-call-stack.ll?rev=348035&r1=348034&r2=348035&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/shadow-call-stack.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/shadow-call-stack.ll Fri Nov 30 13:04:25 2018
@@ -46,3 +46,11 @@ define i32 @f4() shadowcallstack {
; CHECK: ret
ret i32 %res1234
}
+
+define i32 @f5() shadowcallstack nounwind {
+ ; CHECK: f5:
+ ; CHECK-NOT: .cfi_escape
+ %res = call i32 @bar()
+ %res1 = add i32 %res, 1
+ ret i32 %res
+}
More information about the llvm-commits
mailing list