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