xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVMachineFunctionInfo.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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"
170b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
180b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric namespace llvm {
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric /// RISCVMachineFunctionInfo - This class is derived from MachineFunctionInfo
230b57cec5SDimitry Andric /// and contains private RISCV-specific information for each MachineFunction.
240b57cec5SDimitry Andric class RISCVMachineFunctionInfo : public MachineFunctionInfo {
250b57cec5SDimitry Andric private:
260b57cec5SDimitry Andric   /// FrameIndex for start of varargs area
270b57cec5SDimitry Andric   int VarArgsFrameIndex = 0;
280b57cec5SDimitry Andric   /// Size of the save area used for varargs
290b57cec5SDimitry Andric   int VarArgsSaveSize = 0;
300b57cec5SDimitry Andric   /// FrameIndex used for transferring values between 64-bit FPRs and a pair
310b57cec5SDimitry Andric   /// of 32-bit GPRs via the stack.
320b57cec5SDimitry Andric   int MoveF64FrameIndex = -1;
335ffd83dbSDimitry Andric   /// Size of any opaque stack adjustment due to save/restore libcalls.
345ffd83dbSDimitry Andric   unsigned LibCallStackSize = 0;
35*fe6060f1SDimitry Andric   /// Size of RVV stack.
36*fe6060f1SDimitry Andric   uint64_t RVVStackSize = 0;
37*fe6060f1SDimitry Andric   /// Padding required to keep RVV stack aligned within the main stack.
38*fe6060f1SDimitry Andric   uint64_t RVVPadding = 0;
39*fe6060f1SDimitry Andric   /// Size of stack frame to save callee saved registers
40*fe6060f1SDimitry Andric   unsigned CalleeSavedStackSize = 0;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric public:
435ffd83dbSDimitry Andric   RISCVMachineFunctionInfo(const MachineFunction &MF) {}
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
460b57cec5SDimitry Andric   void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   unsigned getVarArgsSaveSize() const { return VarArgsSaveSize; }
490b57cec5SDimitry Andric   void setVarArgsSaveSize(int Size) { VarArgsSaveSize = Size; }
500b57cec5SDimitry Andric 
515ffd83dbSDimitry Andric   int getMoveF64FrameIndex(MachineFunction &MF) {
520b57cec5SDimitry Andric     if (MoveF64FrameIndex == -1)
535ffd83dbSDimitry Andric       MoveF64FrameIndex =
545ffd83dbSDimitry Andric           MF.getFrameInfo().CreateStackObject(8, Align(8), false);
550b57cec5SDimitry Andric     return MoveF64FrameIndex;
560b57cec5SDimitry Andric   }
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric   unsigned getLibCallStackSize() const { return LibCallStackSize; }
595ffd83dbSDimitry Andric   void setLibCallStackSize(unsigned Size) { LibCallStackSize = Size; }
605ffd83dbSDimitry Andric 
615ffd83dbSDimitry Andric   bool useSaveRestoreLibCalls(const MachineFunction &MF) const {
625ffd83dbSDimitry Andric     // We cannot use fixed locations for the callee saved spill slots if the
63*fe6060f1SDimitry Andric     // function uses a varargs save area, or is an interrupt handler.
645ffd83dbSDimitry Andric     return MF.getSubtarget<RISCVSubtarget>().enableSaveRestore() &&
65*fe6060f1SDimitry Andric            VarArgsSaveSize == 0 && !MF.getFrameInfo().hasTailCall() &&
66*fe6060f1SDimitry Andric            !MF.getFunction().hasFnAttribute("interrupt");
675ffd83dbSDimitry Andric   }
68*fe6060f1SDimitry Andric 
69*fe6060f1SDimitry Andric   uint64_t getRVVStackSize() const { return RVVStackSize; }
70*fe6060f1SDimitry Andric   void setRVVStackSize(uint64_t Size) { RVVStackSize = Size; }
71*fe6060f1SDimitry Andric 
72*fe6060f1SDimitry Andric   uint64_t getRVVPadding() const { return RVVPadding; }
73*fe6060f1SDimitry Andric   void setRVVPadding(uint64_t Padding) { RVVPadding = Padding; }
74*fe6060f1SDimitry Andric 
75*fe6060f1SDimitry Andric   unsigned getCalleeSavedStackSize() const { return CalleeSavedStackSize; }
76*fe6060f1SDimitry Andric   void setCalleeSavedStackSize(unsigned Size) { CalleeSavedStackSize = Size; }
770b57cec5SDimitry Andric };
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric } // end namespace llvm
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
82