1//===-- MipsFrameLowering.cpp - Mips Frame Information --------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the Mips implementation of TargetFrameLowering class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "MipsFrameLowering.h" 15#include "MipsAnalyzeImmediate.h" 16#include "MipsInstrInfo.h" 17#include "MipsMachineFunction.h" 18#include "MipsTargetMachine.h" 19#include "MCTargetDesc/MipsBaseInfo.h" 20#include "llvm/Function.h" 21#include "llvm/CodeGen/MachineFrameInfo.h" 22#include "llvm/CodeGen/MachineFunction.h" 23#include "llvm/CodeGen/MachineInstrBuilder.h" 24#include "llvm/CodeGen/MachineModuleInfo.h" 25#include "llvm/CodeGen/MachineRegisterInfo.h" 26#include "llvm/Target/TargetData.h" 27#include "llvm/Target/TargetOptions.h" 28#include "llvm/Support/CommandLine.h" 29 30using namespace llvm; 31 32 33//===----------------------------------------------------------------------===// 34// 35// Stack Frame Processing methods 36// +----------------------------+ 37// 38// The stack is allocated decrementing the stack pointer on 39// the first instruction of a function prologue. Once decremented, 40// all stack references are done thought a positive offset 41// from the stack/frame pointer, so the stack is considering 42// to grow up! Otherwise terrible hacks would have to be made 43// to get this stack ABI compliant :) 44// 45// The stack frame required by the ABI (after call): 46// Offset 47// 48// 0 ---------- 49// 4 Args to pass 50// . saved $GP (used in PIC) 51// . Alloca allocations 52// . Local Area 53// . CPU "Callee Saved" Registers 54// . saved FP 55// . saved RA 56// . FPU "Callee Saved" Registers 57// StackSize ----------- 58// 59// Offset - offset from sp after stack allocation on function prologue 60// 61// The sp is the stack pointer subtracted/added from the stack size 62// at the Prologue/Epilogue 63// 64// References to the previous stack (to obtain arguments) are done 65// with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1)) 66// 67// Examples: 68// - reference to the actual stack frame 69// for any local area var there is smt like : FI >= 0, StackOffset: 4 70// sw REGX, 4(SP) 71// 72// - reference to previous stack frame 73// suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16. 74// The emitted instruction will be something like: 75// lw REGX, 16+StackSize(SP) 76// 77// Since the total stack size is unknown on LowerFormalArguments, all 78// stack references (ObjectOffset) created to reference the function 79// arguments, are negative numbers. This way, on eliminateFrameIndex it's 80// possible to detect those references and the offsets are adjusted to 81// their real location. 82// 83//===----------------------------------------------------------------------===// 84 85const MipsFrameLowering *MipsFrameLowering::create(MipsTargetMachine &TM, 86 const MipsSubtarget &ST) { 87 if (TM.getSubtargetImpl()->inMips16Mode()) 88 return llvm::createMips16FrameLowering(ST); 89 90 return llvm::createMipsSEFrameLowering(ST); 91} 92 93// hasFP - Return true if the specified function should have a dedicated frame 94// pointer register. This is true if the function has variable sized allocas or 95// if frame pointer elimination is disabled. 96bool MipsFrameLowering::hasFP(const MachineFunction &MF) const { 97 const MachineFrameInfo *MFI = MF.getFrameInfo(); 98 return MF.getTarget().Options.DisableFramePointerElim(MF) || 99 MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken(); 100} 101