forked from OSchip/llvm-project
[AArch64] Clean up callee-save CFI emission. NFC.
Summary: Avoid special case for FP, LR CFI emission and just allow general AArch64FrameLowering::emitCalleeSavedFrameMoves() to handle them. Also, stop recalculating the stack offsets in emitCalleeSavedFrameMoves() since we can just reuse the previously calculated offset stored in the MachineFrameInfo. Depends on D17000 Reviewers: t.p.northover, rengolin, mcrosier, jmolloy Subscribers: aemerson, rengolin, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D17004 llvm-svn: 261885
This commit is contained in:
parent
2fa386fd6c
commit
62d472507e
|
@ -202,8 +202,7 @@ void AArch64FrameLowering::eliminateCallFramePseudoInstr(
|
||||||
}
|
}
|
||||||
|
|
||||||
void AArch64FrameLowering::emitCalleeSavedFrameMoves(
|
void AArch64FrameLowering::emitCalleeSavedFrameMoves(
|
||||||
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
|
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const {
|
||||||
unsigned FramePtr) const {
|
|
||||||
MachineFunction &MF = *MBB.getParent();
|
MachineFunction &MF = *MBB.getParent();
|
||||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||||
MachineModuleInfo &MMI = MF.getMMI();
|
MachineModuleInfo &MMI = MF.getMMI();
|
||||||
|
@ -216,34 +215,13 @@ void AArch64FrameLowering::emitCalleeSavedFrameMoves(
|
||||||
if (CSI.empty())
|
if (CSI.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const DataLayout &TD = MF.getDataLayout();
|
|
||||||
bool HasFP = hasFP(MF);
|
|
||||||
|
|
||||||
// Calculate amount of bytes used for return address storing.
|
|
||||||
int stackGrowth = -TD.getPointerSize(0);
|
|
||||||
|
|
||||||
// Calculate offsets.
|
|
||||||
int64_t saveAreaOffset = (HasFP ? 2 : 1) * stackGrowth;
|
|
||||||
unsigned TotalSkipped = 0;
|
|
||||||
for (const auto &Info : CSI) {
|
for (const auto &Info : CSI) {
|
||||||
unsigned Reg = Info.getReg();
|
unsigned Reg = Info.getReg();
|
||||||
int64_t Offset = MFI->getObjectOffset(Info.getFrameIdx()) -
|
int64_t Offset =
|
||||||
getOffsetOfLocalArea() + saveAreaOffset;
|
MFI->getObjectOffset(Info.getFrameIdx()) - getOffsetOfLocalArea();
|
||||||
|
|
||||||
// Don't output a new CFI directive if we're re-saving the frame pointer or
|
|
||||||
// link register. This happens when the PrologEpilogInserter has inserted an
|
|
||||||
// extra "STP" of the frame pointer and link register -- the "emitPrologue"
|
|
||||||
// method automatically generates the directives when frame pointers are
|
|
||||||
// used. If we generate CFI directives for the extra "STP"s, the linker will
|
|
||||||
// lose track of the correct values for the frame pointer and link register.
|
|
||||||
if (HasFP && (FramePtr == Reg || Reg == AArch64::LR)) {
|
|
||||||
TotalSkipped += stackGrowth;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
|
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
|
||||||
unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
|
unsigned CFIIndex = MMI.addFrameInst(
|
||||||
nullptr, DwarfReg, Offset - TotalSkipped));
|
MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset));
|
||||||
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||||
.addCFIIndex(CFIIndex)
|
.addCFIIndex(CFIIndex)
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
.setMIFlags(MachineInstr::FrameSetup);
|
||||||
|
@ -512,21 +490,6 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
|
||||||
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||||
.addCFIIndex(CFIIndex)
|
.addCFIIndex(CFIIndex)
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
.setMIFlags(MachineInstr::FrameSetup);
|
||||||
|
|
||||||
// Record the location of the stored LR
|
|
||||||
unsigned LR = RegInfo->getDwarfRegNum(AArch64::LR, true);
|
|
||||||
CFIIndex = MMI.addFrameInst(
|
|
||||||
MCCFIInstruction::createOffset(nullptr, LR, StackGrowth));
|
|
||||||
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
|
||||||
.addCFIIndex(CFIIndex)
|
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
|
||||||
|
|
||||||
// Record the location of the stored FP
|
|
||||||
CFIIndex = MMI.addFrameInst(
|
|
||||||
MCCFIInstruction::createOffset(nullptr, Reg, 2 * StackGrowth));
|
|
||||||
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
|
||||||
.addCFIIndex(CFIIndex)
|
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
|
||||||
} else {
|
} else {
|
||||||
// Encode the stack size of the leaf function.
|
// Encode the stack size of the leaf function.
|
||||||
unsigned CFIIndex = MMI.addFrameInst(
|
unsigned CFIIndex = MMI.addFrameInst(
|
||||||
|
@ -536,8 +499,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
.setMIFlags(MachineInstr::FrameSetup);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now emit the moves for whatever callee saved regs we have.
|
// Now emit the moves for whatever callee saved regs we have (including FP,
|
||||||
emitCalleeSavedFrameMoves(MBB, MBBI, FramePtr);
|
// LR if those are saved).
|
||||||
|
emitCalleeSavedFrameMoves(MBB, MBBI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,7 @@ public:
|
||||||
true /*StackRealignable*/) {}
|
true /*StackRealignable*/) {}
|
||||||
|
|
||||||
void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
|
void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator MBBI,
|
MachineBasicBlock::iterator MBBI) const;
|
||||||
unsigned FramePtr) const;
|
|
||||||
|
|
||||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||||
MachineBasicBlock &MBB,
|
MachineBasicBlock &MBB,
|
||||||
|
|
Loading…
Reference in New Issue