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