diff options
author | Oliver Stannard <oliver.stannard@arm.com> | 2014-03-05 15:25:27 +0000 |
---|---|---|
committer | Oliver Stannard <oliver.stannard@arm.com> | 2014-03-05 15:25:27 +0000 |
commit | d55e115b58addbd13c12bbe451ed66ad57a37387 (patch) | |
tree | fcea49b348b86494f385541cf5558a54c8847489 /llvm/lib/Target/ARM/ARMFrameLowering.cpp | |
parent | 7590be3cfa505775989633fe64d92fa2939f4641 (diff) | |
download | bcm5719-llvm-d55e115b58addbd13c12bbe451ed66ad57a37387.tar.gz bcm5719-llvm-d55e115b58addbd13c12bbe451ed66ad57a37387.zip |
ARM: Correctly align arguments after a byval struct is passed on the stack
llvm-svn: 202985
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index 340f49ffead..274a125126a 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -175,7 +175,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { if (MF.getFunction()->getCallingConv() == CallingConv::GHC) return; - // Allocate the vararg register save area. This is not counted in NumBytes. + // Allocate the vararg register save area. if (ArgRegsSaveSize) { emitSPUpdate(isARM, MBB, MBBI, dl, TII, -ArgRegsSaveSize, MachineInstr::FrameSetup); @@ -188,13 +188,13 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { } if (!AFI->hasStackFrame()) { - if (NumBytes != 0) { - emitSPUpdate(isARM, MBB, MBBI, dl, TII, -NumBytes, + if (NumBytes - ArgRegsSaveSize != 0) { + emitSPUpdate(isARM, MBB, MBBI, dl, TII, -(NumBytes - ArgRegsSaveSize), MachineInstr::FrameSetup); MCSymbol *SPLabel = Context.CreateTempSymbol(); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)) .addSym(SPLabel); - CFAOffset -= NumBytes; + CFAOffset -= NumBytes - ArgRegsSaveSize; MMI.addFrameInst(MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); } @@ -246,12 +246,14 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { // Determine starting offsets of spill areas. bool HasFP = hasFP(MF); - unsigned DPRCSOffset = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize); + unsigned DPRCSOffset = NumBytes - (ArgRegsSaveSize + GPRCS1Size + + GPRCS2Size + DPRCSSize); unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize; unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size; int FramePtrOffsetInPush = 0; if (HasFP) { - FramePtrOffsetInPush = MFI->getObjectOffset(FramePtrSpillFI) + GPRCS1Size; + FramePtrOffsetInPush = MFI->getObjectOffset(FramePtrSpillFI) + + GPRCS1Size + ArgRegsSaveSize; AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) + NumBytes); } @@ -339,7 +341,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { case ARM::LR: MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, MRI->getDwarfRegNum(Reg, true), - MFI->getObjectOffset(FI) - ArgRegsSaveSize)); + MFI->getObjectOffset(FI))); break; } } @@ -390,7 +392,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { case ARM::R12: if (STI.isTargetMachO()) { unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); - unsigned Offset = MFI->getObjectOffset(FI) - ArgRegsSaveSize; + unsigned Offset = MFI->getObjectOffset(FI); MMI.addFrameInst( MCCFIInstruction::createOffset(SPLabel, DwarfReg, Offset)); } @@ -536,8 +538,8 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF, return; if (!AFI->hasStackFrame()) { - if (NumBytes != 0) - emitSPUpdate(isARM, MBB, MBBI, dl, TII, NumBytes); + if (NumBytes - ArgRegsSaveSize != 0) + emitSPUpdate(isARM, MBB, MBBI, dl, TII, NumBytes - ArgRegsSaveSize); } else { // Unwind MBBI to point to first LDR / VLDRD. const uint16_t *CSRegs = RegInfo->getCalleeSavedRegs(&MF); @@ -550,7 +552,8 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF, } // Move SP to start of FP callee save spill area. - NumBytes -= (AFI->getGPRCalleeSavedArea1Size() + + NumBytes -= (ArgRegsSaveSize + + AFI->getGPRCalleeSavedArea1Size() + AFI->getGPRCalleeSavedArea2Size() + AFI->getDPRCalleeSavedAreaSize()); |