1028700f544deeea423ce9b516e190e4e970e3c6cNick Lewycky//===----- TargetFrameLoweringImpl.cpp - Implement target frame interface --==//
2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
3b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//                     The LLVM Compiler Infrastructure
4b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
8b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//===----------------------------------------------------------------------===//
9b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//
10b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman// Implements the layout of a stack frame on the target machine.
11b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//
12b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman//===----------------------------------------------------------------------===//
13b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman
14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetFrameLowering.h"
150dbe54e8445decd1b45f595bd9e8ed416ad53a53Anton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h"
160dbe54e8445decd1b45f595bd9e8ed416ad53a53Anton Korobeynikov#include "llvm/CodeGen/MachineFunction.h"
1782f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov#include "llvm/Target/TargetMachine.h"
1882f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov#include "llvm/Target/TargetRegisterInfo.h"
19b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman#include <cstdlib>
20b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukmanusing namespace llvm;
21b8bda131403066c710c5b7d7dfdf0f930b722c77Misha Brukman
2216c29b5f285f375be53dabaa73e3e91107485fe4Anton KorobeynikovTargetFrameLowering::~TargetFrameLowering() {
231fb623e4edba8f5a417fa3de63671af09c10b9c9Misha Brukman}
24d9e3385ced2dc887e2fe8e1c071bd2611e4d3edeAnton Korobeynikov
2582f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov/// getFrameIndexOffset - Returns the displacement from the frame register to
2682f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov/// the stack frame of the specified index. This is the default implementation
2782f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov/// which is overridden for some targets.
2816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovint TargetFrameLowering::getFrameIndexOffset(const MachineFunction &MF,
2982f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov                                         int FI) const {
3082f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  const MachineFrameInfo *MFI = MF.getFrameInfo();
3182f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  return MFI->getObjectOffset(FI) + MFI->getStackSize() -
3282f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov    getOffsetOfLocalArea() + MFI->getOffsetAdjustment();
3382f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov}
3482f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov
3516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovint TargetFrameLowering::getFrameIndexReference(const MachineFunction &MF,
3616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov                                             int FI, unsigned &FrameReg) const {
3782f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  const TargetRegisterInfo *RI = MF.getTarget().getRegisterInfo();
3882f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov
3982f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  // By default, assume all frame indices are referenced via whatever
4082f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  // getFrameRegister() says. The target can override this if it's doing
4182f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  // something different.
4282f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  FrameReg = RI->getFrameRegister(MF);
4382f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  return getFrameIndexOffset(MF, FI);
4482f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov}
45