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