Author: bruno Date: Tue Aug 28 00:04:41 2007 New Revision: 41525 URL: http://llvm.org/viewvc/llvm-project?rev=41525&view=rev Log: Added methods to record SPOffsets from LowerFORMAL_ARGUMENTS
Modified: llvm/trunk/lib/Target/Mips/MipsMachineFunction.h Modified: llvm/trunk/lib/Target/Mips/MipsMachineFunction.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsMachineFunction.h?rev=41525&r1=41524&r2=41525&view=diff ============================================================================== --- llvm/trunk/lib/Target/Mips/MipsMachineFunction.h (original) +++ llvm/trunk/lib/Target/Mips/MipsMachineFunction.h Tue Aug 28 00:04:41 2007 @@ -14,7 +14,9 @@ #ifndef MIPS_MACHINE_FUNCTION_INFO_H #define MIPS_MACHINE_FUNCTION_INFO_H +#include "llvm/ADT/VectorExtras.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" namespace llvm { @@ -31,9 +33,34 @@ /// the Return Address must be saved int RAStackOffset; + /// MipsFIHolder - Holds a FrameIndex and it's Stack Pointer Offset + struct MipsFIHolder { + + int FI; + int SPOffset; + + MipsFIHolder(int FrameIndex, int StackPointerOffset) + : FI(FrameIndex), SPOffset(StackPointerOffset) {} + }; + + // On LowerFORMAL_ARGUMENTS the stack size is unknown, + // so the Stack Pointer Offset calculation of "not in + // register arguments" must be postponed to emitPrologue. + SmallVector<MipsFIHolder, 16> FnLoadArgs; + bool HasLoadArgs; + + // When VarArgs, we must write registers back to caller + // stack, preserving on register arguments. Since the + // stack size is unknown on LowerFORMAL_ARGUMENTS, + // the Stack Pointer Offset calculation must be + // postponed to emitPrologue. + SmallVector<MipsFIHolder, 4> FnStoreVarArgs; + bool HasStoreVarArgs; + public: MipsFunctionInfo(MachineFunction& MF) - : FPStackOffset(0), RAStackOffset(0) + : FPStackOffset(0), RAStackOffset(0), + HasLoadArgs(false), HasStoreVarArgs(false) {} int getFPStackOffset() const { return FPStackOffset; } @@ -46,9 +73,32 @@ return (RAStackOffset > FPStackOffset) ? (RAStackOffset) : (FPStackOffset); } + + bool hasLoadArgs() const { return HasLoadArgs; } + bool hasStoreVarArgs() const { return HasStoreVarArgs; } + + void recordLoadArgsFI(int FI, int SPOffset) { + if (!HasLoadArgs) HasLoadArgs=true; + FnLoadArgs.push_back(MipsFIHolder(FI, SPOffset)); + } + void recordStoreVarArgsFI(int FI, int SPOffset) { + if (!HasStoreVarArgs) HasStoreVarArgs=true; + FnStoreVarArgs.push_back(MipsFIHolder(FI, SPOffset)); + } + + void adjustLoadArgsFI(MachineFrameInfo *MFI) const { + if (!hasLoadArgs()) return; + for (unsigned i = 0, e = FnLoadArgs.size(); i != e; ++i) + MFI->setObjectOffset( FnLoadArgs[i].FI, FnLoadArgs[i].SPOffset ); + } + void adjustStoreVarArgsFI(MachineFrameInfo *MFI) const { + if (!hasStoreVarArgs()) return; + for (unsigned i = 0, e = FnStoreVarArgs.size(); i != e; ++i) + MFI->setObjectOffset( FnStoreVarArgs[i].FI, FnStoreVarArgs[i].SPOffset ); + } + }; } // end of namespace llvm - -#endif +#endif // MIPS_MACHINE_FUNCTION_INFO_H _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits