xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVMachineFunctionInfo.h (revision 3a9a9c0ca44ec535dcf73fe8462bee458e54814b)
10b57cec5SDimitry Andric //=- RISCVMachineFunctionInfo.h - RISCV machine function info -----*- C++ -*-=//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file declares RISCV-specific per-machine-function information.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
150b57cec5SDimitry Andric 
165ffd83dbSDimitry Andric #include "RISCVSubtarget.h"
17*3a9a9c0cSDimitry Andric #include "llvm/CodeGen/MIRYamlMapping.h"
180b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
190b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
23*3a9a9c0cSDimitry Andric class RISCVMachineFunctionInfo;
24*3a9a9c0cSDimitry Andric 
25*3a9a9c0cSDimitry Andric namespace yaml {
26*3a9a9c0cSDimitry Andric struct RISCVMachineFunctionInfo final : public yaml::MachineFunctionInfo {
27*3a9a9c0cSDimitry Andric   int VarArgsFrameIndex;
28*3a9a9c0cSDimitry Andric   int VarArgsSaveSize;
29*3a9a9c0cSDimitry Andric 
30*3a9a9c0cSDimitry Andric   RISCVMachineFunctionInfo() = default;
31*3a9a9c0cSDimitry Andric   RISCVMachineFunctionInfo(const llvm::RISCVMachineFunctionInfo &MFI);
32*3a9a9c0cSDimitry Andric 
33*3a9a9c0cSDimitry Andric   void mappingImpl(yaml::IO &YamlIO) override;
34*3a9a9c0cSDimitry Andric   ~RISCVMachineFunctionInfo() = default;
35*3a9a9c0cSDimitry Andric };
36*3a9a9c0cSDimitry Andric 
37*3a9a9c0cSDimitry Andric template <> struct MappingTraits<RISCVMachineFunctionInfo> {
38*3a9a9c0cSDimitry Andric   static void mapping(IO &YamlIO, RISCVMachineFunctionInfo &MFI) {
39*3a9a9c0cSDimitry Andric     YamlIO.mapOptional("varArgsFrameIndex", MFI.VarArgsFrameIndex);
40*3a9a9c0cSDimitry Andric     YamlIO.mapOptional("varArgsSaveSize", MFI.VarArgsSaveSize);
41*3a9a9c0cSDimitry Andric   }
42*3a9a9c0cSDimitry Andric };
43*3a9a9c0cSDimitry Andric } // end namespace yaml
44*3a9a9c0cSDimitry Andric 
450b57cec5SDimitry Andric /// RISCVMachineFunctionInfo - This class is derived from MachineFunctionInfo
460b57cec5SDimitry Andric /// and contains private RISCV-specific information for each MachineFunction.
470b57cec5SDimitry Andric class RISCVMachineFunctionInfo : public MachineFunctionInfo {
480b57cec5SDimitry Andric private:
490b57cec5SDimitry Andric   /// FrameIndex for start of varargs area
500b57cec5SDimitry Andric   int VarArgsFrameIndex = 0;
510b57cec5SDimitry Andric   /// Size of the save area used for varargs
520b57cec5SDimitry Andric   int VarArgsSaveSize = 0;
530b57cec5SDimitry Andric   /// FrameIndex used for transferring values between 64-bit FPRs and a pair
540b57cec5SDimitry Andric   /// of 32-bit GPRs via the stack.
550b57cec5SDimitry Andric   int MoveF64FrameIndex = -1;
565ffd83dbSDimitry Andric   /// Size of any opaque stack adjustment due to save/restore libcalls.
575ffd83dbSDimitry Andric   unsigned LibCallStackSize = 0;
58fe6060f1SDimitry Andric   /// Size of RVV stack.
59fe6060f1SDimitry Andric   uint64_t RVVStackSize = 0;
60fe6060f1SDimitry Andric   /// Padding required to keep RVV stack aligned within the main stack.
61fe6060f1SDimitry Andric   uint64_t RVVPadding = 0;
62fe6060f1SDimitry Andric   /// Size of stack frame to save callee saved registers
63fe6060f1SDimitry Andric   unsigned CalleeSavedStackSize = 0;
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric public:
665ffd83dbSDimitry Andric   RISCVMachineFunctionInfo(const MachineFunction &MF) {}
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
690b57cec5SDimitry Andric   void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   unsigned getVarArgsSaveSize() const { return VarArgsSaveSize; }
720b57cec5SDimitry Andric   void setVarArgsSaveSize(int Size) { VarArgsSaveSize = Size; }
730b57cec5SDimitry Andric 
745ffd83dbSDimitry Andric   int getMoveF64FrameIndex(MachineFunction &MF) {
750b57cec5SDimitry Andric     if (MoveF64FrameIndex == -1)
765ffd83dbSDimitry Andric       MoveF64FrameIndex =
775ffd83dbSDimitry Andric           MF.getFrameInfo().CreateStackObject(8, Align(8), false);
780b57cec5SDimitry Andric     return MoveF64FrameIndex;
790b57cec5SDimitry Andric   }
805ffd83dbSDimitry Andric 
815ffd83dbSDimitry Andric   unsigned getLibCallStackSize() const { return LibCallStackSize; }
825ffd83dbSDimitry Andric   void setLibCallStackSize(unsigned Size) { LibCallStackSize = Size; }
835ffd83dbSDimitry Andric 
845ffd83dbSDimitry Andric   bool useSaveRestoreLibCalls(const MachineFunction &MF) const {
855ffd83dbSDimitry Andric     // We cannot use fixed locations for the callee saved spill slots if the
86fe6060f1SDimitry Andric     // function uses a varargs save area, or is an interrupt handler.
875ffd83dbSDimitry Andric     return MF.getSubtarget<RISCVSubtarget>().enableSaveRestore() &&
88fe6060f1SDimitry Andric            VarArgsSaveSize == 0 && !MF.getFrameInfo().hasTailCall() &&
89fe6060f1SDimitry Andric            !MF.getFunction().hasFnAttribute("interrupt");
905ffd83dbSDimitry Andric   }
91fe6060f1SDimitry Andric 
92fe6060f1SDimitry Andric   uint64_t getRVVStackSize() const { return RVVStackSize; }
93fe6060f1SDimitry Andric   void setRVVStackSize(uint64_t Size) { RVVStackSize = Size; }
94fe6060f1SDimitry Andric 
95fe6060f1SDimitry Andric   uint64_t getRVVPadding() const { return RVVPadding; }
96fe6060f1SDimitry Andric   void setRVVPadding(uint64_t Padding) { RVVPadding = Padding; }
97fe6060f1SDimitry Andric 
98fe6060f1SDimitry Andric   unsigned getCalleeSavedStackSize() const { return CalleeSavedStackSize; }
99fe6060f1SDimitry Andric   void setCalleeSavedStackSize(unsigned Size) { CalleeSavedStackSize = Size; }
100*3a9a9c0cSDimitry Andric 
101*3a9a9c0cSDimitry Andric   void initializeBaseYamlFields(const yaml::RISCVMachineFunctionInfo &YamlMFI);
1020b57cec5SDimitry Andric };
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric } // end namespace llvm
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
107