diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-11-11 21:23:33 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2001-11-11 21:23:33 +0000 |
commit | f1a0a1081347ff6177b8b57dc16d841cde89e7fc (patch) | |
tree | 77f8a0df6b2d130d1994a53be88261b61b6c5fc0 /lib/CodeGen/MachineInstr.cpp | |
parent | 5a81692f47fd2179ceafb40e47e2efafe936d879 (diff) |
Fix errors in computing downgrowing offsets, and in
computing size of extra outgoing args.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1256 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
-rw-r--r-- | lib/CodeGen/MachineInstr.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index 46a8029840..b6e8805955 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -191,8 +191,9 @@ ComputeMaxOptionalArgsSize(const TargetMachine& target, const Method* method) { CallInst* callInst = cast<CallInst>(*I); unsigned int numOperands = callInst->getNumOperands() - 1; - unsigned int numExtra = numOperands - - frameInfo.getNumFixedOutgoingArgs(); + int numExtra = (int) numOperands - frameInfo.getNumFixedOutgoingArgs(); + if (numExtra <= 0) + continue; unsigned int sizeForThisCall; if (frameInfo.argsOnStackHaveFixedSize()) @@ -243,11 +244,12 @@ MachineCodeForMethod::allocateLocalVar(const TargetMachine& target, bool growUp; int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this, growUp); + unsigned int size = target.findOptimalStorageSize(val->getType()); + offset = growUp? firstOffset + getAutomaticVarsSize() - : firstOffset - getAutomaticVarsSize(); + : firstOffset - getAutomaticVarsSize() - size; offsets[val] = offset; - unsigned int size = target.findOptimalStorageSize(val->getType()); incrementAutomaticVarsSize(size); } return offset; @@ -259,10 +261,11 @@ MachineCodeForMethod::allocateSpilledValue(const TargetMachine& target, { bool growUp; int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp); + unsigned int size = target.findOptimalStorageSize(type); + int offset = growUp? firstOffset + getRegSpillsSize() - : firstOffset - getRegSpillsSize(); + : firstOffset - getRegSpillsSize() - size; - unsigned int size = target.findOptimalStorageSize(type); incrementRegSpillsSize(size); return offset; @@ -275,18 +278,18 @@ MachineCodeForMethod::allocateOptionalArg(const TargetMachine& target, const MachineFrameInfo& frameInfo = target.getFrameInfo(); bool growUp; int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp); - int offset = growUp? firstOffset + getCurrentOptionalArgsSize() - : firstOffset - getCurrentOptionalArgsSize(); - + int size = MAXINT; if (frameInfo.argsOnStackHaveFixedSize()) size = frameInfo.getSizeOfEachArgOnStack(); else { - assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets"); size = target.findOptimalStorageSize(type); + assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets"); } + int offset = growUp? firstOffset + getCurrentOptionalArgsSize() + : firstOffset - getCurrentOptionalArgsSize() - size; incrementCurrentOptionalArgsSize(size); return offset; @@ -305,7 +308,7 @@ MachineCodeForMethod::pushTempValue(const TargetMachine& target, bool growUp; int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp); int offset = growUp? firstTmpOffset + currentTmpValuesSize - : firstTmpOffset - currentTmpValuesSize; + : firstTmpOffset - currentTmpValuesSize - size; currentTmpValuesSize += size; return offset; } |