xref: /llvm-project/llvm/lib/Target/LoongArch/LoongArchMachineFunctionInfo.h (revision 4c2c177567390cd3d8de3fd757e9234f1da832b7)
133388ae8SLu Weining //=- LoongArchMachineFunctionInfo.h - LoongArch machine function info -----===//
233388ae8SLu Weining //
333388ae8SLu Weining // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
433388ae8SLu Weining // See https://llvm.org/LICENSE.txt for license information.
533388ae8SLu Weining // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
633388ae8SLu Weining //
733388ae8SLu Weining //===----------------------------------------------------------------------===//
833388ae8SLu Weining //
933388ae8SLu Weining // This file declares LoongArch-specific per-machine-function information.
1033388ae8SLu Weining //
1133388ae8SLu Weining //===----------------------------------------------------------------------===//
1233388ae8SLu Weining 
1333388ae8SLu Weining #ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHMACHINEFUNCTIONINFO_H
1433388ae8SLu Weining #define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHMACHINEFUNCTIONINFO_H
1533388ae8SLu Weining 
1633388ae8SLu Weining #include "LoongArchSubtarget.h"
1733388ae8SLu Weining #include "llvm/CodeGen/MachineFrameInfo.h"
1833388ae8SLu Weining #include "llvm/CodeGen/MachineFunction.h"
1933388ae8SLu Weining 
2033388ae8SLu Weining namespace llvm {
2133388ae8SLu Weining 
2233388ae8SLu Weining /// LoongArchMachineFunctionInfo - This class is derived from
2333388ae8SLu Weining /// MachineFunctionInfo and contains private LoongArch-specific information for
2433388ae8SLu Weining /// each MachineFunction.
2533388ae8SLu Weining class LoongArchMachineFunctionInfo : public MachineFunctionInfo {
2633388ae8SLu Weining private:
2733388ae8SLu Weining   /// FrameIndex for start of varargs area
2833388ae8SLu Weining   int VarArgsFrameIndex = 0;
2933388ae8SLu Weining   /// Size of the save area used for varargs
3033388ae8SLu Weining   int VarArgsSaveSize = 0;
3133388ae8SLu Weining 
3233388ae8SLu Weining   /// Size of stack frame to save callee saved registers
3333388ae8SLu Weining   unsigned CalleeSavedStackSize = 0;
3433388ae8SLu Weining 
3503d07e18SXiaodong Liu   /// FrameIndex of the spill slot when there is no scavenged register in
3603d07e18SXiaodong Liu   /// insertIndirectBranch.
3703d07e18SXiaodong Liu   int BranchRelaxationSpillFrameIndex = -1;
3803d07e18SXiaodong Liu 
39e9bcd2bfShev   /// Registers that have been sign extended from i32.
40e9bcd2bfShev   SmallVector<Register, 8> SExt32Registers;
41e9bcd2bfShev 
42*4c2c1775Swanglei   /// Pairs of `jr` instructions and corresponding JTI operands, used for the
43*4c2c1775Swanglei   /// `annotate-tablejump` option.
44*4c2c1775Swanglei   SmallVector<std::pair<MachineInstr *, MachineOperand *>, 4> JumpInfos;
45*4c2c1775Swanglei 
4633388ae8SLu Weining public:
4769e75ae6SMatt Arsenault   LoongArchMachineFunctionInfo(const Function &F,
4869e75ae6SMatt Arsenault                                const TargetSubtargetInfo *STI) {}
4933388ae8SLu Weining 
50cc5a1b3dSMatt Arsenault   MachineFunctionInfo *
51cc5a1b3dSMatt Arsenault   clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF,
52cc5a1b3dSMatt Arsenault         const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
53cc5a1b3dSMatt Arsenault       const override {
54cc5a1b3dSMatt Arsenault     return DestMF.cloneInfo<LoongArchMachineFunctionInfo>(*this);
55cc5a1b3dSMatt Arsenault   }
56cc5a1b3dSMatt Arsenault 
5733388ae8SLu Weining   int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
5833388ae8SLu Weining   void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
5933388ae8SLu Weining 
6033388ae8SLu Weining   unsigned getVarArgsSaveSize() const { return VarArgsSaveSize; }
6133388ae8SLu Weining   void setVarArgsSaveSize(int Size) { VarArgsSaveSize = Size; }
6233388ae8SLu Weining 
6333388ae8SLu Weining   unsigned getCalleeSavedStackSize() const { return CalleeSavedStackSize; }
6433388ae8SLu Weining   void setCalleeSavedStackSize(unsigned Size) { CalleeSavedStackSize = Size; }
6503d07e18SXiaodong Liu 
6603d07e18SXiaodong Liu   int getBranchRelaxationSpillFrameIndex() {
6703d07e18SXiaodong Liu     return BranchRelaxationSpillFrameIndex;
6803d07e18SXiaodong Liu   }
6903d07e18SXiaodong Liu   void setBranchRelaxationSpillFrameIndex(int Index) {
7003d07e18SXiaodong Liu     BranchRelaxationSpillFrameIndex = Index;
7103d07e18SXiaodong Liu   }
72e9bcd2bfShev 
73e9bcd2bfShev   void addSExt32Register(Register Reg) { SExt32Registers.push_back(Reg); }
74e9bcd2bfShev 
75e9bcd2bfShev   bool isSExt32Register(Register Reg) const {
76e9bcd2bfShev     return is_contained(SExt32Registers, Reg);
77e9bcd2bfShev   }
78*4c2c1775Swanglei 
79*4c2c1775Swanglei   void setJumpInfo(MachineInstr *JrMI, MachineOperand *JTIMO) {
80*4c2c1775Swanglei     JumpInfos.push_back(std::make_pair(JrMI, JTIMO));
81*4c2c1775Swanglei   }
82*4c2c1775Swanglei   unsigned getJumpInfoSize() { return JumpInfos.size(); }
83*4c2c1775Swanglei   MachineInstr *getJumpInfoJrMI(unsigned Idx) { return JumpInfos[Idx].first; }
84*4c2c1775Swanglei   MachineOperand *getJumpInfoJTIMO(unsigned Idx) {
85*4c2c1775Swanglei     return JumpInfos[Idx].second;
86*4c2c1775Swanglei   }
8733388ae8SLu Weining };
8833388ae8SLu Weining 
8933388ae8SLu Weining } // end namespace llvm
9033388ae8SLu Weining 
9133388ae8SLu Weining #endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHMACHINEFUNCTIONINFO_H
92