@@ -95,6 +95,11 @@ static const std::pair<MCPhysReg, int8_t> FixedCSRFIQCIInterruptMap[] = {
95
95
/* -21, -22, -23, -24 are reserved */
96
96
};
97
97
98
+ // / Returns true if DWARF CFI instructions ("frame moves") should be emitted.
99
+ static bool needsDwarfCFI (const MachineFunction &MF) {
100
+ return MF.needsFrameMoves ();
101
+ }
102
+
98
103
// For now we use x3, a.k.a gp, as pointer to shadow call stack.
99
104
// User should not use x3 in their asm.
100
105
static void emitSCSPrologue (MachineFunction &MF, MachineBasicBlock &MBB,
@@ -141,6 +146,9 @@ static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB,
141
146
.addImm (-SlotSize)
142
147
.setMIFlag (MachineInstr::FrameSetup);
143
148
149
+ if (!needsDwarfCFI (MF))
150
+ return ;
151
+
144
152
// Emit a CFI instruction that causes SlotSize to be subtracted from the value
145
153
// of the shadow stack pointer when unwinding past this frame.
146
154
char DwarfSCSReg = TRI->getDwarfRegNum (SCSPReg, /* IsEH*/ true );
@@ -199,8 +207,10 @@ static void emitSCSEpilogue(MachineFunction &MF, MachineBasicBlock &MBB,
199
207
.addReg (SCSPReg)
200
208
.addImm (-SlotSize)
201
209
.setMIFlag (MachineInstr::FrameDestroy);
202
- // Restore the SCS pointer
203
- CFIInstBuilder (MBB, MI, MachineInstr::FrameDestroy).buildRestore (SCSPReg);
210
+ if (needsDwarfCFI (MF)) {
211
+ // Restore the SCS pointer
212
+ CFIInstBuilder (MBB, MI, MachineInstr::FrameDestroy).buildRestore (SCSPReg);
213
+ }
204
214
}
205
215
206
216
// Insert instruction to swap mscratchsw with sp
@@ -935,6 +945,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
935
945
MBBI = std::prev (MBBI, getRVVCalleeSavedInfo (MF, CSI).size () +
936
946
getUnmanagedCSI (MF, CSI).size ());
937
947
CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::FrameSetup);
948
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
938
949
939
950
// If libcalls are used to spill and restore callee-saved registers, the frame
940
951
// has two sections; the opaque section managed by the libcalls, and the
@@ -962,10 +973,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
962
973
alignTo ((STI.getXLen () / 8 ) * LibCallRegs, getStackAlign ());
963
974
RVFI->setLibCallStackSize (LibCallFrameSize);
964
975
965
- CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
966
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
967
- CFIBuilder.buildOffset (CS.getReg (),
968
- MFI.getObjectOffset (CS.getFrameIdx ()));
976
+ if (NeedsDwarfCFI) {
977
+ CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
978
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
979
+ CFIBuilder.buildOffset (CS.getReg (),
980
+ MFI.getObjectOffset (CS.getFrameIdx ()));
981
+ }
969
982
}
970
983
971
984
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -996,14 +1009,17 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
996
1009
// could only be the next instruction.
997
1010
++PossiblePush;
998
1011
999
- // Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1000
- // could be. The PUSH will also get its own CFI metadata for its own
1001
- // modifications, which should come after the PUSH.
1002
- CFIInstBuilder PushCFIBuilder (MBB, PossiblePush, MachineInstr::FrameSetup);
1003
- PushCFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
1004
- for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
1005
- PushCFIBuilder.buildOffset (CS.getReg (),
1006
- MFI.getObjectOffset (CS.getFrameIdx ()));
1012
+ if (NeedsDwarfCFI) {
1013
+ // Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1014
+ // could be. The PUSH will also get its own CFI metadata for its own
1015
+ // modifications, which should come after the PUSH.
1016
+ CFIInstBuilder PushCFIBuilder (MBB, PossiblePush,
1017
+ MachineInstr::FrameSetup);
1018
+ PushCFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
1019
+ for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
1020
+ PushCFIBuilder.buildOffset (CS.getReg (),
1021
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1022
+ }
1007
1023
}
1008
1024
1009
1025
if (RVFI->isPushable (MF) && PossiblePush != MBB.end () &&
@@ -1017,10 +1033,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1017
1033
PossiblePush->getOperand (1 ).setImm (StackAdj);
1018
1034
StackSize -= StackAdj;
1019
1035
1020
- CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
1021
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1022
- CFIBuilder.buildOffset (CS.getReg (),
1023
- MFI.getObjectOffset (CS.getFrameIdx ()));
1036
+ if (NeedsDwarfCFI) {
1037
+ CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
1038
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1039
+ CFIBuilder.buildOffset (CS.getReg (),
1040
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1041
+ }
1024
1042
}
1025
1043
1026
1044
// Allocate space on the stack if necessary.
@@ -1031,7 +1049,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1031
1049
bool DynAllocation =
1032
1050
MF.getInfo <RISCVMachineFunctionInfo>()->hasDynamicAllocation ();
1033
1051
if (StackSize != 0 )
1034
- allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, /* EmitCFI= */ true ,
1052
+ allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, NeedsDwarfCFI ,
1035
1053
NeedProbe, ProbeSize, DynAllocation,
1036
1054
MachineInstr::FrameSetup);
1037
1055
@@ -1049,8 +1067,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1049
1067
1050
1068
// Iterate over list of callee-saved registers and emit .cfi_offset
1051
1069
// directives.
1052
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1053
- CFIBuilder.buildOffset (CS.getReg (), MFI.getObjectOffset (CS.getFrameIdx ()));
1070
+ if (NeedsDwarfCFI)
1071
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1072
+ CFIBuilder.buildOffset (CS.getReg (),
1073
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1054
1074
1055
1075
// Generate new FP.
1056
1076
if (hasFP (MF)) {
@@ -1069,7 +1089,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1069
1089
MachineInstr::FrameSetup, getStackAlign ());
1070
1090
}
1071
1091
1072
- CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
1092
+ if (NeedsDwarfCFI)
1093
+ CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
1073
1094
}
1074
1095
1075
1096
uint64_t SecondSPAdjustAmount = 0 ;
@@ -1080,15 +1101,16 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1080
1101
" SecondSPAdjustAmount should be greater than zero" );
1081
1102
1082
1103
allocateStack (MBB, MBBI, MF, SecondSPAdjustAmount,
1083
- getStackSizeWithRVVPadding (MF), !hasFP (MF), NeedProbe,
1084
- ProbeSize, DynAllocation, MachineInstr::FrameSetup);
1104
+ getStackSizeWithRVVPadding (MF), NeedsDwarfCFI && !hasFP (MF),
1105
+ NeedProbe, ProbeSize, DynAllocation,
1106
+ MachineInstr::FrameSetup);
1085
1107
}
1086
1108
1087
1109
if (RVVStackSize) {
1088
1110
if (NeedProbe) {
1089
1111
allocateAndProbeStackForRVV (MF, MBB, MBBI, DL, RVVStackSize,
1090
- MachineInstr::FrameSetup, ! hasFP (MF),
1091
- DynAllocation);
1112
+ MachineInstr::FrameSetup,
1113
+ NeedsDwarfCFI && ! hasFP (MF), DynAllocation);
1092
1114
} else {
1093
1115
// We must keep the stack pointer aligned through any intermediate
1094
1116
// updates.
@@ -1097,14 +1119,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1097
1119
MachineInstr::FrameSetup, getStackAlign ());
1098
1120
}
1099
1121
1100
- if (!hasFP (MF)) {
1122
+ if (NeedsDwarfCFI && !hasFP (MF)) {
1101
1123
// Emit .cfi_def_cfa_expression "sp + StackSize + RVVStackSize * vlenb".
1102
1124
CFIBuilder.insertCFIInst (createDefCFAExpression (
1103
1125
*RI, SPReg, getStackSizeWithRVVPadding (MF), RVVStackSize / 8 ));
1104
1126
}
1105
1127
1106
1128
std::advance (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
1107
- emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
1129
+ if (NeedsDwarfCFI)
1130
+ emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
1108
1131
}
1109
1132
1110
1133
if (hasFP (MF)) {
@@ -1171,8 +1194,9 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
1171
1194
MachineInstr::FrameDestroy, getStackAlign ());
1172
1195
StackSize = 0 ;
1173
1196
1174
- CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1175
- .buildDefCFAOffset (CFAOffset);
1197
+ if (needsDwarfCFI (MF))
1198
+ CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1199
+ .buildDefCFAOffset (CFAOffset);
1176
1200
}
1177
1201
1178
1202
void RISCVFrameLowering::emitEpilogue (MachineFunction &MF,
@@ -1212,6 +1236,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1212
1236
std::next (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
1213
1237
CFIInstBuilder CFIBuilder (MBB, FirstScalarCSRRestoreInsn,
1214
1238
MachineInstr::FrameDestroy);
1239
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
1215
1240
1216
1241
uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount (MF);
1217
1242
uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
@@ -1232,10 +1257,11 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1232
1257
StackOffset::getScalable (RVVStackSize),
1233
1258
MachineInstr::FrameDestroy, getStackAlign ());
1234
1259
1235
- if (!hasFP (MF))
1236
- CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1237
-
1238
- emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1260
+ if (NeedsDwarfCFI) {
1261
+ if (!hasFP (MF))
1262
+ CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1263
+ emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1264
+ }
1239
1265
}
1240
1266
1241
1267
if (FirstSPAdjustAmount) {
@@ -1251,7 +1277,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1251
1277
StackOffset::getFixed (SecondSPAdjustAmount),
1252
1278
MachineInstr::FrameDestroy, getStackAlign ());
1253
1279
1254
- if (!hasFP (MF))
1280
+ if (NeedsDwarfCFI && !hasFP (MF))
1255
1281
CFIBuilder.buildDefCFAOffset (FirstSPAdjustAmount);
1256
1282
}
1257
1283
@@ -1272,7 +1298,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1272
1298
getStackAlign ());
1273
1299
}
1274
1300
1275
- if (hasFP (MF))
1301
+ if (NeedsDwarfCFI && hasFP (MF))
1276
1302
CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1277
1303
1278
1304
// Skip to after the restores of scalar callee-saved registers
@@ -1295,8 +1321,9 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1295
1321
}
1296
1322
1297
1323
// Recover callee-saved registers.
1298
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1299
- CFIBuilder.buildRestore (CS.getReg ());
1324
+ if (NeedsDwarfCFI)
1325
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1326
+ CFIBuilder.buildRestore (CS.getReg ());
1300
1327
1301
1328
if (RVFI->isPushable (MF) && MBBI != MBB.end () && isPop (MBBI->getOpcode ())) {
1302
1329
// Use available stack adjustment in pop instruction to deallocate stack
@@ -1315,15 +1342,17 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1315
1342
auto NextI = next_nodbg (MBBI, MBB.end ());
1316
1343
if (NextI == MBB.end () || NextI->getOpcode () != RISCV::PseudoRET) {
1317
1344
++MBBI;
1318
- CFIBuilder.setInsertPoint (MBBI);
1345
+ if (NeedsDwarfCFI) {
1346
+ CFIBuilder.setInsertPoint (MBBI);
1319
1347
1320
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1321
- CFIBuilder.buildRestore (CS.getReg ());
1348
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1349
+ CFIBuilder.buildRestore (CS.getReg ());
1322
1350
1323
- // Update CFA Offset. If this is a QCI interrupt function, there will be a
1324
- // leftover offset which is deallocated by `QC.C.MILEAVERET`, otherwise
1325
- // getQCIInterruptStackSize() will be 0.
1326
- CFIBuilder.buildDefCFAOffset (RVFI->getQCIInterruptStackSize ());
1351
+ // Update CFA Offset. If this is a QCI interrupt function, there will
1352
+ // be a leftover offset which is deallocated by `QC.C.MILEAVERET`,
1353
+ // otherwise getQCIInterruptStackSize() will be 0.
1354
+ CFIBuilder.buildDefCFAOffset (RVFI->getQCIInterruptStackSize ());
1355
+ }
1327
1356
}
1328
1357
}
1329
1358
@@ -1812,7 +1841,8 @@ MachineBasicBlock::iterator RISCVFrameLowering::eliminateCallFramePseudoInstr(
1812
1841
// allocateStack.
1813
1842
bool DynAllocation =
1814
1843
MF.getInfo <RISCVMachineFunctionInfo>()->hasDynamicAllocation ();
1815
- allocateStack (MBB, MI, MF, -Amount, -Amount, !hasFP (MF),
1844
+ allocateStack (MBB, MI, MF, -Amount, -Amount,
1845
+ needsDwarfCFI (MF) && !hasFP (MF),
1816
1846
/* NeedProbe=*/ true , ProbeSize, DynAllocation,
1817
1847
MachineInstr::NoFlags);
1818
1848
} else {
0 commit comments