@@ -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
@@ -937,6 +947,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
937
947
MBBI = std::prev (MBBI, getRVVCalleeSavedInfo (MF, CSI).size () +
938
948
getUnmanagedCSI (MF, CSI).size ());
939
949
CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::FrameSetup);
950
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
940
951
941
952
// If libcalls are used to spill and restore callee-saved registers, the frame
942
953
// has two sections; the opaque section managed by the libcalls, and the
@@ -964,10 +975,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
964
975
alignTo ((STI.getXLen () / 8 ) * LibCallRegs, getStackAlign ());
965
976
RVFI->setLibCallStackSize (LibCallFrameSize);
966
977
967
- CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
968
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
969
- CFIBuilder.buildOffset (CS.getReg (),
970
- MFI.getObjectOffset (CS.getFrameIdx ()));
978
+ if (NeedsDwarfCFI) {
979
+ CFIBuilder.buildDefCFAOffset (LibCallFrameSize);
980
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
981
+ CFIBuilder.buildOffset (CS.getReg (),
982
+ MFI.getObjectOffset (CS.getFrameIdx ()));
983
+ }
971
984
}
972
985
973
986
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -998,14 +1011,17 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
998
1011
// could only be the next instruction.
999
1012
++PossiblePush;
1000
1013
1001
- // Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1002
- // could be. The PUSH will also get its own CFI metadata for its own
1003
- // modifications, which should come after the PUSH.
1004
- CFIInstBuilder PushCFIBuilder (MBB, PossiblePush, MachineInstr::FrameSetup);
1005
- PushCFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
1006
- for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
1007
- PushCFIBuilder.buildOffset (CS.getReg (),
1008
- MFI.getObjectOffset (CS.getFrameIdx ()));
1014
+ if (NeedsDwarfCFI) {
1015
+ // Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1016
+ // could be. The PUSH will also get its own CFI metadata for its own
1017
+ // modifications, which should come after the PUSH.
1018
+ CFIInstBuilder PushCFIBuilder (MBB, PossiblePush,
1019
+ MachineInstr::FrameSetup);
1020
+ PushCFIBuilder.buildDefCFAOffset (QCIInterruptPushAmount);
1021
+ for (const CalleeSavedInfo &CS : getQCISavedInfo (MF, CSI))
1022
+ PushCFIBuilder.buildOffset (CS.getReg (),
1023
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1024
+ }
1009
1025
}
1010
1026
1011
1027
if (RVFI->isPushable (MF) && PossiblePush != MBB.end () &&
@@ -1019,10 +1035,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1019
1035
PossiblePush->getOperand (1 ).setImm (StackAdj);
1020
1036
StackSize -= StackAdj;
1021
1037
1022
- CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
1023
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1024
- CFIBuilder.buildOffset (CS.getReg (),
1025
- MFI.getObjectOffset (CS.getFrameIdx ()));
1038
+ if (NeedsDwarfCFI) {
1039
+ CFIBuilder.buildDefCFAOffset (RealStackSize - StackSize);
1040
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1041
+ CFIBuilder.buildOffset (CS.getReg (),
1042
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1043
+ }
1026
1044
}
1027
1045
1028
1046
// Allocate space on the stack if necessary.
@@ -1033,7 +1051,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1033
1051
bool DynAllocation =
1034
1052
MF.getInfo <RISCVMachineFunctionInfo>()->hasDynamicAllocation ();
1035
1053
if (StackSize != 0 )
1036
- allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, /* EmitCFI= */ true ,
1054
+ allocateStack (MBB, MBBI, MF, StackSize, RealStackSize, NeedsDwarfCFI ,
1037
1055
NeedProbe, ProbeSize, DynAllocation);
1038
1056
1039
1057
// Save SiFive CLIC CSRs into Stack
@@ -1050,8 +1068,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1050
1068
1051
1069
// Iterate over list of callee-saved registers and emit .cfi_offset
1052
1070
// directives.
1053
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1054
- CFIBuilder.buildOffset (CS.getReg (), MFI.getObjectOffset (CS.getFrameIdx ()));
1071
+ if (NeedsDwarfCFI)
1072
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1073
+ CFIBuilder.buildOffset (CS.getReg (),
1074
+ MFI.getObjectOffset (CS.getFrameIdx ()));
1055
1075
1056
1076
// Generate new FP.
1057
1077
if (hasFP (MF)) {
@@ -1070,7 +1090,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1070
1090
MachineInstr::FrameSetup, getStackAlign ());
1071
1091
}
1072
1092
1073
- CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
1093
+ if (NeedsDwarfCFI)
1094
+ CFIBuilder.buildDefCFA (FPReg, RVFI->getVarArgsSaveSize ());
1074
1095
}
1075
1096
1076
1097
uint64_t SecondSPAdjustAmount = 0 ;
@@ -1081,15 +1102,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1081
1102
" SecondSPAdjustAmount should be greater than zero" );
1082
1103
1083
1104
allocateStack (MBB, MBBI, MF, SecondSPAdjustAmount,
1084
- getStackSizeWithRVVPadding (MF), !hasFP (MF), NeedProbe ,
1085
- ProbeSize, DynAllocation);
1105
+ getStackSizeWithRVVPadding (MF), NeedsDwarfCFI && !hasFP (MF),
1106
+ NeedProbe, ProbeSize, DynAllocation);
1086
1107
}
1087
1108
1088
1109
if (RVVStackSize) {
1089
1110
if (NeedProbe) {
1090
1111
allocateAndProbeStackForRVV (MF, MBB, MBBI, DL, RVVStackSize,
1091
- MachineInstr::FrameSetup, ! hasFP (MF),
1092
- DynAllocation);
1112
+ MachineInstr::FrameSetup,
1113
+ NeedsDwarfCFI && ! hasFP (MF), DynAllocation);
1093
1114
} else {
1094
1115
// We must keep the stack pointer aligned through any intermediate
1095
1116
// updates.
@@ -1098,14 +1119,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1098
1119
MachineInstr::FrameSetup, getStackAlign ());
1099
1120
}
1100
1121
1101
- if (!hasFP (MF)) {
1122
+ if (NeedsDwarfCFI && !hasFP (MF)) {
1102
1123
// Emit .cfi_def_cfa_expression "sp + StackSize + RVVStackSize * vlenb".
1103
1124
CFIBuilder.insertCFIInst (createDefCFAExpression (
1104
1125
*RI, SPReg, getStackSizeWithRVVPadding (MF), RVVStackSize / 8 ));
1105
1126
}
1106
1127
1107
1128
std::advance (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
1108
- emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
1129
+ if (NeedsDwarfCFI)
1130
+ emitCalleeSavedRVVPrologCFI (MBB, MBBI, hasFP (MF));
1109
1131
}
1110
1132
1111
1133
if (hasFP (MF)) {
@@ -1172,8 +1194,9 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
1172
1194
MachineInstr::FrameDestroy, getStackAlign ());
1173
1195
StackSize = 0 ;
1174
1196
1175
- CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1176
- .buildDefCFAOffset (CFAOffset);
1197
+ if (needsDwarfCFI (MF))
1198
+ CFIInstBuilder (MBB, MBBI, MachineInstr::FrameDestroy)
1199
+ .buildDefCFAOffset (CFAOffset);
1177
1200
}
1178
1201
1179
1202
void RISCVFrameLowering::emitEpilogue (MachineFunction &MF,
@@ -1213,6 +1236,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1213
1236
std::next (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
1214
1237
CFIInstBuilder CFIBuilder (MBB, FirstScalarCSRRestoreInsn,
1215
1238
MachineInstr::FrameDestroy);
1239
+ bool NeedsDwarfCFI = needsDwarfCFI (MF);
1216
1240
1217
1241
uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount (MF);
1218
1242
uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
@@ -1233,10 +1257,11 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1233
1257
StackOffset::getScalable (RVVStackSize),
1234
1258
MachineInstr::FrameDestroy, getStackAlign ());
1235
1259
1236
- if (!hasFP (MF))
1237
- CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1238
-
1239
- emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1260
+ if (NeedsDwarfCFI) {
1261
+ if (!hasFP (MF))
1262
+ CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1263
+ emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn);
1264
+ }
1240
1265
}
1241
1266
1242
1267
if (FirstSPAdjustAmount) {
@@ -1252,7 +1277,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1252
1277
StackOffset::getFixed (SecondSPAdjustAmount),
1253
1278
MachineInstr::FrameDestroy, getStackAlign ());
1254
1279
1255
- if (!hasFP (MF))
1280
+ if (NeedsDwarfCFI && !hasFP (MF))
1256
1281
CFIBuilder.buildDefCFAOffset (FirstSPAdjustAmount);
1257
1282
}
1258
1283
@@ -1273,7 +1298,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1273
1298
getStackAlign ());
1274
1299
}
1275
1300
1276
- if (hasFP (MF))
1301
+ if (NeedsDwarfCFI && hasFP (MF))
1277
1302
CFIBuilder.buildDefCFA (SPReg, RealStackSize);
1278
1303
1279
1304
// Skip to after the restores of scalar callee-saved registers
@@ -1296,8 +1321,9 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1296
1321
}
1297
1322
1298
1323
// Recover callee-saved registers.
1299
- for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1300
- CFIBuilder.buildRestore (CS.getReg ());
1324
+ if (NeedsDwarfCFI)
1325
+ for (const CalleeSavedInfo &CS : getUnmanagedCSI (MF, CSI))
1326
+ CFIBuilder.buildRestore (CS.getReg ());
1301
1327
1302
1328
if (RVFI->isPushable (MF) && MBBI != MBB.end () && isPop (MBBI->getOpcode ())) {
1303
1329
// Use available stack adjustment in pop instruction to deallocate stack
@@ -1316,15 +1342,17 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1316
1342
auto NextI = next_nodbg (MBBI, MBB.end ());
1317
1343
if (NextI == MBB.end () || NextI->getOpcode () != RISCV::PseudoRET) {
1318
1344
++MBBI;
1319
- CFIBuilder.setInsertPoint (MBBI);
1345
+ if (NeedsDwarfCFI) {
1346
+ CFIBuilder.setInsertPoint (MBBI);
1320
1347
1321
- for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1322
- CFIBuilder.buildRestore (CS.getReg ());
1348
+ for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo (MF, CSI))
1349
+ CFIBuilder.buildRestore (CS.getReg ());
1323
1350
1324
- // Update CFA Offset. If this is a QCI interrupt function, there will be a
1325
- // leftover offset which is deallocated by `QC.C.MILEAVERET`, otherwise
1326
- // getQCIInterruptStackSize() will be 0.
1327
- 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
+ }
1328
1356
}
1329
1357
}
1330
1358
@@ -1813,7 +1841,8 @@ MachineBasicBlock::iterator RISCVFrameLowering::eliminateCallFramePseudoInstr(
1813
1841
// allocateStack.
1814
1842
bool DynAllocation =
1815
1843
MF.getInfo <RISCVMachineFunctionInfo>()->hasDynamicAllocation ();
1816
- allocateStack (MBB, MI, MF, -Amount, -Amount, !hasFP (MF),
1844
+ allocateStack (MBB, MI, MF, -Amount, -Amount,
1845
+ needsDwarfCFI (MF) && !hasFP (MF),
1817
1846
/* NeedProbe=*/ true , ProbeSize, DynAllocation);
1818
1847
} else {
1819
1848
const RISCVRegisterInfo &RI = *STI.getRegisterInfo ();
0 commit comments