1e8d8bef9SDimitry Andric //===-- PPCCallLowering.h - Call lowering for GlobalISel -------*- C++ -*-===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric /// 9e8d8bef9SDimitry Andric /// \file 10e8d8bef9SDimitry Andric /// This file describes how to lower LLVM calls to machine code calls. 11e8d8bef9SDimitry Andric /// 12e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 13e8d8bef9SDimitry Andric 14e8d8bef9SDimitry Andric #ifndef LLVM_LIB_TARGET_POWERPC_GISEL_PPCCALLLOWERING_H 15e8d8bef9SDimitry Andric #define LLVM_LIB_TARGET_POWERPC_GISEL_PPCCALLLOWERING_H 16e8d8bef9SDimitry Andric 17e8d8bef9SDimitry Andric #include "PPCISelLowering.h" 18e8d8bef9SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h" 19e8d8bef9SDimitry Andric #include "llvm/IR/CallingConv.h" 20e8d8bef9SDimitry Andric 21e8d8bef9SDimitry Andric namespace llvm { 22e8d8bef9SDimitry Andric 23e8d8bef9SDimitry Andric class PPCTargetLowering; 24e8d8bef9SDimitry Andric 25e8d8bef9SDimitry Andric class PPCCallLowering : public CallLowering { 26e8d8bef9SDimitry Andric public: 27e8d8bef9SDimitry Andric PPCCallLowering(const PPCTargetLowering &TLI); 28e8d8bef9SDimitry Andric 29e8d8bef9SDimitry Andric bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, 30e8d8bef9SDimitry Andric ArrayRef<Register> VRegs, FunctionLoweringInfo &FLI, 31e8d8bef9SDimitry Andric Register SwiftErrorVReg) const override; 32e8d8bef9SDimitry Andric bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, 33e8d8bef9SDimitry Andric ArrayRef<ArrayRef<Register>> VRegs, 34e8d8bef9SDimitry Andric FunctionLoweringInfo &FLI) const override; 35e8d8bef9SDimitry Andric bool lowerCall(MachineIRBuilder &MIRBuilder, 36e8d8bef9SDimitry Andric CallLoweringInfo &Info) const override; 37e8d8bef9SDimitry Andric }; 38fe6060f1SDimitry Andric 39fe6060f1SDimitry Andric class PPCIncomingValueHandler : public CallLowering::IncomingValueHandler { 40fe6060f1SDimitry Andric public: PPCIncomingValueHandler(MachineIRBuilder & MIRBuilder,MachineRegisterInfo & MRI)41fe6060f1SDimitry Andric PPCIncomingValueHandler(MachineIRBuilder &MIRBuilder, 42fe6060f1SDimitry Andric MachineRegisterInfo &MRI) 43fe6060f1SDimitry Andric : CallLowering::IncomingValueHandler(MIRBuilder, MRI) {} 44fe6060f1SDimitry Andric 45fe6060f1SDimitry Andric uint64_t StackUsed; 46fe6060f1SDimitry Andric 47fe6060f1SDimitry Andric private: 48fe6060f1SDimitry Andric void assignValueToReg(Register ValVReg, Register PhysReg, 49*5f757f3fSDimitry Andric const CCValAssign &VA) override; 50fe6060f1SDimitry Andric 51fe6060f1SDimitry Andric void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy, 52*5f757f3fSDimitry Andric const MachinePointerInfo &MPO, 53*5f757f3fSDimitry Andric const CCValAssign &VA) override; 54fe6060f1SDimitry Andric 55fe6060f1SDimitry Andric Register getStackAddress(uint64_t Size, int64_t Offset, 56fe6060f1SDimitry Andric MachinePointerInfo &MPO, 57fe6060f1SDimitry Andric ISD::ArgFlagsTy Flags) override; 58fe6060f1SDimitry Andric 59fe6060f1SDimitry Andric virtual void markPhysRegUsed(unsigned PhysReg) = 0; 60fe6060f1SDimitry Andric }; 61fe6060f1SDimitry Andric 62fe6060f1SDimitry Andric class FormalArgHandler : public PPCIncomingValueHandler { 63fe6060f1SDimitry Andric 64fe6060f1SDimitry Andric void markPhysRegUsed(unsigned PhysReg) override; 65fe6060f1SDimitry Andric 66fe6060f1SDimitry Andric public: FormalArgHandler(MachineIRBuilder & MIRBuilder,MachineRegisterInfo & MRI)67fe6060f1SDimitry Andric FormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI) 68fe6060f1SDimitry Andric : PPCIncomingValueHandler(MIRBuilder, MRI) {} 69fe6060f1SDimitry Andric }; 70fe6060f1SDimitry Andric 71e8d8bef9SDimitry Andric } // end namespace llvm 72e8d8bef9SDimitry Andric 73e8d8bef9SDimitry Andric #endif 74