diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2007-08-28 05:04:41 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2007-08-28 05:04:41 +0000 |
commit | ca0407551a98312f4fa9a4a348a22d72dd7208cc (patch) | |
tree | bae9c61205979dfce5a76a20f6afce78e37e6f84 /lib | |
parent | adf2e34ef48d49c38d6bec9913669b307c2a0b84 (diff) | |
download | external_llvm-ca0407551a98312f4fa9a4a348a22d72dd7208cc.tar.gz external_llvm-ca0407551a98312f4fa9a4a348a22d72dd7208cc.tar.bz2 external_llvm-ca0407551a98312f4fa9a4a348a22d72dd7208cc.zip |
Added methods to record SPOffsets from LowerFORMAL_ARGUMENTS
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41525 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/Mips/MipsMachineFunction.h | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/lib/Target/Mips/MipsMachineFunction.h b/lib/Target/Mips/MipsMachineFunction.h index b362dc3538..0f9a1e0e6a 100644 --- a/lib/Target/Mips/MipsMachineFunction.h +++ b/lib/Target/Mips/MipsMachineFunction.h @@ -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 @@ private: /// 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 @@ public: 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 |