diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2003-12-17 22:04:00 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2003-12-17 22:04:00 +0000 |
commit | b01a80aa94d3c5ca578eaf18985ef91476eb428f (patch) | |
tree | 698a755dd2ddbed0d9801b68898f9d457b38cca4 /llvm/lib/Target/Sparc/SparcV9FrameInfo.cpp | |
parent | 423ad188da0e170481ba1aede0121b064f4e5316 (diff) | |
download | bcm5719-llvm-b01a80aa94d3c5ca578eaf18985ef91476eb428f.tar.gz bcm5719-llvm-b01a80aa94d3c5ca578eaf18985ef91476eb428f.zip |
Reorganized the Sparc backend to be more modular -- each different
implementation of a Target{RegInfo, InstrInfo, Machine, etc} now has a separate
header and a separate implementation file.
This means that instead of a massive SparcInternals.h that forces a
recompilation of the whole target whenever a minor detail is changed, you should
only recompile a few files.
Note that SparcInternals.h is still around; its contents should be minimized.
llvm-svn: 10500
Diffstat (limited to 'llvm/lib/Target/Sparc/SparcV9FrameInfo.cpp')
-rw-r--r-- | llvm/lib/Target/Sparc/SparcV9FrameInfo.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/SparcV9FrameInfo.cpp b/llvm/lib/Target/Sparc/SparcV9FrameInfo.cpp new file mode 100644 index 00000000000..d283e942bb4 --- /dev/null +++ b/llvm/lib/Target/Sparc/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; +} |