| //===- XCoreMachineFunctionInfo.h - XCore 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares XCore-specific per-machine-function information. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H |
| #define LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H |
| |
| #include "llvm/CodeGen/MachineBasicBlock.h" |
| #include "llvm/CodeGen/MachineFrameInfo.h" |
| #include "llvm/CodeGen/MachineFunction.h" |
| #include <cassert> |
| #include <utility> |
| #include <vector> |
| |
| namespace llvm { |
| |
| /// XCoreFunctionInfo - This class is derived from MachineFunction private |
| /// XCore target-specific information for each MachineFunction. |
| class XCoreFunctionInfo : public MachineFunctionInfo { |
| bool LRSpillSlotSet = false; |
| int LRSpillSlot; |
| bool FPSpillSlotSet = false; |
| int FPSpillSlot; |
| bool EHSpillSlotSet = false; |
| int EHSpillSlot[2]; |
| unsigned ReturnStackOffset; |
| bool ReturnStackOffsetSet = false; |
| int VarArgsFrameIndex = 0; |
| mutable int CachedEStackSize = -1; |
| std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>> |
| SpillLabels; |
| |
| virtual void anchor(); |
| |
| public: |
| XCoreFunctionInfo() = default; |
| |
| explicit XCoreFunctionInfo(MachineFunction &MF) {} |
| |
| ~XCoreFunctionInfo() override = default; |
| |
| void setVarArgsFrameIndex(int off) { VarArgsFrameIndex = off; } |
| int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } |
| |
| int createLRSpillSlot(MachineFunction &MF); |
| bool hasLRSpillSlot() { return LRSpillSlotSet; } |
| int getLRSpillSlot() const { |
| assert(LRSpillSlotSet && "LR Spill slot not set"); |
| return LRSpillSlot; |
| } |
| |
| int createFPSpillSlot(MachineFunction &MF); |
| bool hasFPSpillSlot() { return FPSpillSlotSet; } |
| int getFPSpillSlot() const { |
| assert(FPSpillSlotSet && "FP Spill slot not set"); |
| return FPSpillSlot; |
| } |
| |
| const int* createEHSpillSlot(MachineFunction &MF); |
| bool hasEHSpillSlot() { return EHSpillSlotSet; } |
| const int* getEHSpillSlot() const { |
| assert(EHSpillSlotSet && "EH Spill slot not set"); |
| return EHSpillSlot; |
| } |
| |
| void setReturnStackOffset(unsigned value) { |
| assert(!ReturnStackOffsetSet && "Return stack offset set twice"); |
| ReturnStackOffset = value; |
| ReturnStackOffsetSet = true; |
| } |
| |
| unsigned getReturnStackOffset() const { |
| assert(ReturnStackOffsetSet && "Return stack offset not set"); |
| return ReturnStackOffset; |
| } |
| |
| bool isLargeFrame(const MachineFunction &MF) const; |
| |
| std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>> & |
| getSpillLabels() { |
| return SpillLabels; |
| } |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H |