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.
113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (const MCPhysReg *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