LLVM  8.0.1
MipsFrameLowering.cpp
Go to the documentation of this file.
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"
16 #include "MipsInstrInfo.h"
17 #include "MipsMachineFunction.h"
18 #include "MipsTargetMachine.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/Function.h"
27 
28 using namespace llvm;
29 
30 
31 //===----------------------------------------------------------------------===//
32 //
33 // Stack Frame Processing methods
34 // +----------------------------+
35 //
36 // The stack is allocated decrementing the stack pointer on
37 // the first instruction of a function prologue. Once decremented,
38 // all stack references are done thought a positive offset
39 // from the stack/frame pointer, so the stack is considering
40 // to grow up! Otherwise terrible hacks would have to be made
41 // to get this stack ABI compliant :)
42 //
43 // The stack frame required by the ABI (after call):
44 // Offset
45 //
46 // 0 ----------
47 // 4 Args to pass
48 // . saved $GP (used in PIC)
49 // . Alloca allocations
50 // . Local Area
51 // . CPU "Callee Saved" Registers
52 // . saved FP
53 // . saved RA
54 // . FPU "Callee Saved" Registers
55 // StackSize -----------
56 //
57 // Offset - offset from sp after stack allocation on function prologue
58 //
59 // The sp is the stack pointer subtracted/added from the stack size
60 // at the Prologue/Epilogue
61 //
62 // References to the previous stack (to obtain arguments) are done
63 // with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1))
64 //
65 // Examples:
66 // - reference to the actual stack frame
67 // for any local area var there is smt like : FI >= 0, StackOffset: 4
68 // sw REGX, 4(SP)
69 //
70 // - reference to previous stack frame
71 // suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16.
72 // The emitted instruction will be something like:
73 // lw REGX, 16+StackSize(SP)
74 //
75 // Since the total stack size is unknown on LowerFormalArguments, all
76 // stack references (ObjectOffset) created to reference the function
77 // arguments, are negative numbers. This way, on eliminateFrameIndex it's
78 // possible to detect those references and the offsets are adjusted to
79 // their real location.
80 //
81 //===----------------------------------------------------------------------===//
82 
84  if (ST.inMips16Mode())
86 
88 }
89 
90 // hasFP - Return true if the specified function should have a dedicated frame
91 // pointer register. This is true if the function has variable sized allocas,
92 // if it needs dynamic stack realignment, if frame pointer elimination is
93 // disabled, or if the frame address is taken.
95  const MachineFrameInfo &MFI = MF.getFrameInfo();
97 
98  return MF.getTarget().Options.DisableFramePointerElim(MF) ||
99  MFI.hasVarSizedObjects() || MFI.isFrameAddressTaken() ||
100  TRI->needsStackRealignment(MF);
101 }
102 
104  const MachineFrameInfo &MFI = MF.getFrameInfo();
106 
107  return MFI.hasVarSizedObjects() && TRI->needsStackRealignment(MF);
108 }
109 
110 // Estimate the size of the stack, including the incoming arguments. We need to
111 // account for register spills, local objects, reserved call frame and incoming
112 // arguments. This is required to determine the largest possible positive offset
113 // from $sp so that it can be determined if an emergency spill slot for stack
114 // addresses is required.
116  const MachineFrameInfo &MFI = MF.getFrameInfo();
118 
119  int64_t Size = 0;
120 
121  // Iterate over fixed sized objects which are incoming arguments.
122  for (int I = MFI.getObjectIndexBegin(); I != 0; ++I)
123  if (MFI.getObjectOffset(I) > 0)
124  Size += MFI.getObjectSize(I);
125 
126  // Conservatively assume all callee-saved registers will be saved.
127  for (const MCPhysReg *R = TRI.getCalleeSavedRegs(&MF); *R; ++R) {
128  unsigned RegSize = TRI.getSpillSize(*TRI.getMinimalPhysRegClass(*R));
129  Size = alignTo(Size + RegSize, RegSize);
130  }
131 
132  // Get the size of the rest of the frame objects and any possible reserved
133  // call frame, accounting for alignment.
134  return Size + MFI.estimateStackSize(MF);
135 }
136 
137 // Eliminate ADJCALLSTACKDOWN, ADJCALLSTACKUP pseudo instructions
141  unsigned SP = STI.getABI().IsN64() ? Mips::SP_64 : Mips::SP;
142 
143  if (!hasReservedCallFrame(MF)) {
144  int64_t Amount = I->getOperand(0).getImm();
145  if (I->getOpcode() == Mips::ADJCALLSTACKDOWN)
146  Amount = -Amount;
147 
148  STI.getInstrInfo()->adjustStackPtr(SP, Amount, MBB, I);
149  }
150 
151  return MBB.erase(I);
152 }
const MipsFrameLowering * createMipsSEFrameLowering(const MipsSubtarget &ST)
bool hasBP(const MachineFunction &MF) const
const MipsFrameLowering * createMips16FrameLowering(const MipsSubtarget &ST)
Create MipsFrameLowering objects.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
bool inMips16Mode() const
const MipsSubtarget & STI
const MipsInstrInfo * getInstrInfo() const override
unsigned const TargetRegisterInfo * TRI
uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew=0)
Returns the next integer (mod 2**64) that is greater than or equal to Value and is a multiple of Alig...
Definition: MathExtras.h:685
static const MipsFrameLowering * create(const MipsSubtarget &ST)
unsigned getSpillSize(const TargetRegisterClass &RC) const
Return the size in bytes of the stack slot allocated to hold a spilled copy of a register from class ...
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register...
bool IsN64() const
Definition: MipsABIInfo.h:44
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
int getObjectIndexBegin() const
Return the minimum frame object index.
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const =0
Return a null-terminated list of all of the callee-saved registers on this target.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual bool hasReservedCallFrame(const MachineFunction &MF) const
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required, we reserve argument space for call sites in the function immediately on entry to the current function.
const MipsABIInfo & getABI() const
const MipsRegisterInfo * getRegisterInfo() const override
unsigned estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
TargetOptions Options
Definition: TargetMachine.h:97
#define I(x, y, z)
Definition: MD5.cpp:58
uint32_t Size
Definition: Profile.cpp:47
uint64_t estimateStackSize(const MachineFunction &MF) const
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const TargetRegisterClass * getMinimalPhysRegClass(unsigned Reg, MVT VT=MVT::Other) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
bool needsStackRealignment(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
virtual void adjustStackPtr(unsigned SP, int64_t Amount, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const =0