@@ -761,18 +761,26 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
761
761
const DebugLoc &DL, uint64_t StackSize,
762
762
int64_t CFAOffset) const {
763
763
const RISCVRegisterInfo *RI = STI.getRegisterInfo ();
764
+ const RISCVInstrInfo *TII = STI.getInstrInfo ();
764
765
765
766
Register SPReg = getSPReg (STI);
766
767
767
768
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed (StackSize),
768
769
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);
769
776
}
770
777
771
778
void RISCVFrameLowering::emitEpilogue (MachineFunction &MF,
772
779
MachineBasicBlock &MBB) const {
773
780
const RISCVRegisterInfo *RI = STI.getRegisterInfo ();
774
781
MachineFrameInfo &MFI = MF.getFrameInfo ();
775
782
auto *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
783
+ const RISCVInstrInfo *TII = STI.getInstrInfo ();
776
784
Register FPReg = getFPReg (STI);
777
785
Register SPReg = getSPReg (STI);
778
786
@@ -826,7 +834,16 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
826
834
if (!RestoreFP) {
827
835
adjustStackForRVV (MF, MBB, LastFrameDestroy, DL, RVVStackSize,
828
836
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);
829
844
}
845
+
846
+ emitCalleeSavedRVVEpilogCFI (MBB, LastFrameDestroy);
830
847
}
831
848
832
849
if (FirstSPAdjustAmount) {
@@ -841,6 +858,13 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
841
858
RI->adjustReg (MBB, LastFrameDestroy, DL, SPReg, SPReg,
842
859
StackOffset::getFixed (SecondSPAdjustAmount),
843
860
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);
844
868
}
845
869
}
846
870
@@ -860,6 +884,12 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
860
884
RI->adjustReg (MBB, LastFrameDestroy, DL, SPReg, FPReg,
861
885
StackOffset::getFixed (-FPOffset), MachineInstr::FrameDestroy,
862
886
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);
863
893
}
864
894
865
895
bool ApplyPop = RVFI->isPushable (MF) && MBBI != MBB.end () &&
@@ -878,6 +908,23 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
878
908
/* stack_adj of cm.pop instr*/ RealStackSize - StackSize);
879
909
880
910
++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);
881
928
}
882
929
883
930
// Deallocate stack if we didn't already do it during cm.pop handling and
@@ -1616,6 +1663,28 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
1616
1663
}
1617
1664
}
1618
1665
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
+
1619
1688
bool RISCVFrameLowering::restoreCalleeSavedRegisters (
1620
1689
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1621
1690
MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
0 commit comments