@@ -553,6 +553,8 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
553
553
MachineBasicBlock::iterator MBBI, const DebugLoc &DL, uint64_t Offset,
554
554
uint64_t AlignOffset) const {
555
555
556
+ const bool NeedsDwarfCFI = needsDwarfCFI (MF);
557
+ const bool HasFP = hasFP (MF);
556
558
const X86Subtarget &STI = MF.getSubtarget <X86Subtarget>();
557
559
const X86TargetLowering &TLI = *STI.getTargetLowering ();
558
560
const unsigned Opc = getSUBriOpcode (Uses64BitFramePtr, Offset);
@@ -570,6 +572,11 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
570
572
.addReg (StackPtr)
571
573
.addImm (StackProbeSize - AlignOffset)
572
574
.setMIFlag (MachineInstr::FrameSetup);
575
+ if (!HasFP && NeedsDwarfCFI) {
576
+ BuildCFI (MBB, MBBI, DL,
577
+ MCCFIInstruction::createAdjustCfaOffset (
578
+ nullptr , StackProbeSize - AlignOffset));
579
+ }
573
580
MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
574
581
575
582
addRegOffset (BuildMI (MBB, MBBI, DL, TII.get (MovMIOpc))
@@ -591,7 +598,11 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
591
598
.setMIFlag (MachineInstr::FrameSetup);
592
599
MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
593
600
594
-
601
+ if (!HasFP && NeedsDwarfCFI) {
602
+ BuildCFI (
603
+ MBB, MBBI, DL,
604
+ MCCFIInstruction::createAdjustCfaOffset (nullptr , StackProbeSize));
605
+ }
595
606
addRegOffset (BuildMI (MBB, MBBI, DL, TII.get (MovMIOpc))
596
607
.setMIFlag (MachineInstr::FrameSetup),
597
608
StackPtr, false , 0 )
@@ -607,6 +618,8 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
607
618
.addReg (StackPtr)
608
619
.addImm (ChunkSize)
609
620
.setMIFlag (MachineInstr::FrameSetup);
621
+ // No need to adjust Dwarf CFA offset here, the last position of the stack has
622
+ // been defined
610
623
MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
611
624
}
612
625
@@ -1200,6 +1213,13 @@ bool X86FrameLowering::has128ByteRedZone(const MachineFunction& MF) const {
1200
1213
return Is64Bit && !IsWin64CC && !Fn.hasFnAttribute (Attribute::NoRedZone);
1201
1214
}
1202
1215
1216
+ bool X86FrameLowering::isWin64Prologue (const MachineFunction &MF) const {
1217
+ return MF.getTarget ().getMCAsmInfo ()->usesWindowsCFI ();
1218
+ }
1219
+
1220
+ bool X86FrameLowering::needsDwarfCFI (const MachineFunction &MF) const {
1221
+ return !isWin64Prologue (MF) && MF.needsFrameMoves ();
1222
+ }
1203
1223
1204
1224
// / emitPrologue - Push callee-saved registers onto the stack, which
1205
1225
// / automatically adjust the stack pointer. Adjust the stack pointer to allocate
@@ -1305,13 +1325,13 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1305
1325
MF.hasEHFunclets () && Personality == EHPersonality::CoreCLR;
1306
1326
bool IsClrFunclet = IsFunclet && FnHasClrFunclet;
1307
1327
bool HasFP = hasFP (MF);
1308
- bool IsWin64Prologue = MF. getTarget (). getMCAsmInfo ()-> usesWindowsCFI ( );
1328
+ bool IsWin64Prologue = isWin64Prologue (MF );
1309
1329
bool NeedsWin64CFI = IsWin64Prologue && Fn.needsUnwindTableEntry ();
1310
1330
// FIXME: Emit FPO data for EH funclets.
1311
1331
bool NeedsWinFPO =
1312
1332
!IsFunclet && STI.isTargetWin32 () && MMI.getModule ()->getCodeViewFlag ();
1313
1333
bool NeedsWinCFI = NeedsWin64CFI || NeedsWinFPO;
1314
- bool NeedsDwarfCFI = !IsWin64Prologue && MF. needsFrameMoves ( );
1334
+ bool NeedsDwarfCFI = needsDwarfCFI (MF );
1315
1335
Register FramePtr = TRI->getFrameRegister (MF);
1316
1336
const Register MachineFramePtr =
1317
1337
STI.isTarget64BitILP32 ()
0 commit comments