aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/PrologEpilogInserter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r--lib/CodeGen/PrologEpilogInserter.cpp113
1 files changed, 34 insertions, 79 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp
index 6961c14..4ebf742 100644
--- a/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/lib/CodeGen/PrologEpilogInserter.cpp
@@ -306,6 +306,32 @@ void PEI::saveCalleeSavedRegisters(MachineFunction &Fn) {
}
}
+/// AdjustStackOffset - Helper function used to adjust the stack frame offset.
+static inline void
+AdjustStackOffset(MachineFrameInfo *FFI, int FrameIdx,
+ bool StackGrowsDown, int64_t &Offset,
+ unsigned &MaxAlign) {
+ // If stack grows down, we need to add size of find the lowest address of the
+ // object.
+ if (StackGrowsDown)
+ Offset += FFI->getObjectSize(FrameIdx);
+
+ unsigned Align = FFI->getObjectAlignment(FrameIdx);
+
+ // If the alignment of this object is greater than that of the stack, then
+ // increase the stack alignment to match.
+ MaxAlign = std::max(MaxAlign, Align);
+
+ // Adjust to alignment boundary.
+ Offset = (Offset + Align - 1) / Align * Align;
+
+ if (StackGrowsDown) {
+ FFI->setObjectOffset(FrameIdx, -Offset); // Set the computed offset
+ } else {
+ FFI->setObjectOffset(FrameIdx, Offset);
+ Offset += FFI->getObjectSize(FrameIdx);
+ }
+}
/// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
/// abstract stack objects.
@@ -387,51 +413,15 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
if (RS && RegInfo->hasFP(Fn)) {
int SFI = RS->getScavengingFrameIndex();
- if (SFI >= 0) {
- // If stack grows down, we need to add size of the lowest
- // address of the object.
- if (StackGrowsDown)
- Offset += FFI->getObjectSize(SFI);
-
- unsigned Align = FFI->getObjectAlignment(SFI);
- // Adjust to alignment boundary
- Offset = (Offset+Align-1)/Align*Align;
-
- if (StackGrowsDown) {
- FFI->setObjectOffset(SFI, -Offset); // Set the computed offset
- } else {
- FFI->setObjectOffset(SFI, Offset);
- Offset += FFI->getObjectSize(SFI);
- }
- }
+ if (SFI >= 0)
+ AdjustStackOffset(FFI, SFI, StackGrowsDown, Offset, MaxAlign);
}
// Make sure that the stack protector comes before the local variables on the
// stack.
- if (FFI->getStackProtectorIndex() >= 0) {
- int FI = FFI->getStackProtectorIndex();
-
- // If stack grows down, we need to add size of find the lowest
- // address of the object.
- if (StackGrowsDown)
- Offset += FFI->getObjectSize(FI);
-
- unsigned Align = FFI->getObjectAlignment(FI);
-
- // If the alignment of this object is greater than that of the stack, then
- // increase the stack alignment to match.
- MaxAlign = std::max(MaxAlign, Align);
-
- // Adjust to alignment boundary.
- Offset = (Offset + Align - 1) / Align * Align;
-
- if (StackGrowsDown) {
- FFI->setObjectOffset(FI, -Offset); // Set the computed offset
- } else {
- FFI->setObjectOffset(FI, Offset);
- Offset += FFI->getObjectSize(FI);
- }
- }
+ if (FFI->getStackProtectorIndex() >= 0)
+ AdjustStackOffset(FFI, FFI->getStackProtectorIndex(), StackGrowsDown,
+ Offset, MaxAlign);
// Then assign frame offsets to stack objects that are not used to spill
// callee saved registers.
@@ -445,50 +435,15 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
if (FFI->getStackProtectorIndex() == (int)i)
continue;
- // If stack grows down, we need to add size of find the lowest
- // address of the object.
- if (StackGrowsDown)
- Offset += FFI->getObjectSize(i);
-
- unsigned Align = FFI->getObjectAlignment(i);
- // If the alignment of this object is greater than that of the stack, then
- // increase the stack alignment to match.
- MaxAlign = std::max(MaxAlign, Align);
- // Adjust to alignment boundary
- Offset = (Offset+Align-1)/Align*Align;
-
- if (StackGrowsDown) {
- FFI->setObjectOffset(i, -Offset); // Set the computed offset
- } else {
- FFI->setObjectOffset(i, Offset);
- Offset += FFI->getObjectSize(i);
- }
+ AdjustStackOffset(FFI, i, StackGrowsDown, Offset, MaxAlign);
}
// Make sure the special register scavenging spill slot is closest to the
// stack pointer.
if (RS && !RegInfo->hasFP(Fn)) {
int SFI = RS->getScavengingFrameIndex();
- if (SFI >= 0) {
- // If stack grows down, we need to add size of find the lowest
- // address of the object.
- if (StackGrowsDown)
- Offset += FFI->getObjectSize(SFI);
-
- unsigned Align = FFI->getObjectAlignment(SFI);
- // If the alignment of this object is greater than that of the
- // stack, then increase the stack alignment to match.
- MaxAlign = std::max(MaxAlign, Align);
- // Adjust to alignment boundary
- Offset = (Offset+Align-1)/Align*Align;
-
- if (StackGrowsDown) {
- FFI->setObjectOffset(SFI, -Offset); // Set the computed offset
- } else {
- FFI->setObjectOffset(SFI, Offset);
- Offset += FFI->getObjectSize(SFI);
- }
- }
+ if (SFI >= 0)
+ AdjustStackOffset(FFI, SFI, StackGrowsDown, Offset, MaxAlign);
}
// Round up the size to a multiple of the alignment, but only if there are