Skip to content

Commit 4a7903c

Browse files
committed
[RISCV][CFI] add function epilogue cfi information
This patch adds CFI instructions in a function epilogue, that allows lldb to obtain a valid backtrace at the end of functions.
1 parent ac123f9 commit 4a7903c

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,18 +761,26 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
761761
const DebugLoc &DL, uint64_t StackSize,
762762
int64_t CFAOffset) const {
763763
const RISCVRegisterInfo *RI = STI.getRegisterInfo();
764+
const RISCVInstrInfo *TII = STI.getInstrInfo();
764765

765766
Register SPReg = getSPReg(STI);
766767

767768
RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed(StackSize),
768769
MachineInstr::FrameDestroy, getStackAlign());
770+
771+
unsigned CFIIndex =
772+
MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, CFAOffset));
773+
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
774+
.addCFIIndex(CFIIndex)
775+
.setMIFlag(MachineInstr::FrameDestroy);
769776
}
770777

771778
void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
772779
MachineBasicBlock &MBB) const {
773780
const RISCVRegisterInfo *RI = STI.getRegisterInfo();
774781
MachineFrameInfo &MFI = MF.getFrameInfo();
775782
auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>();
783+
const RISCVInstrInfo *TII = STI.getInstrInfo();
776784
Register FPReg = getFPReg(STI);
777785
Register SPReg = getSPReg(STI);
778786

@@ -826,7 +834,16 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
826834
if (!RestoreFP) {
827835
adjustStackForRVV(MF, MBB, LastFrameDestroy, DL, RVVStackSize,
828836
MachineInstr::FrameDestroy);
837+
838+
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfa(
839+
nullptr, RI->getDwarfRegNum(SPReg, true), RealStackSize));
840+
BuildMI(MBB, LastFrameDestroy, DL,
841+
TII->get(TargetOpcode::CFI_INSTRUCTION))
842+
.addCFIIndex(CFIIndex)
843+
.setMIFlag(MachineInstr::FrameDestroy);
829844
}
845+
846+
emitCalleeSavedRVVEpilogCFI(MBB, LastFrameDestroy);
830847
}
831848

832849
if (FirstSPAdjustAmount) {
@@ -841,6 +858,13 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
841858
RI->adjustReg(MBB, LastFrameDestroy, DL, SPReg, SPReg,
842859
StackOffset::getFixed(SecondSPAdjustAmount),
843860
MachineInstr::FrameDestroy, getStackAlign());
861+
862+
unsigned CFIIndex = MF.addFrameInst(
863+
MCCFIInstruction::cfiDefCfaOffset(nullptr, FirstSPAdjustAmount));
864+
BuildMI(MBB, LastFrameDestroy, DL,
865+
TII->get(TargetOpcode::CFI_INSTRUCTION))
866+
.addCFIIndex(CFIIndex)
867+
.setMIFlag(MachineInstr::FrameDestroy);
844868
}
845869
}
846870

@@ -860,6 +884,12 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
860884
RI->adjustReg(MBB, LastFrameDestroy, DL, SPReg, FPReg,
861885
StackOffset::getFixed(-FPOffset), MachineInstr::FrameDestroy,
862886
getStackAlign());
887+
888+
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfa(
889+
nullptr, RI->getDwarfRegNum(SPReg, true), RealStackSize));
890+
BuildMI(MBB, LastFrameDestroy, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
891+
.addCFIIndex(CFIIndex)
892+
.setMIFlag(MachineInstr::FrameDestroy);
863893
}
864894

865895
bool ApplyPop = RVFI->isPushable(MF) && MBBI != MBB.end() &&
@@ -878,6 +908,23 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
878908
/*stack_adj of cm.pop instr*/ RealStackSize - StackSize);
879909

880910
++MBBI;
911+
// Update CFA offset. After CM_POP SP should be equal to CFA, so CFA offset
912+
// is zero.
913+
unsigned CFIIndex =
914+
MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, 0));
915+
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
916+
.addCFIIndex(CFIIndex)
917+
.setMIFlag(MachineInstr::FrameDestroy);
918+
}
919+
920+
// Recover callee-saved registers.
921+
for (const auto &Entry : CSI) {
922+
Register Reg = Entry.getReg();
923+
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(
924+
nullptr, RI->getDwarfRegNum(Reg, true)));
925+
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
926+
.addCFIIndex(CFIIndex)
927+
.setMIFlag(MachineInstr::FrameDestroy);
881928
}
882929

883930
// Deallocate stack if we didn't already do it during cm.pop handling and
@@ -1616,6 +1663,28 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
16161663
}
16171664
}
16181665

1666+
void RISCVFrameLowering::emitCalleeSavedRVVEpilogCFI(
1667+
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const {
1668+
MachineFunction *MF = MBB.getParent();
1669+
const MachineFrameInfo &MFI = MF->getFrameInfo();
1670+
const RISCVRegisterInfo *RI = STI.getRegisterInfo();
1671+
const TargetInstrInfo &TII = *STI.getInstrInfo();
1672+
DebugLoc DL = MBB.findDebugLoc(MI);
1673+
1674+
const auto &RVVCSI = getRVVCalleeSavedInfo(*MF, MFI.getCalleeSavedInfo());
1675+
for (auto &CS : RVVCSI) {
1676+
int FI = CS.getFrameIdx();
1677+
if (FI >= 0 && MFI.getStackID(FI) == TargetStackID::ScalableVector) {
1678+
Register Reg = CS.getReg();
1679+
unsigned CFIIndex = MF->addFrameInst(MCCFIInstruction::createRestore(
1680+
nullptr, RI->getDwarfRegNum(Reg, true)));
1681+
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
1682+
.addCFIIndex(CFIIndex)
1683+
.setMIFlag(MachineInstr::FrameDestroy);
1684+
}
1685+
}
1686+
}
1687+
16191688
bool RISCVFrameLowering::restoreCalleeSavedRegisters(
16201689
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
16211690
MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {

llvm/lib/Target/RISCV/RISCVFrameLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class RISCVFrameLowering : public TargetFrameLowering {
9191
void emitCalleeSavedRVVPrologCFI(MachineBasicBlock &MBB,
9292
MachineBasicBlock::iterator MI,
9393
bool HasFP) const;
94+
void emitCalleeSavedRVVEpilogCFI(MachineBasicBlock &MBB,
95+
MachineBasicBlock::iterator MI) const;
9496
void deallocateStack(MachineFunction &MF, MachineBasicBlock &MBB,
9597
MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
9698
uint64_t StackSize, int64_t CFAOffset) const;

0 commit comments

Comments
 (0)