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