17d523365SDimitry Andric //=== SystemZMachineFunctionInfo.h - SystemZ machine function info -*- C++ -*-// 2284c1978SDimitry Andric // 3284c1978SDimitry Andric // The LLVM Compiler Infrastructure 4284c1978SDimitry Andric // 5284c1978SDimitry Andric // This file is distributed under the University of Illinois Open Source 6284c1978SDimitry Andric // License. See LICENSE.TXT for details. 7284c1978SDimitry Andric // 8284c1978SDimitry Andric //===----------------------------------------------------------------------===// 9284c1978SDimitry Andric 1039d628a0SDimitry Andric #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 1139d628a0SDimitry Andric #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 12284c1978SDimitry Andric 13284c1978SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 14284c1978SDimitry Andric 15284c1978SDimitry Andric namespace llvm { 16284c1978SDimitry Andric 17284c1978SDimitry Andric class SystemZMachineFunctionInfo : public MachineFunctionInfo { 18f785676fSDimitry Andric virtual void anchor(); 19284c1978SDimitry Andric unsigned LowSavedGPR; 20284c1978SDimitry Andric unsigned HighSavedGPR; 21284c1978SDimitry Andric unsigned VarArgsFirstGPR; 22284c1978SDimitry Andric unsigned VarArgsFirstFPR; 23284c1978SDimitry Andric unsigned VarArgsFrameIndex; 24284c1978SDimitry Andric unsigned RegSaveFrameIndex; 25*3ca95b02SDimitry Andric int FramePointerSaveIndex; 26284c1978SDimitry Andric bool ManipulatesSP; 27ff0cc061SDimitry Andric unsigned NumLocalDynamics; 28284c1978SDimitry Andric 29284c1978SDimitry Andric public: SystemZMachineFunctionInfo(MachineFunction & MF)30284c1978SDimitry Andric explicit SystemZMachineFunctionInfo(MachineFunction &MF) 31f785676fSDimitry Andric : LowSavedGPR(0), HighSavedGPR(0), VarArgsFirstGPR(0), VarArgsFirstFPR(0), 32*3ca95b02SDimitry Andric VarArgsFrameIndex(0), RegSaveFrameIndex(0), FramePointerSaveIndex(0), 33*3ca95b02SDimitry Andric ManipulatesSP(false), NumLocalDynamics(0) {} 34284c1978SDimitry Andric 35284c1978SDimitry Andric // Get and set the first call-saved GPR that should be saved and restored 36284c1978SDimitry Andric // by this function. This is 0 if no GPRs need to be saved or restored. getLowSavedGPR()37284c1978SDimitry Andric unsigned getLowSavedGPR() const { return LowSavedGPR; } setLowSavedGPR(unsigned Reg)38284c1978SDimitry Andric void setLowSavedGPR(unsigned Reg) { LowSavedGPR = Reg; } 39284c1978SDimitry Andric 40284c1978SDimitry Andric // Get and set the last call-saved GPR that should be saved and restored 41284c1978SDimitry Andric // by this function. getHighSavedGPR()42284c1978SDimitry Andric unsigned getHighSavedGPR() const { return HighSavedGPR; } setHighSavedGPR(unsigned Reg)43284c1978SDimitry Andric void setHighSavedGPR(unsigned Reg) { HighSavedGPR = Reg; } 44284c1978SDimitry Andric 45284c1978SDimitry Andric // Get and set the number of fixed (as opposed to variable) arguments 46284c1978SDimitry Andric // that are passed in GPRs to this function. getVarArgsFirstGPR()47284c1978SDimitry Andric unsigned getVarArgsFirstGPR() const { return VarArgsFirstGPR; } setVarArgsFirstGPR(unsigned GPR)48284c1978SDimitry Andric void setVarArgsFirstGPR(unsigned GPR) { VarArgsFirstGPR = GPR; } 49284c1978SDimitry Andric 50284c1978SDimitry Andric // Likewise FPRs. getVarArgsFirstFPR()51284c1978SDimitry Andric unsigned getVarArgsFirstFPR() const { return VarArgsFirstFPR; } setVarArgsFirstFPR(unsigned FPR)52284c1978SDimitry Andric void setVarArgsFirstFPR(unsigned FPR) { VarArgsFirstFPR = FPR; } 53284c1978SDimitry Andric 54284c1978SDimitry Andric // Get and set the frame index of the first stack vararg. getVarArgsFrameIndex()55284c1978SDimitry Andric unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; } setVarArgsFrameIndex(unsigned FI)56284c1978SDimitry Andric void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; } 57284c1978SDimitry Andric 58284c1978SDimitry Andric // Get and set the frame index of the register save area 59284c1978SDimitry Andric // (i.e. the incoming stack pointer). getRegSaveFrameIndex()60284c1978SDimitry Andric unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; } setRegSaveFrameIndex(unsigned FI)61284c1978SDimitry Andric void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; } 62284c1978SDimitry Andric 63*3ca95b02SDimitry Andric // Get and set the frame index of where the old frame pointer is stored. getFramePointerSaveIndex()64*3ca95b02SDimitry Andric int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } setFramePointerSaveIndex(int Idx)65*3ca95b02SDimitry Andric void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } 66*3ca95b02SDimitry Andric 67284c1978SDimitry Andric // Get and set whether the function directly manipulates the stack pointer, 68284c1978SDimitry Andric // e.g. through STACKSAVE or STACKRESTORE. getManipulatesSP()69284c1978SDimitry Andric bool getManipulatesSP() const { return ManipulatesSP; } setManipulatesSP(bool MSP)70284c1978SDimitry Andric void setManipulatesSP(bool MSP) { ManipulatesSP = MSP; } 71ff0cc061SDimitry Andric 72ff0cc061SDimitry Andric // Count number of local-dynamic TLS symbols used. getNumLocalDynamicTLSAccesses()73ff0cc061SDimitry Andric unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; } incNumLocalDynamicTLSAccesses()74ff0cc061SDimitry Andric void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; } 75284c1978SDimitry Andric }; 76284c1978SDimitry Andric 7791bc56edSDimitry Andric } // end namespace llvm 78284c1978SDimitry Andric 79284c1978SDimitry Andric #endif 80