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 16*5ffd83dbSDimitry 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; 33*5ffd83dbSDimitry Andric /// Size of any opaque stack adjustment due to save/restore libcalls. 34*5ffd83dbSDimitry Andric unsigned LibCallStackSize = 0; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric public: 37*5ffd83dbSDimitry Andric RISCVMachineFunctionInfo(const MachineFunction &MF) {} 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 400b57cec5SDimitry Andric void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric unsigned getVarArgsSaveSize() const { return VarArgsSaveSize; } 430b57cec5SDimitry Andric void setVarArgsSaveSize(int Size) { VarArgsSaveSize = Size; } 440b57cec5SDimitry Andric 45*5ffd83dbSDimitry Andric int getMoveF64FrameIndex(MachineFunction &MF) { 460b57cec5SDimitry Andric if (MoveF64FrameIndex == -1) 47*5ffd83dbSDimitry Andric MoveF64FrameIndex = 48*5ffd83dbSDimitry Andric MF.getFrameInfo().CreateStackObject(8, Align(8), false); 490b57cec5SDimitry Andric return MoveF64FrameIndex; 500b57cec5SDimitry Andric } 51*5ffd83dbSDimitry Andric 52*5ffd83dbSDimitry Andric unsigned getLibCallStackSize() const { return LibCallStackSize; } 53*5ffd83dbSDimitry Andric void setLibCallStackSize(unsigned Size) { LibCallStackSize = Size; } 54*5ffd83dbSDimitry Andric 55*5ffd83dbSDimitry Andric bool useSaveRestoreLibCalls(const MachineFunction &MF) const { 56*5ffd83dbSDimitry Andric // We cannot use fixed locations for the callee saved spill slots if the 57*5ffd83dbSDimitry Andric // function uses a varargs save area. 58*5ffd83dbSDimitry Andric return MF.getSubtarget<RISCVSubtarget>().enableSaveRestore() && 59*5ffd83dbSDimitry Andric VarArgsSaveSize == 0 && !MF.getFrameInfo().hasTailCall(); 60*5ffd83dbSDimitry Andric } 610b57cec5SDimitry Andric }; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric } // end namespace llvm 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H 66