1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsFrameLowering.cpp - Mips Frame Information --------------------===// 233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// The LLVM Compiler Infrastructure 433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// This file is distributed under the University of Illinois Open Source 633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// License. See LICENSE.TXT for details. 733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 1016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov// This file contains the Mips implementation of TargetFrameLowering class. 1133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 1333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 1416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "MipsFrameLowering.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/MipsBaseInfo.h" 1679aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "MipsAnalyzeImmediate.h" 1733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "MipsInstrInfo.h" 1833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "MipsMachineFunction.h" 19af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka#include "MipsTargetMachine.h" 2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h" 2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/CodeGen/MachineFunction.h" 2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/CodeGen/MachineInstrBuilder.h" 2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/CodeGen/MachineModuleInfo.h" 2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/CodeGen/MachineRegisterInfo.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/Support/CommandLine.h" 28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 2933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 3033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovusing namespace llvm; 3133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 3233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 334552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 3533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// Stack Frame Processing methods 3633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// +----------------------------+ 3733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 3833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// The stack is allocated decrementing the stack pointer on 3933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// the first instruction of a function prologue. Once decremented, 4033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// all stack references are done thought a positive offset 4133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// from the stack/frame pointer, so the stack is considering 4233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// to grow up! Otherwise terrible hacks would have to be made 4333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// to get this stack ABI compliant :) 4433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 4533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// The stack frame required by the ABI (after call): 4633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// Offset 4733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 4833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 0 ---------- 4933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 4 Args to pass 5033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . saved $GP (used in PIC) 5133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . Alloca allocations 5233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . Local Area 5333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . CPU "Callee Saved" Registers 5433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . saved FP 5533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . saved RA 5633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// . FPU "Callee Saved" Registers 5733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// StackSize ----------- 5833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 5933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// Offset - offset from sp after stack allocation on function prologue 6033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 6133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// The sp is the stack pointer subtracted/added from the stack size 6233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// at the Prologue/Epilogue 6333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 6433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// References to the previous stack (to obtain arguments) are done 6533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1)) 6633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 6733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// Examples: 6833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// - reference to the actual stack frame 6933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// for any local area var there is smt like : FI >= 0, StackOffset: 4 7033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// sw REGX, 4(SP) 7133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 7233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// - reference to previous stack frame 7333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16. 7433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// The emitted instruction will be something like: 7533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// lw REGX, 16+StackSize(SP) 7633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 7733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// Since the total stack size is unknown on LowerFormalArguments, all 7833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// stack references (ObjectOffset) created to reference the function 7933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// arguments, are negative numbers. This way, on eliminateFrameIndex it's 8033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// possible to detect those references and the offsets are adjusted to 8133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// their real location. 8233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// 834552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 8433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 85af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanakaconst MipsFrameLowering *MipsFrameLowering::create(MipsTargetMachine &TM, 86af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka const MipsSubtarget &ST) { 87af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka if (TM.getSubtargetImpl()->inMips16Mode()) 88af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka return llvm::createMips16FrameLowering(ST); 89af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka 90af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka return llvm::createMipsSEFrameLowering(ST); 91af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka} 92af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka 93d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov// hasFP - Return true if the specified function should have a dedicated frame 944552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka// pointer register. This is true if the function has variable sized allocas or 954552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka// if frame pointer elimination is disabled. 9616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovbool MipsFrameLowering::hasFP(const MachineFunction &MF) const { 97d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov const MachineFrameInfo *MFI = MF.getFrameInfo(); 988a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return MF.getTarget().Options.DisableFramePointerElim(MF) || 998a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken(); 100d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov} 101265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 102265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanakauint64_t MipsFrameLowering::estimateStackSize(const MachineFunction &MF) const { 103265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka const MachineFrameInfo *MFI = MF.getFrameInfo(); 104265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo(); 105265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 106265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka int64_t Offset = 0; 107265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 108265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // Iterate over fixed sized objects. 109265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka for (int I = MFI->getObjectIndexBegin(); I != 0; ++I) 110265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka Offset = std::max(Offset, -MFI->getObjectOffset(I)); 111265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 112265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // Conservatively assume all callee-saved registers will be saved. 113265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka for (const uint16_t *R = TRI.getCalleeSavedRegs(&MF); *R; ++R) { 114265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka unsigned Size = TRI.getMinimalPhysRegClass(*R)->getSize(); 115265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka Offset = RoundUpToAlignment(Offset + Size, Size); 116265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka } 117265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 118265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka unsigned MaxAlign = MFI->getMaxAlignment(); 119265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 120265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // Check that MaxAlign is not zero if there is a stack object that is not a 121265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // callee-saved spill. 122265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka assert(!MFI->getObjectIndexEnd() || MaxAlign); 123265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 124265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // Iterate over other objects. 125265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka for (unsigned I = 0, E = MFI->getObjectIndexEnd(); I != E; ++I) 126265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka Offset = RoundUpToAlignment(Offset + MFI->getObjectSize(I), MaxAlign); 127265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 128265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka // Call frame. 129265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka if (MFI->adjustsStack() && hasReservedCallFrame(MF)) 130265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka Offset = RoundUpToAlignment(Offset + MFI->getMaxCallFrameSize(), 131265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka std::max(MaxAlign, getStackAlignment())); 132265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka 133265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka return RoundUpToAlignment(Offset, getStackAlignment()); 134265f191b57a4e359bc44a51602c9d2a4ee6af96bAkira Hatanaka} 135