| //===- 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 |