summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2009-09-24 16:42:27 +0000
committerBob Wilson <bob.wilson@apple.com>2009-09-24 16:42:27 +0000
commitc34666ee1871d47dfa4865c7138902dd1b770101 (patch)
treef77fd6810eb527db843f18c2a84a688def61a4ac
parentf9e0a220fc97df6bcbd545009e036a91f67e9cc4 (diff)
downloadllvm-c34666ee1871d47dfa4865c7138902dd1b770101.tar.gz
llvm-c34666ee1871d47dfa4865c7138902dd1b770101.tar.bz2
llvm-c34666ee1871d47dfa4865c7138902dd1b770101.tar.xz
Fix a hypothetical problem for targets with StackGrowsUp and a non-zero
LocalAreaOffset. (We don't have any of those right now.) PEI::calculateFrameObjectOffsets includes the absolute value of the LocalAreaOffset in the cumulative offset value used to calculate the stack frame size. It then adds the raw value of the LocalAreaOffset to the stack size. For a StackGrowsDown target, that raw value is negative and has the effect of cancelling out the absolute value that was added earlier, but that obviously won't work for a StackGrowsUp target. Change to subtract the absolute value of the LocalAreaOffset. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82693 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/PrologEpilogInserter.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp
index 226e1ba283..b568ad828b 100644
--- a/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/lib/CodeGen/PrologEpilogInserter.cpp
@@ -471,11 +471,12 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
// Start at the beginning of the local area.
// The Offset is the distance from the stack top in the direction
// of stack growth -- so it's always nonnegative.
- int64_t Offset = TFI.getOffsetOfLocalArea();
+ int LocalAreaOffset = TFI.getOffsetOfLocalArea();
if (StackGrowsDown)
- Offset = -Offset;
- assert(Offset >= 0
+ LocalAreaOffset = -LocalAreaOffset;
+ assert(LocalAreaOffset >= 0
&& "Local area offset should be in direction of stack growth");
+ int64_t Offset = LocalAreaOffset;
// If there are fixed sized objects that are preallocated in the local area,
// non-fixed objects can't be allocated right at the start of local area.
@@ -588,7 +589,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
}
// Update frame info to pretend that this is part of the stack...
- FFI->setStackSize(Offset+TFI.getOffsetOfLocalArea());
+ FFI->setStackSize(Offset - LocalAreaOffset);
// Remember the required stack alignment in case targets need it to perform
// dynamic stack alignment.