10b57cec5SDimitry Andric //=== SystemZMachineFunctionInfo.h - SystemZ machine function info -*- C++ -*-// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric namespace llvm { 150b57cec5SDimitry Andric 16480093f4SDimitry Andric namespace SystemZ { 17480093f4SDimitry Andric // A struct to hold the low and high GPR registers to be saved/restored as 18480093f4SDimitry Andric // well as the offset into the register save area of the low register. 19480093f4SDimitry Andric struct GPRRegs { 20*5f757f3fSDimitry Andric unsigned LowGPR = 0; 21*5f757f3fSDimitry Andric unsigned HighGPR = 0; 22*5f757f3fSDimitry Andric unsigned GPROffset = 0; 23*5f757f3fSDimitry Andric GPRRegs() = default; 24480093f4SDimitry Andric }; 25480093f4SDimitry Andric } 26480093f4SDimitry Andric 270b57cec5SDimitry Andric class SystemZMachineFunctionInfo : public MachineFunctionInfo { 280b57cec5SDimitry Andric virtual void anchor(); 29480093f4SDimitry Andric 3006c3fb27SDimitry Andric /// Size of expected parameter area for current function. (Fixed args only). 3106c3fb27SDimitry Andric unsigned SizeOfFnParams; 3206c3fb27SDimitry Andric 33480093f4SDimitry Andric SystemZ::GPRRegs SpillGPRRegs; 34480093f4SDimitry Andric SystemZ::GPRRegs RestoreGPRRegs; 355ffd83dbSDimitry Andric Register VarArgsFirstGPR; 365ffd83dbSDimitry Andric Register VarArgsFirstFPR; 370b57cec5SDimitry Andric unsigned VarArgsFrameIndex; 380b57cec5SDimitry Andric unsigned RegSaveFrameIndex; 390b57cec5SDimitry Andric int FramePointerSaveIndex; 400b57cec5SDimitry Andric unsigned NumLocalDynamics; 4106c3fb27SDimitry Andric /// z/OS XPLINK ABI: incoming ADA virtual register. 4206c3fb27SDimitry Andric Register VRegADA; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric public: SystemZMachineFunctionInfo(const Function & F,const TargetSubtargetInfo * STI)45bdd1243dSDimitry Andric SystemZMachineFunctionInfo(const Function &F, const TargetSubtargetInfo *STI) 4606c3fb27SDimitry Andric : SizeOfFnParams(0), VarArgsFirstGPR(0), VarArgsFirstFPR(0), 4706c3fb27SDimitry Andric VarArgsFrameIndex(0), RegSaveFrameIndex(0), FramePointerSaveIndex(0), 4806c3fb27SDimitry Andric NumLocalDynamics(0) {} 490b57cec5SDimitry Andric 5081ad6265SDimitry Andric MachineFunctionInfo * 5181ad6265SDimitry Andric clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, 5281ad6265SDimitry Andric const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) 5381ad6265SDimitry Andric const override; 5481ad6265SDimitry Andric 5506c3fb27SDimitry Andric // z/OS: Get and set the size of the expected parameter area for the 5606c3fb27SDimitry Andric // current function. (ie. Size of param area in caller). getSizeOfFnParams()5706c3fb27SDimitry Andric unsigned getSizeOfFnParams() const { return SizeOfFnParams; } setSizeOfFnParams(unsigned Size)5806c3fb27SDimitry Andric void setSizeOfFnParams(unsigned Size) { SizeOfFnParams = Size; } 5906c3fb27SDimitry Andric 60480093f4SDimitry Andric // Get and set the first and last call-saved GPR that should be saved by 61480093f4SDimitry Andric // this function and the SP offset for the STMG. These are 0 if no GPRs 62480093f4SDimitry Andric // need to be saved or restored. getSpillGPRRegs()63480093f4SDimitry Andric SystemZ::GPRRegs getSpillGPRRegs() const { return SpillGPRRegs; } setSpillGPRRegs(Register Low,Register High,unsigned Offs)645ffd83dbSDimitry Andric void setSpillGPRRegs(Register Low, Register High, unsigned Offs) { 65480093f4SDimitry Andric SpillGPRRegs.LowGPR = Low; 66480093f4SDimitry Andric SpillGPRRegs.HighGPR = High; 67480093f4SDimitry Andric SpillGPRRegs.GPROffset = Offs; 68480093f4SDimitry Andric } 690b57cec5SDimitry Andric 70480093f4SDimitry Andric // Get and set the first and last call-saved GPR that should be restored by 71480093f4SDimitry Andric // this function and the SP offset for the LMG. These are 0 if no GPRs 72480093f4SDimitry Andric // need to be saved or restored. getRestoreGPRRegs()73480093f4SDimitry Andric SystemZ::GPRRegs getRestoreGPRRegs() const { return RestoreGPRRegs; } setRestoreGPRRegs(Register Low,Register High,unsigned Offs)745ffd83dbSDimitry Andric void setRestoreGPRRegs(Register Low, Register High, unsigned Offs) { 75480093f4SDimitry Andric RestoreGPRRegs.LowGPR = Low; 76480093f4SDimitry Andric RestoreGPRRegs.HighGPR = High; 77480093f4SDimitry Andric RestoreGPRRegs.GPROffset = Offs; 78480093f4SDimitry Andric } 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric // Get and set the number of fixed (as opposed to variable) arguments 810b57cec5SDimitry Andric // that are passed in GPRs to this function. getVarArgsFirstGPR()825ffd83dbSDimitry Andric Register getVarArgsFirstGPR() const { return VarArgsFirstGPR; } setVarArgsFirstGPR(Register GPR)835ffd83dbSDimitry Andric void setVarArgsFirstGPR(Register GPR) { VarArgsFirstGPR = GPR; } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric // Likewise FPRs. getVarArgsFirstFPR()865ffd83dbSDimitry Andric Register getVarArgsFirstFPR() const { return VarArgsFirstFPR; } setVarArgsFirstFPR(Register FPR)875ffd83dbSDimitry Andric void setVarArgsFirstFPR(Register FPR) { VarArgsFirstFPR = FPR; } 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric // Get and set the frame index of the first stack vararg. getVarArgsFrameIndex()900b57cec5SDimitry Andric unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; } setVarArgsFrameIndex(unsigned FI)910b57cec5SDimitry Andric void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; } 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric // Get and set the frame index of the register save area 940b57cec5SDimitry Andric // (i.e. the incoming stack pointer). getRegSaveFrameIndex()950b57cec5SDimitry Andric unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; } setRegSaveFrameIndex(unsigned FI)960b57cec5SDimitry Andric void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; } 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric // Get and set the frame index of where the old frame pointer is stored. getFramePointerSaveIndex()990b57cec5SDimitry Andric int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } setFramePointerSaveIndex(int Idx)1000b57cec5SDimitry Andric void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric // Count number of local-dynamic TLS symbols used. getNumLocalDynamicTLSAccesses()1030b57cec5SDimitry Andric unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; } incNumLocalDynamicTLSAccesses()1040b57cec5SDimitry Andric void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; } 10506c3fb27SDimitry Andric 10606c3fb27SDimitry Andric // Get and set the function's incoming special XPLINK ABI defined ADA 10706c3fb27SDimitry Andric // register. getADAVirtualRegister()10806c3fb27SDimitry Andric Register getADAVirtualRegister() const { return VRegADA; } setADAVirtualRegister(Register Reg)10906c3fb27SDimitry Andric void setADAVirtualRegister(Register Reg) { VRegADA = Reg; } 1100b57cec5SDimitry Andric }; 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric } // end namespace llvm 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric #endif 115