1//===- XCoreMachineFunctionInfo.h - XCore machine function info -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares XCore-specific per-machine-function information.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
14#define LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
15
16#include "llvm/CodeGen/MachineBasicBlock.h"
17#include "llvm/CodeGen/MachineFrameInfo.h"
18#include "llvm/CodeGen/MachineFunction.h"
19#include <cassert>
20#include <utility>
21#include <vector>
22
23namespace llvm {
24
25/// XCoreFunctionInfo - This class is derived from MachineFunction private
26/// XCore target-specific information for each MachineFunction.
27class XCoreFunctionInfo : public MachineFunctionInfo {
28  bool LRSpillSlotSet = false;
29  int LRSpillSlot;
30  bool FPSpillSlotSet = false;
31  int FPSpillSlot;
32  bool EHSpillSlotSet = false;
33  int EHSpillSlot[2];
34  unsigned ReturnStackOffset;
35  bool ReturnStackOffsetSet = false;
36  int VarArgsFrameIndex = 0;
37  mutable int CachedEStackSize = -1;
38  std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>>
39  SpillLabels;
40
41  virtual void anchor();
42
43public:
44  XCoreFunctionInfo() = default;
45
46  explicit XCoreFunctionInfo(MachineFunction &MF) {}
47
48  ~XCoreFunctionInfo() override = default;
49
50  void setVarArgsFrameIndex(int off) { VarArgsFrameIndex = off; }
51  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
52
53  int createLRSpillSlot(MachineFunction &MF);
54  bool hasLRSpillSlot() { return LRSpillSlotSet; }
55  int getLRSpillSlot() const {
56    assert(LRSpillSlotSet && "LR Spill slot not set");
57    return LRSpillSlot;
58  }
59
60  int createFPSpillSlot(MachineFunction &MF);
61  bool hasFPSpillSlot() { return FPSpillSlotSet; }
62  int getFPSpillSlot() const {
63    assert(FPSpillSlotSet && "FP Spill slot not set");
64    return FPSpillSlot;
65  }
66
67  const int* createEHSpillSlot(MachineFunction &MF);
68  bool hasEHSpillSlot() { return EHSpillSlotSet; }
69  const int* getEHSpillSlot() const {
70    assert(EHSpillSlotSet && "EH Spill slot not set");
71    return EHSpillSlot;
72  }
73
74  void setReturnStackOffset(unsigned value) {
75    assert(!ReturnStackOffsetSet && "Return stack offset set twice");
76    ReturnStackOffset = value;
77    ReturnStackOffsetSet = true;
78  }
79
80  unsigned getReturnStackOffset() const {
81    assert(ReturnStackOffsetSet && "Return stack offset not set");
82    return ReturnStackOffset;
83  }
84
85  bool isLargeFrame(const MachineFunction &MF) const;
86
87  std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>> &
88  getSpillLabels() {
89    return SpillLabels;
90  }
91};
92
93} // end namespace llvm
94
95#endif // LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
96