@@ -1349,15 +1349,12 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1349
1349
// to determine the end of the prologue.
1350
1350
DebugLoc DL;
1351
1351
1352
- // Add RETADDR move area to callee saved frame size.
1353
- int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta ();
1354
- if (TailCallReturnAddrDelta && IsWin64Prologue)
1352
+ // Space reserved for stack-based arguments when making a (ABI-guaranteed)
1353
+ // tail call.
1354
+ unsigned TailCallArgReserveSize = -X86FI->getTCReturnAddrDelta ();
1355
+ if (TailCallArgReserveSize && IsWin64Prologue)
1355
1356
report_fatal_error (" Can't handle guaranteed tail call under win64 yet" );
1356
1357
1357
- if (TailCallReturnAddrDelta < 0 )
1358
- X86FI->setCalleeSavedFrameSize (
1359
- X86FI->getCalleeSavedFrameSize () - TailCallReturnAddrDelta);
1360
-
1361
1358
const bool EmitStackProbeCall =
1362
1359
STI.getTargetLowering ()->hasStackProbeSymbol (MF);
1363
1360
unsigned StackProbeSize = STI.getTargetLowering ()->getStackProbeSize (MF);
@@ -1391,7 +1388,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1391
1388
!EmitStackProbeCall && // No stack probes.
1392
1389
!MFI.hasCopyImplyingStackAdjustment () && // Don't push and pop.
1393
1390
!MF.shouldSplitStack ()) { // Regular stack
1394
- uint64_t MinSize = X86FI->getCalleeSavedFrameSize ();
1391
+ uint64_t MinSize =
1392
+ X86FI->getCalleeSavedFrameSize () - X86FI->getTCReturnAddrDelta ();
1395
1393
if (HasFP) MinSize += SlotSize;
1396
1394
X86FI->setUsesRedZone (MinSize > 0 || StackSize > 0 );
1397
1395
StackSize = std::max (MinSize, StackSize > 128 ? StackSize - 128 : 0 );
@@ -1401,8 +1399,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1401
1399
// Insert stack pointer adjustment for later moving of return addr. Only
1402
1400
// applies to tail call optimized functions where the callee argument stack
1403
1401
// size is bigger than the callers.
1404
- if (TailCallReturnAddrDelta < 0 ) {
1405
- BuildStackAdjustment (MBB, MBBI, DL, TailCallReturnAddrDelta ,
1402
+ if (TailCallArgReserveSize != 0 ) {
1403
+ BuildStackAdjustment (MBB, MBBI, DL, -( int )TailCallArgReserveSize ,
1406
1404
/* InEpilogue=*/ false )
1407
1405
.setMIFlag (MachineInstr::FrameSetup);
1408
1406
}
@@ -1451,7 +1449,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1451
1449
if (X86FI->getRestoreBasePointer ())
1452
1450
FrameSize += SlotSize;
1453
1451
1454
- NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize ();
1452
+ NumBytes = FrameSize -
1453
+ (X86FI->getCalleeSavedFrameSize () + TailCallArgReserveSize);
1455
1454
1456
1455
// Callee-saved registers are pushed on stack before the stack is realigned.
1457
1456
if (TRI->hasStackRealignment (MF) && !IsWin64Prologue)
@@ -1554,7 +1553,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1554
1553
}
1555
1554
} else {
1556
1555
assert (!IsFunclet && " funclets without FPs not yet implemented" );
1557
- NumBytes = StackSize - X86FI->getCalleeSavedFrameSize ();
1556
+ NumBytes = StackSize -
1557
+ (X86FI->getCalleeSavedFrameSize () + TailCallArgReserveSize);
1558
1558
}
1559
1559
1560
1560
// Update the offset adjustment, which is mainly used by codeview to translate
@@ -2011,6 +2011,7 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
2011
2011
uint64_t StackSize = MFI.getStackSize ();
2012
2012
uint64_t MaxAlign = calculateMaxStackAlign (MF);
2013
2013
unsigned CSSize = X86FI->getCalleeSavedFrameSize ();
2014
+ unsigned TailCallArgReserveSize = -X86FI->getTCReturnAddrDelta ();
2014
2015
bool HasFP = hasFP (MF);
2015
2016
uint64_t NumBytes = 0 ;
2016
2017
@@ -2024,14 +2025,14 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
2024
2025
} else if (HasFP) {
2025
2026
// Calculate required stack adjustment.
2026
2027
uint64_t FrameSize = StackSize - SlotSize;
2027
- NumBytes = FrameSize - CSSize;
2028
+ NumBytes = FrameSize - CSSize - TailCallArgReserveSize ;
2028
2029
2029
2030
// Callee-saved registers were pushed on stack before the stack was
2030
2031
// realigned.
2031
2032
if (TRI->hasStackRealignment (MF) && !IsWin64Prologue)
2032
2033
NumBytes = alignTo (FrameSize, MaxAlign);
2033
2034
} else {
2034
- NumBytes = StackSize - CSSize;
2035
+ NumBytes = StackSize - CSSize - TailCallArgReserveSize ;
2035
2036
}
2036
2037
uint64_t SEHStackAllocAmt = NumBytes;
2037
2038
@@ -2098,7 +2099,6 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
2098
2099
2099
2100
if (MBBI != MBB.end ())
2100
2101
DL = MBBI->getDebugLoc ();
2101
-
2102
2102
// If there is an ADD32ri or SUB32ri of ESP immediately before this
2103
2103
// instruction, merge the two instructions.
2104
2104
if (NumBytes || MFI.hasVarSizedObjects ())
@@ -2143,7 +2143,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
2143
2143
if (!hasFP (MF) && NeedsDwarfCFI) {
2144
2144
// Define the current CFA rule to use the provided offset.
2145
2145
BuildCFI (MBB, MBBI, DL,
2146
- MCCFIInstruction::cfiDefCfaOffset (nullptr , CSSize + SlotSize));
2146
+ MCCFIInstruction::cfiDefCfaOffset (
2147
+ nullptr , CSSize + TailCallArgReserveSize + SlotSize));
2147
2148
}
2148
2149
--MBBI;
2149
2150
}
@@ -2226,7 +2227,6 @@ StackOffset X86FrameLowering::getFrameIndexReference(const MachineFunction &MF,
2226
2227
const X86MachineFunctionInfo *X86FI = MF.getInfo <X86MachineFunctionInfo>();
2227
2228
unsigned CSSize = X86FI->getCalleeSavedFrameSize ();
2228
2229
uint64_t StackSize = MFI.getStackSize ();
2229
- bool HasFP = hasFP (MF);
2230
2230
bool IsWin64Prologue = MF.getTarget ().getMCAsmInfo ()->usesWindowsCFI ();
2231
2231
int64_t FPDelta = 0 ;
2232
2232
@@ -2262,39 +2262,27 @@ StackOffset X86FrameLowering::getFrameIndexReference(const MachineFunction &MF,
2262
2262
" FPDelta isn't aligned per the Win64 ABI!" );
2263
2263
}
2264
2264
2265
-
2266
- if (TRI->hasBasePointer (MF)) {
2267
- assert (HasFP && " VLAs and dynamic stack realign, but no FP?!" );
2268
- if (FI < 0 ) {
2269
- // Skip the saved EBP.
2270
- return StackOffset::getFixed (Offset + SlotSize + FPDelta);
2271
- } else {
2272
- assert (isAligned (MFI.getObjectAlign (FI), -(Offset + StackSize)));
2273
- return StackOffset::getFixed (Offset + StackSize);
2274
- }
2275
- } else if (TRI->hasStackRealignment (MF)) {
2276
- if (FI < 0 ) {
2277
- // Skip the saved EBP.
2278
- return StackOffset::getFixed (Offset + SlotSize + FPDelta);
2279
- } else {
2280
- assert (isAligned (MFI.getObjectAlign (FI), -(Offset + StackSize)));
2281
- return StackOffset::getFixed (Offset + StackSize);
2282
- }
2283
- // FIXME: Support tail calls
2284
- } else {
2285
- if (!HasFP)
2286
- return StackOffset::getFixed (Offset + StackSize);
2287
-
2288
- // Skip the saved EBP.
2265
+ if (FrameReg == TRI->getFramePtr ()) {
2266
+ // Skip saved EBP/RBP
2289
2267
Offset += SlotSize;
2290
2268
2269
+ // Account for restricted Windows prologue.
2270
+ Offset += FPDelta;
2271
+
2291
2272
// Skip the RETADDR move area
2292
2273
int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta ();
2293
2274
if (TailCallReturnAddrDelta < 0 )
2294
2275
Offset -= TailCallReturnAddrDelta;
2276
+
2277
+ return StackOffset::getFixed (Offset);
2295
2278
}
2296
2279
2297
- return StackOffset::getFixed (Offset + FPDelta);
2280
+ // FrameReg is either the stack pointer or a base pointer. But the base is
2281
+ // located at the end of the statically known StackSize so the distinction
2282
+ // doesn't really matter.
2283
+ if (TRI->hasStackRealignment (MF) || TRI->hasBasePointer (MF))
2284
+ assert (isAligned (MFI.getObjectAlign (FI), -(Offset + StackSize)));
2285
+ return StackOffset::getFixed (Offset + StackSize);
2298
2286
}
2299
2287
2300
2288
int X86FrameLowering::getWin64EHFrameIndexRef (const MachineFunction &MF, int FI,
0 commit comments