MBlazeMachineFunction.h revision 204642
1217309Snwhitehorn//===-- MBlazeMachineFunctionInfo.h - Private data ----------------*- C++ -*-=// 2217309Snwhitehorn// 3217309Snwhitehorn// The LLVM Compiler Infrastructure 4217309Snwhitehorn// 5217309Snwhitehorn// This file is distributed under the University of Illinois Open Source 6217309Snwhitehorn// License. See LICENSE.TXT for details. 7217309Snwhitehorn// 8217309Snwhitehorn//===----------------------------------------------------------------------===// 9217309Snwhitehorn// 10217309Snwhitehorn// This file declares the MBlaze specific subclass of MachineFunctionInfo. 11217309Snwhitehorn// 12217309Snwhitehorn//===----------------------------------------------------------------------===// 13217309Snwhitehorn 14217309Snwhitehorn#ifndef MBLAZE_MACHINE_FUNCTION_INFO_H 15217309Snwhitehorn#define MBLAZE_MACHINE_FUNCTION_INFO_H 16217309Snwhitehorn 17217309Snwhitehorn#include "llvm/ADT/SmallVector.h" 18217309Snwhitehorn#include "llvm/ADT/VectorExtras.h" 19217309Snwhitehorn#include "llvm/CodeGen/MachineFunction.h" 20217309Snwhitehorn#include "llvm/CodeGen/MachineFrameInfo.h" 21217309Snwhitehorn 22217309Snwhitehornnamespace llvm { 23217309Snwhitehorn 24217309Snwhitehorn/// MBlazeFunctionInfo - This class is derived from MachineFunction private 25217309Snwhitehorn/// MBlaze target-specific information for each MachineFunction. 26217309Snwhitehornclass MBlazeFunctionInfo : public MachineFunctionInfo { 27217309Snwhitehorn 28217309Snwhitehornprivate: 29217309Snwhitehorn /// Holds for each function where on the stack the Frame Pointer must be 30217309Snwhitehorn /// saved. This is used on Prologue and Epilogue to emit FP save/restore 31217309Snwhitehorn int FPStackOffset; 32217309Snwhitehorn 33217309Snwhitehorn /// Holds for each function where on the stack the Return Address must be 34217309Snwhitehorn /// saved. This is used on Prologue and Epilogue to emit RA save/restore 35217309Snwhitehorn int RAStackOffset; 36217309Snwhitehorn 37217309Snwhitehorn /// At each function entry a special bitmask directive must be emitted 38217309Snwhitehorn /// to help in debugging CPU callee saved registers. It needs a negative 39217309Snwhitehorn /// offset from the final stack size and its higher register location on 40217309Snwhitehorn /// the stack. 41217309Snwhitehorn int CPUTopSavedRegOff; 42217309Snwhitehorn 43217309Snwhitehorn /// MBlazeFIHolder - Holds a FrameIndex and it's Stack Pointer Offset 44217309Snwhitehorn struct MBlazeFIHolder { 45217309Snwhitehorn 46217309Snwhitehorn int FI; 47217309Snwhitehorn int SPOffset; 48217309Snwhitehorn 49217309Snwhitehorn MBlazeFIHolder(int FrameIndex, int StackPointerOffset) 50217309Snwhitehorn : FI(FrameIndex), SPOffset(StackPointerOffset) {} 51217309Snwhitehorn }; 52217309Snwhitehorn 53217309Snwhitehorn /// When PIC is used the GP must be saved on the stack on the function 54217309Snwhitehorn /// prologue and must be reloaded from this stack location after every 55217309Snwhitehorn /// call. A reference to its stack location and frame index must be kept 56217309Snwhitehorn /// to be used on emitPrologue and processFunctionBeforeFrameFinalized. 57217309Snwhitehorn MBlazeFIHolder GPHolder; 58217309Snwhitehorn 59217309Snwhitehorn /// On LowerFormalArguments the stack size is unknown, so the Stack 60217309Snwhitehorn /// Pointer Offset calculation of "not in register arguments" must be 61217309Snwhitehorn /// postponed to emitPrologue. 62217309Snwhitehorn SmallVector<MBlazeFIHolder, 16> FnLoadArgs; 63217309Snwhitehorn bool HasLoadArgs; 64217309Snwhitehorn 65217309Snwhitehorn // When VarArgs, we must write registers back to caller stack, preserving 66217309Snwhitehorn // on register arguments. Since the stack size is unknown on 67217309Snwhitehorn // LowerFormalArguments, the Stack Pointer Offset calculation must be 68217309Snwhitehorn // postponed to emitPrologue. 69217309Snwhitehorn SmallVector<MBlazeFIHolder, 4> FnStoreVarArgs; 70217309Snwhitehorn bool HasStoreVarArgs; 71217309Snwhitehorn 72217309Snwhitehorn /// SRetReturnReg - Some subtargets require that sret lowering includes 73217309Snwhitehorn /// returning the value of the returned struct in a register. This field 74217309Snwhitehorn /// holds the virtual register into which the sret argument is passed. 75217309Snwhitehorn unsigned SRetReturnReg; 76217309Snwhitehorn 77217309Snwhitehorn /// GlobalBaseReg - keeps track of the virtual register initialized for 78217309Snwhitehorn /// use as the global base register. This is used for PIC in some PIC 79217309Snwhitehorn /// relocation models. 80217309Snwhitehorn unsigned GlobalBaseReg; 81217309Snwhitehorn 82217309Snwhitehornpublic: 83217309Snwhitehorn MBlazeFunctionInfo(MachineFunction& MF) 84217309Snwhitehorn : FPStackOffset(0), RAStackOffset(0), CPUTopSavedRegOff(0), 85217309Snwhitehorn GPHolder(-1,-1), HasLoadArgs(false), HasStoreVarArgs(false), 86217309Snwhitehorn SRetReturnReg(0), GlobalBaseReg(0) 87217309Snwhitehorn {} 88217309Snwhitehorn 89217309Snwhitehorn int getFPStackOffset() const { return FPStackOffset; } 90217309Snwhitehorn void setFPStackOffset(int Off) { FPStackOffset = Off; } 91217309Snwhitehorn 92217309Snwhitehorn int getRAStackOffset() const { return RAStackOffset; } 93217309Snwhitehorn void setRAStackOffset(int Off) { RAStackOffset = Off; } 94217309Snwhitehorn 95217309Snwhitehorn int getCPUTopSavedRegOff() const { return CPUTopSavedRegOff; } 96217309Snwhitehorn void setCPUTopSavedRegOff(int Off) { CPUTopSavedRegOff = Off; } 97217309Snwhitehorn 98217309Snwhitehorn int getGPStackOffset() const { return GPHolder.SPOffset; } 99217309Snwhitehorn int getGPFI() const { return GPHolder.FI; } 100217309Snwhitehorn void setGPStackOffset(int Off) { GPHolder.SPOffset = Off; } 101217309Snwhitehorn void setGPFI(int FI) { GPHolder.FI = FI; } 102217309Snwhitehorn bool needGPSaveRestore() const { return GPHolder.SPOffset != -1; } 103217309Snwhitehorn 104217309Snwhitehorn bool hasLoadArgs() const { return HasLoadArgs; } 105217309Snwhitehorn bool hasStoreVarArgs() const { return HasStoreVarArgs; } 106217309Snwhitehorn 107217309Snwhitehorn void recordLoadArgsFI(int FI, int SPOffset) { 108217309Snwhitehorn if (!HasLoadArgs) HasLoadArgs=true; 109217309Snwhitehorn FnLoadArgs.push_back(MBlazeFIHolder(FI, SPOffset)); 110217309Snwhitehorn } 111217309Snwhitehorn void recordStoreVarArgsFI(int FI, int SPOffset) { 112217309Snwhitehorn if (!HasStoreVarArgs) HasStoreVarArgs=true; 113217309Snwhitehorn FnStoreVarArgs.push_back(MBlazeFIHolder(FI, SPOffset)); 114217309Snwhitehorn } 115217309Snwhitehorn 116217309Snwhitehorn void adjustLoadArgsFI(MachineFrameInfo *MFI) const { 117217309Snwhitehorn if (!hasLoadArgs()) return; 118217309Snwhitehorn for (unsigned i = 0, e = FnLoadArgs.size(); i != e; ++i) 119217309Snwhitehorn MFI->setObjectOffset( FnLoadArgs[i].FI, FnLoadArgs[i].SPOffset ); 120217309Snwhitehorn } 121217309Snwhitehorn void adjustStoreVarArgsFI(MachineFrameInfo *MFI) const { 122217309Snwhitehorn if (!hasStoreVarArgs()) return; 123217309Snwhitehorn for (unsigned i = 0, e = FnStoreVarArgs.size(); i != e; ++i) 124217309Snwhitehorn MFI->setObjectOffset( FnStoreVarArgs[i].FI, FnStoreVarArgs[i].SPOffset ); 125217309Snwhitehorn } 126217309Snwhitehorn 127217309Snwhitehorn unsigned getSRetReturnReg() const { return SRetReturnReg; } 128217309Snwhitehorn void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 129217309Snwhitehorn 130217309Snwhitehorn unsigned getGlobalBaseReg() const { return GlobalBaseReg; } 131217309Snwhitehorn void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; } 132217309Snwhitehorn}; 133217309Snwhitehorn 134217309Snwhitehorn} // end of namespace llvm 135217309Snwhitehorn 136217309Snwhitehorn#endif // MBLAZE_MACHINE_FUNCTION_INFO_H 137217309Snwhitehorn