@@ -553,6 +553,8 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
553553 MachineBasicBlock::iterator MBBI, const DebugLoc &DL, uint64_t Offset,
554554 uint64_t AlignOffset) const {
555555
556+ const bool NeedsDwarfCFI = needsDwarfCFI (MF);
557+ const bool HasFP = hasFP (MF);
556558 const X86Subtarget &STI = MF.getSubtarget <X86Subtarget>();
557559 const X86TargetLowering &TLI = *STI.getTargetLowering ();
558560 const unsigned Opc = getSUBriOpcode (Uses64BitFramePtr, Offset);
@@ -570,6 +572,11 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
570572 .addReg (StackPtr)
571573 .addImm (StackProbeSize - AlignOffset)
572574 .setMIFlag (MachineInstr::FrameSetup);
575+ if (!HasFP && NeedsDwarfCFI) {
576+ BuildCFI (MBB, MBBI, DL,
577+ MCCFIInstruction::createAdjustCfaOffset (
578+ nullptr , StackProbeSize - AlignOffset));
579+ }
573580 MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
574581
575582 addRegOffset (BuildMI (MBB, MBBI, DL, TII.get (MovMIOpc))
@@ -591,7 +598,11 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
591598 .setMIFlag (MachineInstr::FrameSetup);
592599 MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
593600
594-
601+ if (!HasFP && NeedsDwarfCFI) {
602+ BuildCFI (
603+ MBB, MBBI, DL,
604+ MCCFIInstruction::createAdjustCfaOffset (nullptr , StackProbeSize));
605+ }
595606 addRegOffset (BuildMI (MBB, MBBI, DL, TII.get (MovMIOpc))
596607 .setMIFlag (MachineInstr::FrameSetup),
597608 StackPtr, false , 0 )
@@ -607,6 +618,8 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
607618 .addReg (StackPtr)
608619 .addImm (ChunkSize)
609620 .setMIFlag (MachineInstr::FrameSetup);
621+ // No need to adjust Dwarf CFA offset here, the last position of the stack has
622+ // been defined
610623 MI->getOperand (3 ).setIsDead (); // The EFLAGS implicit def is dead.
611624}
612625
@@ -1200,6 +1213,13 @@ bool X86FrameLowering::has128ByteRedZone(const MachineFunction& MF) const {
12001213 return Is64Bit && !IsWin64CC && !Fn.hasFnAttribute (Attribute::NoRedZone);
12011214}
12021215
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+ }
12031223
12041224// / emitPrologue - Push callee-saved registers onto the stack, which
12051225// / automatically adjust the stack pointer. Adjust the stack pointer to allocate
@@ -1305,13 +1325,13 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
13051325 MF.hasEHFunclets () && Personality == EHPersonality::CoreCLR;
13061326 bool IsClrFunclet = IsFunclet && FnHasClrFunclet;
13071327 bool HasFP = hasFP (MF);
1308- bool IsWin64Prologue = MF. getTarget (). getMCAsmInfo ()-> usesWindowsCFI ( );
1328+ bool IsWin64Prologue = isWin64Prologue (MF );
13091329 bool NeedsWin64CFI = IsWin64Prologue && Fn.needsUnwindTableEntry ();
13101330 // FIXME: Emit FPO data for EH funclets.
13111331 bool NeedsWinFPO =
13121332 !IsFunclet && STI.isTargetWin32 () && MMI.getModule ()->getCodeViewFlag ();
13131333 bool NeedsWinCFI = NeedsWin64CFI || NeedsWinFPO;
1314- bool NeedsDwarfCFI = !IsWin64Prologue && MF. needsFrameMoves ( );
1334+ bool NeedsDwarfCFI = needsDwarfCFI (MF );
13151335 Register FramePtr = TRI->getFrameRegister (MF);
13161336 const Register MachineFramePtr =
13171337 STI.isTarget64BitILP32 ()
0 commit comments