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