@@ -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
771778void 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
@@ -823,9 +831,19 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
823831 if (RVVStackSize) {
824832 // If RestoreFP the stack pointer will be restored using the frame pointer
825833 // value.
826- if (!RestoreFP)
834+ 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);
844+ }
845+
846+ emitCalleeSavedRVVEpilogCFI (MBB, LastFrameDestroy);
829847 }
830848
831849 if (FirstSPAdjustAmount) {
@@ -836,10 +854,18 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
836854
837855 // If RestoreFP the stack pointer will be restored using the frame pointer
838856 // value.
839- if (!RestoreFP)
857+ if (!RestoreFP) {
840858 RI->adjustReg (MBB, LastFrameDestroy, DL, SPReg, SPReg,
841859 StackOffset::getFixed (SecondSPAdjustAmount),
842860 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);
868+ }
843869 }
844870
845871 // Restore the stack pointer using the value of the frame pointer. Only
@@ -858,6 +884,12 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
858884 RI->adjustReg (MBB, LastFrameDestroy, DL, SPReg, FPReg,
859885 StackOffset::getFixed (-FPOffset), MachineInstr::FrameDestroy,
860886 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);
861893 }
862894
863895 bool ApplyPop = RVFI->isPushable (MF) && MBBI != MBB.end () &&
@@ -876,6 +908,23 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
876908 /* stack_adj of cm.pop instr*/ RealStackSize - StackSize);
877909
878910 ++MBBI;
911+ // Update CFA offset. After CM_POP SP should be equal to CFA, so CFA offset
912+ // should be a 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);
879928 }
880929
881930 // Deallocate stack if we didn't already do it during cm.pop handling and
@@ -1614,6 +1663,28 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
16141663 }
16151664}
16161665
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+
16171688bool RISCVFrameLowering::restoreCalleeSavedRegisters (
16181689 MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
16191690 MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
0 commit comments