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