1*0b57cec5SDimitry Andric //=== SystemZMachineFunctionInfo.h - SystemZ machine function info -*- C++ -*-// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 10*0b57cec5SDimitry Andric #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric namespace llvm { 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric class SystemZMachineFunctionInfo : public MachineFunctionInfo { 17*0b57cec5SDimitry Andric virtual void anchor(); 18*0b57cec5SDimitry Andric unsigned LowSavedGPR; 19*0b57cec5SDimitry Andric unsigned HighSavedGPR; 20*0b57cec5SDimitry Andric unsigned VarArgsFirstGPR; 21*0b57cec5SDimitry Andric unsigned VarArgsFirstFPR; 22*0b57cec5SDimitry Andric unsigned VarArgsFrameIndex; 23*0b57cec5SDimitry Andric unsigned RegSaveFrameIndex; 24*0b57cec5SDimitry Andric int FramePointerSaveIndex; 25*0b57cec5SDimitry Andric bool ManipulatesSP; 26*0b57cec5SDimitry Andric unsigned NumLocalDynamics; 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andric public: 29*0b57cec5SDimitry Andric explicit SystemZMachineFunctionInfo(MachineFunction &MF) 30*0b57cec5SDimitry Andric : LowSavedGPR(0), HighSavedGPR(0), VarArgsFirstGPR(0), VarArgsFirstFPR(0), 31*0b57cec5SDimitry Andric VarArgsFrameIndex(0), RegSaveFrameIndex(0), FramePointerSaveIndex(0), 32*0b57cec5SDimitry Andric ManipulatesSP(false), NumLocalDynamics(0) {} 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric // Get and set the first call-saved GPR that should be saved and restored 35*0b57cec5SDimitry Andric // by this function. This is 0 if no GPRs need to be saved or restored. 36*0b57cec5SDimitry Andric unsigned getLowSavedGPR() const { return LowSavedGPR; } 37*0b57cec5SDimitry Andric void setLowSavedGPR(unsigned Reg) { LowSavedGPR = Reg; } 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric // Get and set the last call-saved GPR that should be saved and restored 40*0b57cec5SDimitry Andric // by this function. 41*0b57cec5SDimitry Andric unsigned getHighSavedGPR() const { return HighSavedGPR; } 42*0b57cec5SDimitry Andric void setHighSavedGPR(unsigned Reg) { HighSavedGPR = Reg; } 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric // Get and set the number of fixed (as opposed to variable) arguments 45*0b57cec5SDimitry Andric // that are passed in GPRs to this function. 46*0b57cec5SDimitry Andric unsigned getVarArgsFirstGPR() const { return VarArgsFirstGPR; } 47*0b57cec5SDimitry Andric void setVarArgsFirstGPR(unsigned GPR) { VarArgsFirstGPR = GPR; } 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric // Likewise FPRs. 50*0b57cec5SDimitry Andric unsigned getVarArgsFirstFPR() const { return VarArgsFirstFPR; } 51*0b57cec5SDimitry Andric void setVarArgsFirstFPR(unsigned FPR) { VarArgsFirstFPR = FPR; } 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andric // Get and set the frame index of the first stack vararg. 54*0b57cec5SDimitry Andric unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 55*0b57cec5SDimitry Andric void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; } 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric // Get and set the frame index of the register save area 58*0b57cec5SDimitry Andric // (i.e. the incoming stack pointer). 59*0b57cec5SDimitry Andric unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; } 60*0b57cec5SDimitry Andric void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; } 61*0b57cec5SDimitry Andric 62*0b57cec5SDimitry Andric // Get and set the frame index of where the old frame pointer is stored. 63*0b57cec5SDimitry Andric int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } 64*0b57cec5SDimitry Andric void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andric // Get and set whether the function directly manipulates the stack pointer, 67*0b57cec5SDimitry Andric // e.g. through STACKSAVE or STACKRESTORE. 68*0b57cec5SDimitry Andric bool getManipulatesSP() const { return ManipulatesSP; } 69*0b57cec5SDimitry Andric void setManipulatesSP(bool MSP) { ManipulatesSP = MSP; } 70*0b57cec5SDimitry Andric 71*0b57cec5SDimitry Andric // Count number of local-dynamic TLS symbols used. 72*0b57cec5SDimitry Andric unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; } 73*0b57cec5SDimitry Andric void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; } 74*0b57cec5SDimitry Andric }; 75*0b57cec5SDimitry Andric 76*0b57cec5SDimitry Andric } // end namespace llvm 77*0b57cec5SDimitry Andric 78*0b57cec5SDimitry Andric #endif 79