1*5f613dfdSUlrich Weigand //==- SystemZMachineFuctionInfo.h - SystemZ machine function info -*- C++ -*-=//
2*5f613dfdSUlrich Weigand //
3*5f613dfdSUlrich Weigand //                     The LLVM Compiler Infrastructure
4*5f613dfdSUlrich Weigand //
5*5f613dfdSUlrich Weigand // This file is distributed under the University of Illinois Open Source
6*5f613dfdSUlrich Weigand // License. See LICENSE.TXT for details.
7*5f613dfdSUlrich Weigand //
8*5f613dfdSUlrich Weigand //===----------------------------------------------------------------------===//
9*5f613dfdSUlrich Weigand 
10*5f613dfdSUlrich Weigand #ifndef SYSTEMZMACHINEFUNCTIONINFO_H
11*5f613dfdSUlrich Weigand #define SYSTEMZMACHINEFUNCTIONINFO_H
12*5f613dfdSUlrich Weigand 
13*5f613dfdSUlrich Weigand #include "llvm/CodeGen/MachineFunction.h"
14*5f613dfdSUlrich Weigand 
15*5f613dfdSUlrich Weigand namespace llvm {
16*5f613dfdSUlrich Weigand 
17*5f613dfdSUlrich Weigand class SystemZMachineFunctionInfo : public MachineFunctionInfo {
18*5f613dfdSUlrich Weigand   unsigned SavedGPRFrameSize;
19*5f613dfdSUlrich Weigand   unsigned LowSavedGPR;
20*5f613dfdSUlrich Weigand   unsigned HighSavedGPR;
21*5f613dfdSUlrich Weigand   unsigned VarArgsFirstGPR;
22*5f613dfdSUlrich Weigand   unsigned VarArgsFirstFPR;
23*5f613dfdSUlrich Weigand   unsigned VarArgsFrameIndex;
24*5f613dfdSUlrich Weigand   unsigned RegSaveFrameIndex;
25*5f613dfdSUlrich Weigand   bool ManipulatesSP;
26*5f613dfdSUlrich Weigand 
27*5f613dfdSUlrich Weigand public:
28*5f613dfdSUlrich Weigand   explicit SystemZMachineFunctionInfo(MachineFunction &MF)
29*5f613dfdSUlrich Weigand     : SavedGPRFrameSize(0), LowSavedGPR(0), HighSavedGPR(0), VarArgsFirstGPR(0),
30*5f613dfdSUlrich Weigand       VarArgsFirstFPR(0), VarArgsFrameIndex(0), RegSaveFrameIndex(0),
31*5f613dfdSUlrich Weigand       ManipulatesSP(false) {}
32*5f613dfdSUlrich Weigand 
33*5f613dfdSUlrich Weigand   // Get and set the number of bytes allocated by generic code to store
34*5f613dfdSUlrich Weigand   // call-saved GPRs.
35*5f613dfdSUlrich Weigand   unsigned getSavedGPRFrameSize() const { return SavedGPRFrameSize; }
36*5f613dfdSUlrich Weigand   void setSavedGPRFrameSize(unsigned bytes) { SavedGPRFrameSize = bytes; }
37*5f613dfdSUlrich Weigand 
38*5f613dfdSUlrich Weigand   // Get and set the first call-saved GPR that should be saved and restored
39*5f613dfdSUlrich Weigand   // by this function.  This is 0 if no GPRs need to be saved or restored.
40*5f613dfdSUlrich Weigand   unsigned getLowSavedGPR() const { return LowSavedGPR; }
41*5f613dfdSUlrich Weigand   void setLowSavedGPR(unsigned Reg) { LowSavedGPR = Reg; }
42*5f613dfdSUlrich Weigand 
43*5f613dfdSUlrich Weigand   // Get and set the last call-saved GPR that should be saved and restored
44*5f613dfdSUlrich Weigand   // by this function.
45*5f613dfdSUlrich Weigand   unsigned getHighSavedGPR() const { return HighSavedGPR; }
46*5f613dfdSUlrich Weigand   void setHighSavedGPR(unsigned Reg) { HighSavedGPR = Reg; }
47*5f613dfdSUlrich Weigand 
48*5f613dfdSUlrich Weigand   // Get and set the number of fixed (as opposed to variable) arguments
49*5f613dfdSUlrich Weigand   // that are passed in GPRs to this function.
50*5f613dfdSUlrich Weigand   unsigned getVarArgsFirstGPR() const { return VarArgsFirstGPR; }
51*5f613dfdSUlrich Weigand   void setVarArgsFirstGPR(unsigned GPR) { VarArgsFirstGPR = GPR; }
52*5f613dfdSUlrich Weigand 
53*5f613dfdSUlrich Weigand   // Likewise FPRs.
54*5f613dfdSUlrich Weigand   unsigned getVarArgsFirstFPR() const { return VarArgsFirstFPR; }
55*5f613dfdSUlrich Weigand   void setVarArgsFirstFPR(unsigned FPR) { VarArgsFirstFPR = FPR; }
56*5f613dfdSUlrich Weigand 
57*5f613dfdSUlrich Weigand   // Get and set the frame index of the first stack vararg.
58*5f613dfdSUlrich Weigand   unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
59*5f613dfdSUlrich Weigand   void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; }
60*5f613dfdSUlrich Weigand 
61*5f613dfdSUlrich Weigand   // Get and set the frame index of the register save area
62*5f613dfdSUlrich Weigand   // (i.e. the incoming stack pointer).
63*5f613dfdSUlrich Weigand   unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
64*5f613dfdSUlrich Weigand   void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; }
65*5f613dfdSUlrich Weigand 
66*5f613dfdSUlrich Weigand   // Get and set whether the function directly manipulates the stack pointer,
67*5f613dfdSUlrich Weigand   // e.g. through STACKSAVE or STACKRESTORE.
68*5f613dfdSUlrich Weigand   bool getManipulatesSP() const { return ManipulatesSP; }
69*5f613dfdSUlrich Weigand   void setManipulatesSP(bool MSP) { ManipulatesSP = MSP; }
70*5f613dfdSUlrich Weigand };
71*5f613dfdSUlrich Weigand 
72*5f613dfdSUlrich Weigand } // end llvm namespace
73*5f613dfdSUlrich Weigand 
74*5f613dfdSUlrich Weigand #endif
75