blob: 29e8bc50bb7b75b3d0a5f140f2d8d2117843be8b [file] [log] [blame]
Anton Korobeynikov33464912010-11-15 00:06:54 +00001//=======- MipsFrameInfo.cpp - Mips Frame Information ----------*- C++ -*-====//
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 TargetFrameInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsFrameInfo.h"
15#include "MipsInstrInfo.h"
16#include "MipsMachineFunction.h"
17#include "llvm/Function.h"
18#include "llvm/CodeGen/MachineFrameInfo.h"
19#include "llvm/CodeGen/MachineFunction.h"
20#include "llvm/CodeGen/MachineInstrBuilder.h"
21#include "llvm/CodeGen/MachineModuleInfo.h"
22#include "llvm/CodeGen/MachineRegisterInfo.h"
23#include "llvm/Target/TargetData.h"
24#include "llvm/Target/TargetOptions.h"
25#include "llvm/Support/CommandLine.h"
26
27using namespace llvm;
28
29
30//===----------------------------------------------------------------------===//
31//
32// Stack Frame Processing methods
33// +----------------------------+
34//
35// The stack is allocated decrementing the stack pointer on
36// the first instruction of a function prologue. Once decremented,
37// all stack references are done thought a positive offset
38// from the stack/frame pointer, so the stack is considering
39// to grow up! Otherwise terrible hacks would have to be made
40// to get this stack ABI compliant :)
41//
42// The stack frame required by the ABI (after call):
43// Offset
44//
45// 0 ----------
46// 4 Args to pass
47// . saved $GP (used in PIC)
48// . Alloca allocations
49// . Local Area
50// . CPU "Callee Saved" Registers
51// . saved FP
52// . saved RA
53// . FPU "Callee Saved" Registers
54// StackSize -----------
55//
56// Offset - offset from sp after stack allocation on function prologue
57//
58// The sp is the stack pointer subtracted/added from the stack size
59// at the Prologue/Epilogue
60//
61// References to the previous stack (to obtain arguments) are done
62// with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1))
63//
64// Examples:
65// - reference to the actual stack frame
66// for any local area var there is smt like : FI >= 0, StackOffset: 4
67// sw REGX, 4(SP)
68//
69// - reference to previous stack frame
70// suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16.
71// The emitted instruction will be something like:
72// lw REGX, 16+StackSize(SP)
73//
74// Since the total stack size is unknown on LowerFormalArguments, all
75// stack references (ObjectOffset) created to reference the function
76// arguments, are negative numbers. This way, on eliminateFrameIndex it's
77// possible to detect those references and the offsets are adjusted to
78// their real location.
79//
80//===----------------------------------------------------------------------===//
81
82void MipsFrameInfo::adjustMipsStackFrame(MachineFunction &MF) const {
83 MachineFrameInfo *MFI = MF.getFrameInfo();
84 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
85 const MipsRegisterInfo *RegInfo =
86 static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
87 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
88 unsigned StackAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
89 unsigned RegSize = STI.isGP32bit() ? 4 : 8;
90 bool HasGP = MipsFI->needGPSaveRestore();
91
92 // Min and Max CSI FrameIndex.
93 int MinCSFI = -1, MaxCSFI = -1;
94
95 // See the description at MipsMachineFunction.h
96 int TopCPUSavedRegOff = -1, TopFPUSavedRegOff = -1;
97
98 // Replace the dummy '0' SPOffset by the negative offsets, as explained on
99 // LowerFormalArguments. Leaving '0' for while is necessary to avoid the
100 // approach done by calculateFrameObjectOffsets to the stack frame.
101 MipsFI->adjustLoadArgsFI(MFI);
102 MipsFI->adjustStoreVarArgsFI(MFI);
103
104 // It happens that the default stack frame allocation order does not directly
105 // map to the convention used for mips. So we must fix it. We move the callee
106 // save register slots after the local variables area, as described in the
107 // stack frame above.
108 unsigned CalleeSavedAreaSize = 0;
109 if (!CSI.empty()) {
110 MinCSFI = CSI[0].getFrameIdx();
111 MaxCSFI = CSI[CSI.size()-1].getFrameIdx();
112 }
113 for (unsigned i = 0, e = CSI.size(); i != e; ++i)
114 CalleeSavedAreaSize += MFI->getObjectAlignment(CSI[i].getFrameIdx());
115
116 unsigned StackOffset = HasGP ? (MipsFI->getGPStackOffset()+RegSize)
117 : (STI.isABI_O32() ? 16 : 0);
118
119 // Adjust local variables. They should come on the stack right
120 // after the arguments.
121 int LastOffsetFI = -1;
122 for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
123 if (i >= MinCSFI && i <= MaxCSFI)
124 continue;
125 if (MFI->isDeadObjectIndex(i))
126 continue;
127 unsigned Offset =
128 StackOffset + MFI->getObjectOffset(i) - CalleeSavedAreaSize;
129 if (LastOffsetFI == -1)
130 LastOffsetFI = i;
131 if (Offset > MFI->getObjectOffset(LastOffsetFI))
132 LastOffsetFI = i;
133 MFI->setObjectOffset(i, Offset);
134 }
135
136 // Adjust CPU Callee Saved Registers Area. Registers RA and FP must
137 // be saved in this CPU Area. This whole area must be aligned to the
138 // default Stack Alignment requirements.
139 if (LastOffsetFI >= 0)
140 StackOffset = MFI->getObjectOffset(LastOffsetFI)+
141 MFI->getObjectSize(LastOffsetFI);
142 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
143
144 for (unsigned i = 0, e = CSI.size(); i != e ; ++i) {
145 unsigned Reg = CSI[i].getReg();
146 if (!Mips::CPURegsRegisterClass->contains(Reg))
147 break;
148 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset);
149 TopCPUSavedRegOff = StackOffset;
150 StackOffset += MFI->getObjectAlignment(CSI[i].getFrameIdx());
151 }
152
153 // Stack locations for FP and RA. If only one of them is used,
154 // the space must be allocated for both, otherwise no space at all.
155 if (RegInfo->hasFP(MF) || MFI->adjustsStack()) {
156 // FP stack location
157 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true),
158 StackOffset);
159 MipsFI->setFPStackOffset(StackOffset);
160 TopCPUSavedRegOff = StackOffset;
161 StackOffset += RegSize;
162
163 // SP stack location
164 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true),
165 StackOffset);
166 MipsFI->setRAStackOffset(StackOffset);
167 StackOffset += RegSize;
168
169 if (MFI->adjustsStack())
170 TopCPUSavedRegOff += RegSize;
171 }
172
173 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
174
175 // Adjust FPU Callee Saved Registers Area. This Area must be
176 // aligned to the default Stack Alignment requirements.
177 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
178 unsigned Reg = CSI[i].getReg();
179 if (Mips::CPURegsRegisterClass->contains(Reg))
180 continue;
181 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset);
182 TopFPUSavedRegOff = StackOffset;
183 StackOffset += MFI->getObjectAlignment(CSI[i].getFrameIdx());
184 }
185 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
186
187 // Update frame info
188 MFI->setStackSize(StackOffset);
189
190 // Recalculate the final tops offset. The final values must be '0'
191 // if there isn't a callee saved register for CPU or FPU, otherwise
192 // a negative offset is needed.
193 if (TopCPUSavedRegOff >= 0)
194 MipsFI->setCPUTopSavedRegOff(TopCPUSavedRegOff-StackOffset);
195
196 if (TopFPUSavedRegOff >= 0)
197 MipsFI->setFPUTopSavedRegOff(TopFPUSavedRegOff-StackOffset);
198}
199
200void MipsFrameInfo::emitPrologue(MachineFunction &MF) const {
201 MachineBasicBlock &MBB = MF.front();
202 MachineFrameInfo *MFI = MF.getFrameInfo();
203 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
204 const MipsRegisterInfo *RegInfo =
205 static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
206 const MipsInstrInfo &TII =
207 *static_cast<const MipsInstrInfo*>(MF.getTarget().getInstrInfo());
208 MachineBasicBlock::iterator MBBI = MBB.begin();
209 DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
210 bool isPIC = (MF.getTarget().getRelocationModel() == Reloc::PIC_);
211
212 // Get the right frame order for Mips.
213 adjustMipsStackFrame(MF);
214
215 // Get the number of bytes to allocate from the FrameInfo.
216 unsigned StackSize = MFI->getStackSize();
217
218 // No need to allocate space on the stack.
219 if (StackSize == 0 && !MFI->adjustsStack()) return;
220
221 int FPOffset = MipsFI->getFPStackOffset();
222 int RAOffset = MipsFI->getRAStackOffset();
223
224 BuildMI(MBB, MBBI, dl, TII.get(Mips::NOREORDER));
225
226 // TODO: check need from GP here.
227 if (isPIC && STI.isABI_O32())
228 BuildMI(MBB, MBBI, dl, TII.get(Mips::CPLOAD))
229 .addReg(RegInfo->getPICCallReg());
230 BuildMI(MBB, MBBI, dl, TII.get(Mips::NOMACRO));
231
232 // Adjust stack : addi sp, sp, (-imm)
233 BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDiu), Mips::SP)
234 .addReg(Mips::SP).addImm(-StackSize);
235
236 // Save the return address only if the function isnt a leaf one.
237 // sw $ra, stack_loc($sp)
238 if (MFI->adjustsStack()) {
239 BuildMI(MBB, MBBI, dl, TII.get(Mips::SW))
240 .addReg(Mips::RA).addImm(RAOffset).addReg(Mips::SP);
241 }
242
243 // if framepointer enabled, save it and set it
244 // to point to the stack pointer
245 if (RegInfo->hasFP(MF)) {
246 // sw $fp,stack_loc($sp)
247 BuildMI(MBB, MBBI, dl, TII.get(Mips::SW))
248 .addReg(Mips::FP).addImm(FPOffset).addReg(Mips::SP);
249
250 // move $fp, $sp
251 BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::FP)
252 .addReg(Mips::SP).addReg(Mips::ZERO);
253 }
254
255 // Restore GP from the saved stack location
256 if (MipsFI->needGPSaveRestore())
257 BuildMI(MBB, MBBI, dl, TII.get(Mips::CPRESTORE))
258 .addImm(MipsFI->getGPStackOffset());
259}
260
261void MipsFrameInfo::emitEpilogue(MachineFunction &MF,
262 MachineBasicBlock &MBB) const {
263 MachineBasicBlock::iterator MBBI = prior(MBB.end());
264 MachineFrameInfo *MFI = MF.getFrameInfo();
265 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
266 const MipsRegisterInfo *RegInfo =
267 static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
268 const MipsInstrInfo &TII =
269 *static_cast<const MipsInstrInfo*>(MF.getTarget().getInstrInfo());
270 DebugLoc dl = MBBI->getDebugLoc();
271
272 // Get the number of bytes from FrameInfo
273 int NumBytes = (int) MFI->getStackSize();
274
275 // Get the FI's where RA and FP are saved.
276 int FPOffset = MipsFI->getFPStackOffset();
277 int RAOffset = MipsFI->getRAStackOffset();
278
279 // if framepointer enabled, restore it and restore the
280 // stack pointer
281 if (RegInfo->hasFP(MF)) {
282 // move $sp, $fp
283 BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::SP)
284 .addReg(Mips::FP).addReg(Mips::ZERO);
285
286 // lw $fp,stack_loc($sp)
287 BuildMI(MBB, MBBI, dl, TII.get(Mips::LW), Mips::FP)
288 .addImm(FPOffset).addReg(Mips::SP);
289 }
290
291 // Restore the return address only if the function isnt a leaf one.
292 // lw $ra, stack_loc($sp)
293 if (MFI->adjustsStack()) {
294 BuildMI(MBB, MBBI, dl, TII.get(Mips::LW), Mips::RA)
295 .addImm(RAOffset).addReg(Mips::SP);
296 }
297
298 // adjust stack : insert addi sp, sp, (imm)
299 if (NumBytes) {
300 BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDiu), Mips::SP)
301 .addReg(Mips::SP).addImm(NumBytes);
302 }
303}