MipsMachineFunction.h revision 225ca9cdd70de3d12641b0aba7daf6cb568a7ebd
14215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=// 24215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 34215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// The LLVM Compiler Infrastructure 44215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 74215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 84215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===----------------------------------------------------------------------===// 94215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// This file declares the Mips specific subclass of MachineFunctionInfo. 114215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 124215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===----------------------------------------------------------------------===// 134215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 144215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#ifndef MIPS_MACHINE_FUNCTION_INFO_H 154215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#define MIPS_MACHINE_FUNCTION_INFO_H 164215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 172d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/ADT/VectorExtras.h" 184215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#include "llvm/CodeGen/MachineFunction.h" 192d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h" 204215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 214215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesnamespace llvm { 224215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 234215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// MipsFunctionInfo - This class is derived from MachineFunction private 244215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// Mips target-specific information for each MachineFunction. 254215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesclass MipsFunctionInfo : public MachineFunctionInfo { 264215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesprivate: 28225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// Holds for each function where on the stack the Frame Pointer must be 29225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// saved. 304215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes int FPStackOffset; 314215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// Holds for each function where on the stack the Return Address must be 33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// saved. 344215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes int RAStackOffset; 354215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 362d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes /// MipsFIHolder - Holds a FrameIndex and it's Stack Pointer Offset 372d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes struct MipsFIHolder { 382d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 392d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes int FI; 402d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes int SPOffset; 412d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 422d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes MipsFIHolder(int FrameIndex, int StackPointerOffset) 432d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes : FI(FrameIndex), SPOffset(StackPointerOffset) {} 442d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes }; 452d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 46225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// When PIC is used the GP must be saved on the stack on the function 47225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// prologue and must be reloaded from this stack location after every 48225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// call. A reference to its stack location and frame index must be kept 49225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// to be used on emitPrologue and processFunctionBeforeFrameFinalized. 50c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes MipsFIHolder GPHolder; 51c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes 52225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // On LowerFORMAL_ARGUMENTS the stack size is unknown, so the Stack 53225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // Pointer Offset calculation of "not in register arguments" must be 54225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // postponed to emitPrologue. 552d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes SmallVector<MipsFIHolder, 16> FnLoadArgs; 562d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes bool HasLoadArgs; 572d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 58225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // When VarArgs, we must write registers back to caller stack, preserving 59225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // on register arguments. Since the stack size is unknown on 60225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes // LowerFORMAL_ARGUMENTS, the Stack Pointer Offset calculation must be 612d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes // postponed to emitPrologue. 622d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes SmallVector<MipsFIHolder, 4> FnStoreVarArgs; 632d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes bool HasStoreVarArgs; 642d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 65225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// SRetReturnReg - Some subtargets require that sret lowering includes 66225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// returning the value of the returned struct in a register. This field 67225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// holds the virtual register into which the sret argument is passed. 68225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned SRetReturnReg; 69225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes 704215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic: 714215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes MipsFunctionInfo(MachineFunction& MF) 72225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes : FPStackOffset(0), RAStackOffset(0), GPHolder(-1,-1), HasLoadArgs(false), 73225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes HasStoreVarArgs(false), SRetReturnReg(0) 744215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes {} 754215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 764215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes int getFPStackOffset() const { return FPStackOffset; } 774215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes void setFPStackOffset(int Off) { FPStackOffset = Off; } 784215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 794215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes int getRAStackOffset() const { return RAStackOffset; } 804215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes void setRAStackOffset(int Off) { RAStackOffset = Off; } 814215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 82c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes int getGPStackOffset() const { return GPHolder.SPOffset; } 83c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes int getGPFI() const { return GPHolder.FI; } 84c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes void setGPStackOffset(int Off) { GPHolder.SPOffset = Off; } 85c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes void setGPFI(int FI) { GPHolder.FI = FI; } 860a6040063fd9419041a81ada8f75b389381eb6b9Bruno Cardoso Lopes 874215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes int getTopSavedRegOffset() const { 884215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes return (RAStackOffset > FPStackOffset) ? 894215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes (RAStackOffset) : (FPStackOffset); 904215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes } 912d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 922d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes bool hasLoadArgs() const { return HasLoadArgs; } 932d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes bool hasStoreVarArgs() const { return HasStoreVarArgs; } 942d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 952d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes void recordLoadArgsFI(int FI, int SPOffset) { 962d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes if (!HasLoadArgs) HasLoadArgs=true; 972d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes FnLoadArgs.push_back(MipsFIHolder(FI, SPOffset)); 982d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes } 992d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes void recordStoreVarArgsFI(int FI, int SPOffset) { 1002d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes if (!HasStoreVarArgs) HasStoreVarArgs=true; 1012d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes FnStoreVarArgs.push_back(MipsFIHolder(FI, SPOffset)); 1022d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes } 1032d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 1042d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes void adjustLoadArgsFI(MachineFrameInfo *MFI) const { 1052d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes if (!hasLoadArgs()) return; 1062d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes for (unsigned i = 0, e = FnLoadArgs.size(); i != e; ++i) 1072d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes MFI->setObjectOffset( FnLoadArgs[i].FI, FnLoadArgs[i].SPOffset ); 1082d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes } 1092d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes void adjustStoreVarArgsFI(MachineFrameInfo *MFI) const { 1102d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes if (!hasStoreVarArgs()) return; 1112d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes for (unsigned i = 0, e = FnStoreVarArgs.size(); i != e; ++i) 1122d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes MFI->setObjectOffset( FnStoreVarArgs[i].FI, FnStoreVarArgs[i].SPOffset ); 1132d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes } 1142d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes 115225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned getSRetReturnReg() const { return SRetReturnReg; } 116225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 1174215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes}; 1184215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 1194215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm 1204215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 1212d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H 122