MipsFrameLowering.cpp revision cdb3ba71ce550c5a41c84c3678225a39d6f0a414
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- MipsFrameLowering.cpp - Mips Frame Information --------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the Mips implementation of TargetFrameLowering class. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MipsFrameLowering.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MipsAnalyzeImmediate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MipsInstrInfo.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MipsMachineFunction.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MCTargetDesc/MipsBaseInfo.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Function.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineFrameInfo.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineFunction.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineInstrBuilder.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineModuleInfo.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineRegisterInfo.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Target/TargetData.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Target/TargetOptions.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/CommandLine.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace llvm; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stack Frame Processing methods 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +----------------------------+ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The stack is allocated decrementing the stack pointer on 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the first instruction of a function prologue. Once decremented, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// all stack references are done thought a positive offset 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from the stack/frame pointer, so the stack is considering 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to grow up! Otherwise terrible hacks would have to be made 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to get this stack ABI compliant :) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The stack frame required by the ABI (after call): 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Offset 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 0 ---------- 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4 Args to pass 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . saved $GP (used in PIC) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . Alloca allocations 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . Local Area 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . CPU "Callee Saved" Registers 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . saved FP 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . saved RA 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . FPU "Callee Saved" Registers 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StackSize ----------- 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Offset - offset from sp after stack allocation on function prologue 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The sp is the stack pointer subtracted/added from the stack size 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// at the Prologue/Epilogue 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// References to the previous stack (to obtain arguments) are done 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1)) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Examples: 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - reference to the actual stack frame 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for any local area var there is smt like : FI >= 0, StackOffset: 4 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sw REGX, 4(SP) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - reference to previous stack frame 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The emitted instruction will be something like: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// lw REGX, 16+StackSize(SP) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Since the total stack size is unknown on LowerFormalArguments, all 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stack references (ObjectOffset) created to reference the function 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// arguments, are negative numbers. This way, on eliminateFrameIndex it's 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// possible to detect those references and the offsets are adjusted to 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// their real location. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// hasFP - Return true if the specified function should have a dedicated frame 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// pointer register. This is true if the function has variable sized allocas or 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if frame pointer elimination is disabled. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MipsFrameLowering::hasFP(const MachineFunction &MF) const { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MachineFrameInfo *MFI = MF.getFrameInfo(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MF.getTarget().Options.DisableFramePointerElim(MF) || 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)