diff options
Diffstat (limited to 'lib/Target/SparcV9/SparcV9FrameInfo.cpp')
-rw-r--r-- | lib/Target/SparcV9/SparcV9FrameInfo.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/Target/SparcV9/SparcV9FrameInfo.cpp b/lib/Target/SparcV9/SparcV9FrameInfo.cpp new file mode 100644 index 0000000000..d283e942bb --- /dev/null +++ b/lib/Target/SparcV9/SparcV9FrameInfo.cpp @@ -0,0 +1,65 @@ +//===-- Sparc.cpp - General implementation file for the Sparc Target ------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Interface to stack frame layout info for the UltraSPARC. Starting offsets +// for each area of the stack frame are aligned at a multiple of +// getStackFrameSizeAlignment(). +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionInfo.h" +#include "llvm/Target/TargetFrameInfo.h" +#include "SparcFrameInfo.h" + +using namespace llvm; + +int +SparcFrameInfo::getFirstAutomaticVarOffset(MachineFunction&, bool& pos) const { + pos = false; // static stack area grows downwards + return StaticAreaOffsetFromFP; +} + +int +SparcFrameInfo::getRegSpillAreaOffset(MachineFunction& mcInfo, bool& pos) const +{ + // ensure no more auto vars are added + mcInfo.getInfo()->freezeAutomaticVarsArea(); + + pos = false; // static stack area grows downwards + unsigned autoVarsSize = mcInfo.getInfo()->getAutomaticVarsSize(); + return StaticAreaOffsetFromFP - autoVarsSize; +} + +int SparcFrameInfo::getTmpAreaOffset(MachineFunction& mcInfo, bool& pos) const { + MachineFunctionInfo *MFI = mcInfo.getInfo(); + MFI->freezeAutomaticVarsArea(); // ensure no more auto vars are added + MFI->freezeSpillsArea(); // ensure no more spill slots are added + + pos = false; // static stack area grows downwards + unsigned autoVarsSize = MFI->getAutomaticVarsSize(); + unsigned spillAreaSize = MFI->getRegSpillsSize(); + int offset = autoVarsSize + spillAreaSize; + return StaticAreaOffsetFromFP - offset; +} + +int +SparcFrameInfo::getDynamicAreaOffset(MachineFunction& mcInfo, bool& pos) const { + // Dynamic stack area grows downwards starting at top of opt-args area. + // The opt-args, required-args, and register-save areas are empty except + // during calls and traps, so they are shifted downwards on each + // dynamic-size alloca. + pos = false; + unsigned optArgsSize = mcInfo.getInfo()->getMaxOptionalArgsSize(); + if (int extra = optArgsSize % getStackFrameSizeAlignment()) + optArgsSize += (getStackFrameSizeAlignment() - extra); + int offset = optArgsSize + FirstOptionalOutgoingArgOffsetFromSP; + assert((offset - OFFSET) % getStackFrameSizeAlignment() == 0); + return offset; +} |