1e53f5580SAmara Emerson //===- AArch64CallLowering.h - Call lowering --------------------*- C++ -*-===// 2e53f5580SAmara Emerson // 3e53f5580SAmara Emerson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e53f5580SAmara Emerson // See https://llvm.org/LICENSE.txt for license information. 5e53f5580SAmara Emerson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e53f5580SAmara Emerson // 7e53f5580SAmara Emerson //===----------------------------------------------------------------------===// 8e53f5580SAmara Emerson /// 9e53f5580SAmara Emerson /// \file 10e53f5580SAmara Emerson /// This file describes how to lower LLVM calls to machine code calls. 11e53f5580SAmara Emerson /// 12e53f5580SAmara Emerson //===----------------------------------------------------------------------===// 13e53f5580SAmara Emerson 14e53f5580SAmara Emerson #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H 15e53f5580SAmara Emerson #define LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H 16e53f5580SAmara Emerson 17e53f5580SAmara Emerson #include "llvm/ADT/ArrayRef.h" 18e53f5580SAmara Emerson #include "llvm/CodeGen/GlobalISel/CallLowering.h" 19e53f5580SAmara Emerson #include "llvm/IR/CallingConv.h" 20e53f5580SAmara Emerson #include <cstdint> 21e53f5580SAmara Emerson #include <functional> 22e53f5580SAmara Emerson 23e53f5580SAmara Emerson namespace llvm { 24e53f5580SAmara Emerson 25e53f5580SAmara Emerson class AArch64TargetLowering; 26e53f5580SAmara Emerson class CCValAssign; 27e53f5580SAmara Emerson class MachineIRBuilder; 28e53f5580SAmara Emerson class Type; 29e53f5580SAmara Emerson 30e53f5580SAmara Emerson class AArch64CallLowering: public CallLowering { 31e53f5580SAmara Emerson public: 32e53f5580SAmara Emerson AArch64CallLowering(const AArch64TargetLowering &TLI); 33e53f5580SAmara Emerson 34e53f5580SAmara Emerson bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, 35d68458bdSChristudasan Devadasan ArrayRef<Register> VRegs, FunctionLoweringInfo &FLI, 36e53f5580SAmara Emerson Register SwiftErrorVReg) const override; 37e53f5580SAmara Emerson 38b97013fdSAmara Emerson bool canLowerReturn(MachineFunction &MF, CallingConv::ID CallConv, 39b97013fdSAmara Emerson SmallVectorImpl<BaseArgInfo> &Outs, 40b97013fdSAmara Emerson bool IsVarArg) const override; 41b97013fdSAmara Emerson 42d7fed7b8SAmara Emerson bool fallBackToDAGISel(const MachineFunction &MF) const override; 4379d34a5aSDavid Sherwood 44e53f5580SAmara Emerson bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, 45d68458bdSChristudasan Devadasan ArrayRef<ArrayRef<Register>> VRegs, 46d68458bdSChristudasan Devadasan FunctionLoweringInfo &FLI) const override; 47e53f5580SAmara Emerson 48e53f5580SAmara Emerson bool lowerCall(MachineIRBuilder &MIRBuilder, 49e53f5580SAmara Emerson CallLoweringInfo &Info) const override; 50e53f5580SAmara Emerson 51e53f5580SAmara Emerson /// Returns true if the call can be lowered as a tail call. 52e53f5580SAmara Emerson bool 53e53f5580SAmara Emerson isEligibleForTailCallOptimization(MachineIRBuilder &MIRBuilder, 54e53f5580SAmara Emerson CallLoweringInfo &Info, 55e53f5580SAmara Emerson SmallVectorImpl<ArgInfo> &InArgs, 56e53f5580SAmara Emerson SmallVectorImpl<ArgInfo> &OutArgs) const; 57e53f5580SAmara Emerson supportSwiftError()58e53f5580SAmara Emerson bool supportSwiftError() const override { return true; } 59e53f5580SAmara Emerson 60ec41ed5bSAmara Emerson bool isTypeIsValidForThisReturn(EVT Ty) const override; 61ec41ed5bSAmara Emerson 62e53f5580SAmara Emerson private: 63e53f5580SAmara Emerson using RegHandler = std::function<void(MachineIRBuilder &, Type *, unsigned, 64e53f5580SAmara Emerson CCValAssign &)>; 65e53f5580SAmara Emerson 66e53f5580SAmara Emerson using MemHandler = 67e53f5580SAmara Emerson std::function<void(MachineIRBuilder &, int, CCValAssign &)>; 68e53f5580SAmara Emerson 69*1c10d5b1SVladislav Dzhidzhoev void saveVarArgRegisters(MachineIRBuilder &MIRBuilder, 70*1c10d5b1SVladislav Dzhidzhoev CallLowering::IncomingValueHandler &Handler, 71*1c10d5b1SVladislav Dzhidzhoev CCState &CCInfo) const; 72*1c10d5b1SVladislav Dzhidzhoev 73e53f5580SAmara Emerson bool lowerTailCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info, 74e53f5580SAmara Emerson SmallVectorImpl<ArgInfo> &OutArgs) const; 75e53f5580SAmara Emerson 76e53f5580SAmara Emerson bool 77e53f5580SAmara Emerson doCallerAndCalleePassArgsTheSameWay(CallLoweringInfo &Info, 78e53f5580SAmara Emerson MachineFunction &MF, 79e53f5580SAmara Emerson SmallVectorImpl<ArgInfo> &InArgs) const; 80e53f5580SAmara Emerson 81e53f5580SAmara Emerson bool 82e53f5580SAmara Emerson areCalleeOutgoingArgsTailCallable(CallLoweringInfo &Info, MachineFunction &MF, 83e53f5580SAmara Emerson SmallVectorImpl<ArgInfo> &OutArgs) const; 84e53f5580SAmara Emerson }; 85e53f5580SAmara Emerson 86e53f5580SAmara Emerson } // end namespace llvm 87e53f5580SAmara Emerson 88e53f5580SAmara Emerson #endif // LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H 89