| //=== SystemZMachineFunctionInfo.h - SystemZ machine function info -*- C++ -*-// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H |
| #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINEFUNCTIONINFO_H |
| |
| #include "llvm/CodeGen/MachineFunction.h" |
| |
| namespace llvm { |
| |
| namespace SystemZ { |
| // A struct to hold the low and high GPR registers to be saved/restored as |
| // well as the offset into the register save area of the low register. |
| struct GPRRegs { |
| unsigned LowGPR; |
| unsigned HighGPR; |
| unsigned GPROffset; |
| GPRRegs() : LowGPR(0), HighGPR(0), GPROffset(0) {} |
| }; |
| } |
| |
| class SystemZMachineFunctionInfo : public MachineFunctionInfo { |
| virtual void anchor(); |
| |
| SystemZ::GPRRegs SpillGPRRegs; |
| SystemZ::GPRRegs RestoreGPRRegs; |
| unsigned VarArgsFirstGPR; |
| unsigned VarArgsFirstFPR; |
| unsigned VarArgsFrameIndex; |
| unsigned RegSaveFrameIndex; |
| int FramePointerSaveIndex; |
| bool ManipulatesSP; |
| unsigned NumLocalDynamics; |
| |
| public: |
| explicit SystemZMachineFunctionInfo(MachineFunction &MF) |
| : VarArgsFirstGPR(0), VarArgsFirstFPR(0), VarArgsFrameIndex(0), |
| RegSaveFrameIndex(0), FramePointerSaveIndex(0), ManipulatesSP(false), |
| NumLocalDynamics(0) {} |
| |
| // Get and set the first and last call-saved GPR that should be saved by |
| // this function and the SP offset for the STMG. These are 0 if no GPRs |
| // need to be saved or restored. |
| SystemZ::GPRRegs getSpillGPRRegs() const { return SpillGPRRegs; } |
| void setSpillGPRRegs(unsigned Low, unsigned High, unsigned Offs) { |
| SpillGPRRegs.LowGPR = Low; |
| SpillGPRRegs.HighGPR = High; |
| SpillGPRRegs.GPROffset = Offs; |
| } |
| |
| // Get and set the first and last call-saved GPR that should be restored by |
| // this function and the SP offset for the LMG. These are 0 if no GPRs |
| // need to be saved or restored. |
| SystemZ::GPRRegs getRestoreGPRRegs() const { return RestoreGPRRegs; } |
| void setRestoreGPRRegs(unsigned Low, unsigned High, unsigned Offs) { |
| RestoreGPRRegs.LowGPR = Low; |
| RestoreGPRRegs.HighGPR = High; |
| RestoreGPRRegs.GPROffset = Offs; |
| } |
| |
| // Get and set the number of fixed (as opposed to variable) arguments |
| // that are passed in GPRs to this function. |
| unsigned getVarArgsFirstGPR() const { return VarArgsFirstGPR; } |
| void setVarArgsFirstGPR(unsigned GPR) { VarArgsFirstGPR = GPR; } |
| |
| // Likewise FPRs. |
| unsigned getVarArgsFirstFPR() const { return VarArgsFirstFPR; } |
| void setVarArgsFirstFPR(unsigned FPR) { VarArgsFirstFPR = FPR; } |
| |
| // Get and set the frame index of the first stack vararg. |
| unsigned getVarArgsFrameIndex() const { return VarArgsFrameIndex; } |
| void setVarArgsFrameIndex(unsigned FI) { VarArgsFrameIndex = FI; } |
| |
| // Get and set the frame index of the register save area |
| // (i.e. the incoming stack pointer). |
| unsigned getRegSaveFrameIndex() const { return RegSaveFrameIndex; } |
| void setRegSaveFrameIndex(unsigned FI) { RegSaveFrameIndex = FI; } |
| |
| // Get and set the frame index of where the old frame pointer is stored. |
| int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } |
| void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } |
| |
| // Get and set whether the function directly manipulates the stack pointer, |
| // e.g. through STACKSAVE or STACKRESTORE. |
| bool getManipulatesSP() const { return ManipulatesSP; } |
| void setManipulatesSP(bool MSP) { ManipulatesSP = MSP; } |
| |
| // Count number of local-dynamic TLS symbols used. |
| unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; } |
| void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; } |
| }; |
| |
| } // end namespace llvm |
| |
| #endif |