MipsRegisterInfo.cpp (202878) | MipsRegisterInfo.cpp (203954) |
---|---|
1//===- MipsRegisterInfo.cpp - MIPS Register 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//===----------------------------------------------------------------------===// --- 209 unchanged lines hidden (view full) --- 218//===----------------------------------------------------------------------===// 219 220void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const 221{ 222 MachineFrameInfo *MFI = MF.getFrameInfo(); 223 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>(); 224 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); 225 unsigned StackAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); | 1//===- MipsRegisterInfo.cpp - MIPS Register 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//===----------------------------------------------------------------------===// --- 209 unchanged lines hidden (view full) --- 218//===----------------------------------------------------------------------===// 219 220void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const 221{ 222 MachineFrameInfo *MFI = MF.getFrameInfo(); 223 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>(); 224 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); 225 unsigned StackAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); |
226 unsigned RegSize = Subtarget.isGP32bit() ? 4 : 8; 227 bool HasGP = MipsFI->needGPSaveRestore(); |
|
226 227 // Min and Max CSI FrameIndex. 228 int MinCSFI = -1, MaxCSFI = -1; 229 230 // See the description at MipsMachineFunction.h 231 int TopCPUSavedRegOff = -1, TopFPUSavedRegOff = -1; 232 233 // Replace the dummy '0' SPOffset by the negative offsets, as explained on --- 9 unchanged lines hidden (view full) --- 243 unsigned CalleeSavedAreaSize = 0; 244 if (!CSI.empty()) { 245 MinCSFI = CSI[0].getFrameIdx(); 246 MaxCSFI = CSI[CSI.size()-1].getFrameIdx(); 247 } 248 for (unsigned i = 0, e = CSI.size(); i != e; ++i) 249 CalleeSavedAreaSize += MFI->getObjectAlignment(CSI[i].getFrameIdx()); 250 | 228 229 // Min and Max CSI FrameIndex. 230 int MinCSFI = -1, MaxCSFI = -1; 231 232 // See the description at MipsMachineFunction.h 233 int TopCPUSavedRegOff = -1, TopFPUSavedRegOff = -1; 234 235 // Replace the dummy '0' SPOffset by the negative offsets, as explained on --- 9 unchanged lines hidden (view full) --- 245 unsigned CalleeSavedAreaSize = 0; 246 if (!CSI.empty()) { 247 MinCSFI = CSI[0].getFrameIdx(); 248 MaxCSFI = CSI[CSI.size()-1].getFrameIdx(); 249 } 250 for (unsigned i = 0, e = CSI.size(); i != e; ++i) 251 CalleeSavedAreaSize += MFI->getObjectAlignment(CSI[i].getFrameIdx()); 252 |
253 unsigned StackOffset = HasGP ? (MipsFI->getGPStackOffset()+RegSize) 254 : (Subtarget.isABI_O32() ? 16 : 0); 255 |
|
251 // Adjust local variables. They should come on the stack right 252 // after the arguments. 253 int LastOffsetFI = -1; 254 for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) { 255 if (i >= MinCSFI && i <= MaxCSFI) 256 continue; 257 if (MFI->isDeadObjectIndex(i)) 258 continue; | 256 // Adjust local variables. They should come on the stack right 257 // after the arguments. 258 int LastOffsetFI = -1; 259 for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) { 260 if (i >= MinCSFI && i <= MaxCSFI) 261 continue; 262 if (MFI->isDeadObjectIndex(i)) 263 continue; |
259 unsigned Offset = MFI->getObjectOffset(i) - CalleeSavedAreaSize; | 264 unsigned Offset = 265 StackOffset + MFI->getObjectOffset(i) - CalleeSavedAreaSize; |
260 if (LastOffsetFI == -1) 261 LastOffsetFI = i; 262 if (Offset > MFI->getObjectOffset(LastOffsetFI)) 263 LastOffsetFI = i; 264 MFI->setObjectOffset(i, Offset); 265 } 266 267 // Adjust CPU Callee Saved Registers Area. Registers RA and FP must | 266 if (LastOffsetFI == -1) 267 LastOffsetFI = i; 268 if (Offset > MFI->getObjectOffset(LastOffsetFI)) 269 LastOffsetFI = i; 270 MFI->setObjectOffset(i, Offset); 271 } 272 273 // Adjust CPU Callee Saved Registers Area. Registers RA and FP must |
268 // be saved in this CPU Area there is the need. This whole Area must 269 // be aligned to the default Stack Alignment requirements. 270 unsigned StackOffset = 0; 271 unsigned RegSize = Subtarget.isGP32bit() ? 4 : 8; 272 | 274 // be saved in this CPU Area. This whole area must be aligned to the 275 // default Stack Alignment requirements. |
273 if (LastOffsetFI >= 0) 274 StackOffset = MFI->getObjectOffset(LastOffsetFI)+ 275 MFI->getObjectSize(LastOffsetFI); 276 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign); 277 278 for (unsigned i = 0, e = CSI.size(); i != e ; ++i) { 279 if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass) 280 break; 281 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset); 282 TopCPUSavedRegOff = StackOffset; 283 StackOffset += MFI->getObjectAlignment(CSI[i].getFrameIdx()); 284 } 285 | 276 if (LastOffsetFI >= 0) 277 StackOffset = MFI->getObjectOffset(LastOffsetFI)+ 278 MFI->getObjectSize(LastOffsetFI); 279 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign); 280 281 for (unsigned i = 0, e = CSI.size(); i != e ; ++i) { 282 if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass) 283 break; 284 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset); 285 TopCPUSavedRegOff = StackOffset; 286 StackOffset += MFI->getObjectAlignment(CSI[i].getFrameIdx()); 287 } 288 |
286 if (hasFP(MF)) { | 289 // Stack locations for FP and RA. If only one of them is used, 290 // the space must be allocated for both, otherwise no space at all. 291 if (hasFP(MF) || MFI->hasCalls()) { 292 // FP stack location |
287 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true), 288 StackOffset); 289 MipsFI->setFPStackOffset(StackOffset); 290 TopCPUSavedRegOff = StackOffset; 291 StackOffset += RegSize; | 293 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true), 294 StackOffset); 295 MipsFI->setFPStackOffset(StackOffset); 296 TopCPUSavedRegOff = StackOffset; 297 StackOffset += RegSize; |
292 } | |
293 | 298 |
294 if (MFI->hasCalls()) { | 299 // SP stack location |
295 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true), 296 StackOffset); 297 MipsFI->setRAStackOffset(StackOffset); | 300 MFI->setObjectOffset(MFI->CreateStackObject(RegSize, RegSize, true), 301 StackOffset); 302 MipsFI->setRAStackOffset(StackOffset); |
298 TopCPUSavedRegOff = StackOffset; | |
299 StackOffset += RegSize; | 303 StackOffset += RegSize; |
304 305 if (MFI->hasCalls()) 306 TopCPUSavedRegOff += RegSize; |
|
300 } | 307 } |
308 |
|
301 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign); 302 303 // Adjust FPU Callee Saved Registers Area. This Area must be 304 // aligned to the default Stack Alignment requirements. 305 for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 306 if (CSI[i].getRegClass() == Mips::CPURegsRegisterClass) 307 continue; 308 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset); --- 216 unchanged lines hidden --- | 309 StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign); 310 311 // Adjust FPU Callee Saved Registers Area. This Area must be 312 // aligned to the default Stack Alignment requirements. 313 for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 314 if (CSI[i].getRegClass() == Mips::CPURegsRegisterClass) 315 continue; 316 MFI->setObjectOffset(CSI[i].getFrameIdx(), StackOffset); --- 216 unchanged lines hidden --- |