@@ -92,6 +92,11 @@ static const std::pair<MCPhysReg, int8_t> FixedCSRFIQCIInterruptMap[] = {
92
92
/* -21, -22, -23, -24 are reserved */
93
93
};
94
94
95
+ // / Returns true if DWARF CFI instructions ("frame moves") should be emitted.
96
+ static bool needsDwarfCFI (const MachineFunction &MF) {
97
+ return MF.needsFrameMoves ();
98
+ }
99
+
95
100
// For now we use x3, a.k.a gp, as pointer to shadow call stack.
96
101
// User should not use x3 in their asm.
97
102
static void emitSCSPrologue (MachineFunction &MF, MachineBasicBlock &MBB,
@@ -138,6 +143,9 @@ static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB,
138
143
.addImm (-SlotSize)
139
144
.setMIFlag (MachineInstr::FrameSetup);
140
145
146
+ if (!needsDwarfCFI (MF))
147
+ return ;
148
+
141
149
// Emit a CFI instruction that causes SlotSize to be subtracted from the value
142
150
// of the shadow stack pointer when unwinding past this frame.
143
151
char DwarfSCSReg = TRI->getDwarfRegNum (SCSPReg, /* IsEH*/ true );
@@ -196,8 +204,10 @@ static void emitSCSEpilogue(MachineFunction &MF, MachineBasicBlock &MBB,
196
204
.addReg (SCSPReg)
197
205
.addImm (-SlotSize)
198
206
.setMIFlag (MachineInstr::FrameDestroy);
199
- // Restore the SCS pointer
200
- CFIInstBuilder (MBB, MI, MachineInstr::FrameDestroy).buildRestore (SCSPReg);
207
+ if (needsDwarfCFI (MF)) {
208
+ // Restore the SCS pointer
209
+ CFIInstBuilder (MBB, MI, MachineInstr::FrameDestroy).buildRestore (SCSPReg);
210
+ }
201
211
}
202
212
203
213
// Get the ID of the libcall used for spilling and restoring callee saved
@@ -782,6 +792,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
782
792
MBBI = std::prev (MBBI, getRVVCalleeSavedInfo (MF, CSI).size () +
783
793
getUnmanagedCSI (MF, CSI).size ());
784
794
CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::FrameSetup);
795
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
785
796
786
797
// If libcalls are used to spill and restore callee-saved registers, the frame
787
798
// has two sections; the opaque section managed by the libcalls, and the
@@ -809,10 +820,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
809
820
alignTo ((STI.getXLen () / 8 ) * LibCallRegs, getStackAlign ());
810
821
RVFI->setLibCallStackSize (LibCallFrameSize);
811
822
812
- CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
813
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
814
- CFIBuilder.buildOffset (CS.getReg (),
815
- MFI.getObjectOffset (CS.getFrameIdx ()));
823
+ if (NeedsDwarfCFI) {
824
+ CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
825
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
826
+ CFIBuilder.buildOffset (CS.getReg (),
827
+ MFI.getObjectOffset (CS.getFrameIdx ()));
828
+ }
816
829
}
817
830
818
831
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -839,10 +852,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
839
852
}
840
853
841
854
if (RVFI->useQCIInterrupt (MF)) {
842
- CFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
843
- for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
844
- CFIBuilder.buildOffset (CS.getReg (),
845
- MFI.getObjectOffset (CS.getFrameIdx ()));
855
+ if (NeedsDwarfCFI) {
856
+ CFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
857
+ for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
858
+ CFIBuilder.buildOffset (CS.getReg (),
859
+ MFI.getObjectOffset (CS.getFrameIdx ()));
860
+ }
846
861
} else if (RVFI->isPushable (MF) && FirstFrameSetup != MBB.end () &&
847
862
isPush (FirstFrameSetup->getOpcode ())) {
848
863
// Use available stack adjustment in push instruction to allocate additional
@@ -854,10 +869,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
854
869
FirstFrameSetup->getOperand (1 ).setImm (StackAdj);
855
870
StackSize -= StackAdj;
856
871
857
- CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
858
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
859
- CFIBuilder.buildOffset (CS.getReg (),
860
- MFI.getObjectOffset (CS.getFrameIdx ()));
872
+ if (NeedsDwarfCFI) {
873
+ CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
874
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
875
+ CFIBuilder.buildOffset (CS.getReg (),
876
+ MFI.getObjectOffset (CS.getFrameIdx ()));
877
+ }
861
878
}
862
879
863
880
// Allocate space on the stack if necessary.
@@ -868,7 +885,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
868
885
bool DynAllocation =
869
886
MF.getInfo <RISCVMachineFunctionInfo>()->hasDynamicAllocation ();
870
887
if (StackSize != 0 )
871
- allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, /* EmitCFI= */ true ,
888
+ allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, NeedsDwarfCFI ,
872
889
NeedProbe, ProbeSize, DynAllocation);
873
890
874
891
// The frame pointer is callee-saved, and code has been generated for us to
@@ -882,8 +899,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
882
899
883
900
// Iterate over list of callee-saved registers and emit .cfi_offset
884
901
// directives.
885
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
886
- CFIBuilder.buildOffset (CS.getReg (), MFI.getObjectOffset (CS.getFrameIdx ()));
902
+ if (NeedsDwarfCFI)
903
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
904
+ CFIBuilder.buildOffset (CS.getReg (),
905
+ MFI.getObjectOffset (CS.getFrameIdx ()));
887
906
888
907
// Generate new FP.
889
908
if (hasFP (MF)) {
@@ -902,7 +921,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
902
921
MachineInstr::FrameSetup, getStackAlign ());
903
922
}
904
923
905
- CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
924
+ if (NeedsDwarfCFI)
925
+ CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
906
926
}
907
927
908
928
uint64_t SecondSPAdjustAmount = 0 ;
@@ -913,15 +933,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
913
933
" SecondSPAdjustAmount should be greater than zero" );
914
934
915
935
allocateStack (MBB, MBBI, MF, SecondSPAdjustAmount,
916
- getStackSizeWithRVVPadding (MF), !hasFP (MF), NeedProbe ,
917
- ProbeSize, DynAllocation);
936
+ getStackSizeWithRVVPadding (MF), NeedsDwarfCFI && !hasFP (MF),
937
+ NeedProbe, ProbeSize, DynAllocation);
918
938
}
919
939
920
940
if (RVVStackSize) {
921
941
if (NeedProbe) {
922
942
allocateAndProbeStackForRVV (MF, MBB, MBBI, DL, RVVStackSize,
923
- MachineInstr::FrameSetup, ! hasFP (MF),
924
- DynAllocation);
943
+ MachineInstr::FrameSetup,
944
+ NeedsDwarfCFI && ! hasFP (MF), DynAllocation);
925
945
} else {
926
946
// We must keep the stack pointer aligned through any intermediate
927
947
// updates.
@@ -930,14 +950,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
930
950
MachineInstr::FrameSetup, getStackAlign ());
931
951
}
932
952
933
- if (!hasFP (MF)) {
953
+ if (NeedsDwarfCFI && !hasFP (MF)) {
934
954
// Emit .cfi_def_cfa_expression "sp + StackSize + RVVStackSize * vlenb".
935
955
CFIBuilder.insertCFIInst (createDefCFAExpression (
936
956
*RI, SPReg, getStackSizeWithRVVPadding (MF), RVVStackSize / 8 ));
937
957
}
938
958
939
959
std::advance (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
940
- emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
960
+ if (NeedsDwarfCFI)
961
+ emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
941
962
}
942
963
943
964
if (hasFP (MF)) {
@@ -1004,8 +1025,9 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
1004
1025
MachineInstr::FrameDestroy, getStackAlign ());
1005
1026
StackSize = 0 ;
1006
1027
1007
- CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1008
- .buildDefCFAOffset (CFAOffset);
1028
+ if (needsDwarfCFI (MF))
1029
+ CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1030
+ .buildDefCFAOffset (CFAOffset);
1009
1031
}
1010
1032
1011
1033
void RISCVFrameLowering::emitEpilogue (MachineFunction &MF,
@@ -1045,6 +1067,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1045
1067
std::next (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
1046
1068
CFIInstBuilder CFIBuilder (MBB, FirstScalarCSRRestoreInsn,
1047
1069
MachineInstr::FrameDestroy);
1070
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
1048
1071
1049
1072
uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount (MF);
1050
1073
uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
@@ -1065,10 +1088,11 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1065
1088
StackOffset::getScalable (RVVStackSize),
1066
1089
MachineInstr::FrameDestroy, getStackAlign ());
1067
1090
1068
- if (!hasFP (MF))
1069
- CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1070
-
1071
- emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1091
+ if (NeedsDwarfCFI) {
1092
+ if (!hasFP (MF))
1093
+ CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1094
+ emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1095
+ }
1072
1096
}
1073
1097
1074
1098
if (FirstSPAdjustAmount) {
@@ -1084,7 +1108,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1084
1108
StackOffset::getFixed (SecondSPAdjustAmount),
1085
1109
MachineInstr::FrameDestroy, getStackAlign ());
1086
1110
1087
- if (!hasFP (MF))
1111
+ if (NeedsDwarfCFI && !hasFP (MF))
1088
1112
CFIBuilder.buildDefCFAOffset (FirstSPAdjustAmount);
1089
1113
}
1090
1114
@@ -1105,7 +1129,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1105
1129
getStackAlign ());
1106
1130
}
1107
1131
1108
- if (hasFP (MF))
1132
+ if (NeedsDwarfCFI && hasFP (MF))
1109
1133
CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1110
1134
1111
1135
// Skip to after the restores of scalar callee-saved registers
@@ -1128,8 +1152,9 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1128
1152
}
1129
1153
1130
1154
// Recover callee-saved registers.
1131
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1132
- CFIBuilder.buildRestore (CS.getReg ());
1155
+ if (NeedsDwarfCFI)
1156
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1157
+ CFIBuilder.buildRestore (CS.getReg ());
1133
1158
1134
1159
if (RVFI->isPushable (MF) && MBBI != MBB.end () && isPop (MBBI->getOpcode ())) {
1135
1160
// Use available stack adjustment in pop instruction to deallocate stack
@@ -1148,14 +1173,16 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1148
1173
auto NextI = next_nodbg (MBBI, MBB.end ());
1149
1174
if (NextI == MBB.end () || NextI->getOpcode () != RISCV::PseudoRET) {
1150
1175
++MBBI;
1151
- CFIBuilder.setInsertPoint (MBBI);
1176
+ if (NeedsDwarfCFI) {
1177
+ CFIBuilder.setInsertPoint (MBBI);
1152
1178
1153
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1154
- CFIBuilder.buildRestore (CS.getReg ());
1179
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1180
+ CFIBuilder.buildRestore (CS.getReg ());
1155
1181
1156
- // Update CFA offset. After CM_POP SP should be equal to CFA, so CFA
1157
- // offset should be a zero.
1158
- CFIBuilder.buildDefCFAOffset (0 );
1182
+ // Update CFA offset. After CM_POP SP should be equal to CFA, so CFA
1183
+ // offset should be a zero.
1184
+ CFIBuilder.buildDefCFAOffset (0 );
1185
+ }
1159
1186
}
1160
1187
}
1161
1188
0 commit comments