| //===-- 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; |
| } |