1c3890d29SNick Lewycky //=== SystemZMachineFunctionInfo.h - SystemZ machine function info -*- C++ -*-//
25f613dfdSUlrich Weigand //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f613dfdSUlrich Weigand //
75f613dfdSUlrich Weigand //===----------------------------------------------------------------------===//
85f613dfdSUlrich Weigand 
9a7c40ef0SBenjamin Kramer #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H
10a7c40ef0SBenjamin Kramer #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H
115f613dfdSUlrich Weigand 
125f613dfdSUlrich Weigand #include "llvm/CodeGen/MachineFunction.h"
135f613dfdSUlrich Weigand 
145f613dfdSUlrich Weigand namespace llvm {
155f613dfdSUlrich Weigand 
1661f5ba5cSJonas Paulsson namespace SystemZ {
1761f5ba5cSJonas Paulsson // A struct to hold the low and high GPR registers to be saved/restored as
1861f5ba5cSJonas Paulsson // well as the offset into the register save area of the low register.
1961f5ba5cSJonas Paulsson struct GPRRegs {
2061f5ba5cSJonas Paulsson   unsigned LowGPR;
2161f5ba5cSJonas Paulsson   unsigned HighGPR;
2261f5ba5cSJonas Paulsson   unsigned GPROffset;
GPRRegsGPRRegs2361f5ba5cSJonas Paulsson   GPRRegs() : LowGPR(0), HighGPR(0), GPROffset(0) {}
2461f5ba5cSJonas Paulsson   };
2561f5ba5cSJonas Paulsson }
2661f5ba5cSJonas Paulsson 
275f613dfdSUlrich Weigand class SystemZMachineFunctionInfo : public MachineFunctionInfo {
28d12ccbd3SJuergen Ributzka   virtual void anchor();
2961f5ba5cSJonas Paulsson 
3061f5ba5cSJonas Paulsson   SystemZ::GPRRegs SpillGPRRegs;
3161f5ba5cSJonas Paulsson   SystemZ::GPRRegs RestoreGPRRegs;
324dad4914SMatt Arsenault   Register VarArgsFirstGPR;
334dad4914SMatt Arsenault   Register VarArgsFirstFPR;
345f613dfdSUlrich Weigand   unsigned VarArgsFrameIndex;
355f613dfdSUlrich Weigand   unsigned RegSaveFrameIndex;
36f557d083SUlrich Weigand   int FramePointerSaveIndex;
377db6918eSUlrich Weigand   unsigned NumLocalDynamics;
385f613dfdSUlrich Weigand 
395f613dfdSUlrich Weigand public:
SystemZMachineFunctionInfo(MachineFunction & MF)405f613dfdSUlrich Weigand   explicit SystemZMachineFunctionInfo(MachineFunction &MF)
4161f5ba5cSJonas Paulsson     : VarArgsFirstGPR(0), VarArgsFirstFPR(0), VarArgsFrameIndex(0),
42792853cbSJonas Paulsson       RegSaveFrameIndex(0), FramePointerSaveIndex(0), NumLocalDynamics(0) {}
435f613dfdSUlrich Weigand 
44*cc5a1b3dSMatt Arsenault   MachineFunctionInfo *
45*cc5a1b3dSMatt Arsenault   clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF,
46*cc5a1b3dSMatt Arsenault         const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
47*cc5a1b3dSMatt Arsenault       const override;
48*cc5a1b3dSMatt Arsenault 
4961f5ba5cSJonas Paulsson   // Get and set the first and last call-saved GPR that should be saved by
5061f5ba5cSJonas Paulsson   // this function and the SP offset for the STMG.  These are 0 if no GPRs
5161f5ba5cSJonas Paulsson   // need to be saved or restored.
getSpillGPRRegs()5261f5ba5cSJonas Paulsson   SystemZ::GPRRegs getSpillGPRRegs() const { return SpillGPRRegs; }
setSpillGPRRegs(Register Low,Register High,unsigned Offs)534dad4914SMatt Arsenault   void setSpillGPRRegs(Register Low, Register High, unsigned Offs) {
5461f5ba5cSJonas Paulsson     SpillGPRRegs.LowGPR = Low;
5561f5ba5cSJonas Paulsson     SpillGPRRegs.HighGPR = High;
5661f5ba5cSJonas Paulsson     SpillGPRRegs.GPROffset = Offs;
5761f5ba5cSJonas Paulsson   }
585f613dfdSUlrich Weigand 
5961f5ba5cSJonas Paulsson   // Get and set the first and last call-saved GPR that should be restored by
6061f5ba5cSJonas Paulsson   // this function and the SP offset for the LMG.  These are 0 if no GPRs
6161f5ba5cSJonas Paulsson   // need to be saved or restored.
getRestoreGPRRegs()6261f5ba5cSJonas Paulsson   SystemZ::GPRRegs getRestoreGPRRegs() const { return RestoreGPRRegs; }
setRestoreGPRRegs(Register Low,Register High,unsigned Offs)634dad4914SMatt Arsenault   void setRestoreGPRRegs(Register Low, Register High, unsigned Offs) {
6461f5ba5cSJonas Paulsson     RestoreGPRRegs.LowGPR = Low;
6561f5ba5cSJonas Paulsson     RestoreGPRRegs.HighGPR = High;
6661f5ba5cSJonas Paulsson     RestoreGPRRegs.GPROffset = Offs;
6761f5ba5cSJonas Paulsson   }
685f613dfdSUlrich Weigand 
695f613dfdSUlrich Weigand   // Get and set the number of fixed (as opposed to variable) arguments
705f613dfdSUlrich Weigand   // that are passed in GPRs to this function.
getVarArgsFirstGPR()714dad4914SMatt Arsenault   Register getVarArgsFirstGPR() const { return VarArgsFirstGPR; }
setVarArgsFirstGPR(Register GPR)724dad4914SMatt Arsenault   void setVarArgsFirstGPR(Register GPR) { VarArgsFirstGPR = GPR; }
735f613dfdSUlrich Weigand 
745f613dfdSUlrich Weigand   // Likewise FPRs.
getVarArgsFirstFPR()754dad4914SMatt Arsenault   Register getVarArgsFirstFPR() const { return VarArgsFirstFPR; }
setVarArgsFirstFPR(Register FPR)764dad4914SMatt Arsenault   void setVarArgsFirstFPR(Register FPR) { VarArgsFirstFPR = FPR; }
775f613dfdSUlrich Weigand 
785f613dfdSUlrich Weigand   // Get and set the frame index of the first stack vararg.
getVarArgsFrameIndex()795f613dfdSUlrich Weigand   unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
setVarArgsFrameIndex(unsigned FI)805f613dfdSUlrich Weigand   void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; }
815f613dfdSUlrich Weigand 
825f613dfdSUlrich Weigand   // Get and set the frame index of the register save area
835f613dfdSUlrich Weigand   // (i.e. the incoming stack pointer).
getRegSaveFrameIndex()845f613dfdSUlrich Weigand   unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
setRegSaveFrameIndex(unsigned FI)855f613dfdSUlrich Weigand   void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; }
865f613dfdSUlrich Weigand 
87f557d083SUlrich Weigand   // Get and set the frame index of where the old frame pointer is stored.
getFramePointerSaveIndex()88f557d083SUlrich Weigand   int getFramePointerSaveIndex() const { return FramePointerSaveIndex; }
setFramePointerSaveIndex(int Idx)89f557d083SUlrich Weigand   void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; }
90f557d083SUlrich Weigand 
917db6918eSUlrich Weigand   // Count number of local-dynamic TLS symbols used.
getNumLocalDynamicTLSAccesses()927db6918eSUlrich Weigand   unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; }
incNumLocalDynamicTLSAccesses()937db6918eSUlrich Weigand   void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; }
945f613dfdSUlrich Weigand };
955f613dfdSUlrich Weigand 
96c231269fSRichard Sandiford } // end namespace llvm
975f613dfdSUlrich Weigand 
985f613dfdSUlrich Weigand #endif
99