1*0b57cec5SDimitry Andric //===- llvm/lib/Target/ARM/ARMCallLowering.h - Call lowering ----*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric /// \file 10*0b57cec5SDimitry Andric /// This file describes how to lower LLVM calls to machine code calls. 11*0b57cec5SDimitry Andric // 12*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_ARM_ARMCALLLOWERING_H 15*0b57cec5SDimitry Andric #define LLVM_LIB_TARGET_ARM_ARMCALLLOWERING_H 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 18*0b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h" 19*0b57cec5SDimitry Andric #include "llvm/IR/CallingConv.h" 20*0b57cec5SDimitry Andric #include <cstdint> 21*0b57cec5SDimitry Andric #include <functional> 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric namespace llvm { 24*0b57cec5SDimitry Andric 25*0b57cec5SDimitry Andric class ARMTargetLowering; 26*0b57cec5SDimitry Andric class MachineFunction; 27*0b57cec5SDimitry Andric class MachineInstrBuilder; 28*0b57cec5SDimitry Andric class MachineIRBuilder; 29*0b57cec5SDimitry Andric class Value; 30*0b57cec5SDimitry Andric 31*0b57cec5SDimitry Andric class ARMCallLowering : public CallLowering { 32*0b57cec5SDimitry Andric public: 33*0b57cec5SDimitry Andric ARMCallLowering(const ARMTargetLowering &TLI); 34*0b57cec5SDimitry Andric 35*0b57cec5SDimitry Andric bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, 36*0b57cec5SDimitry Andric ArrayRef<Register> VRegs) const override; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, 39*0b57cec5SDimitry Andric ArrayRef<ArrayRef<Register>> VRegs) const override; 40*0b57cec5SDimitry Andric 41*0b57cec5SDimitry Andric bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv, 42*0b57cec5SDimitry Andric const MachineOperand &Callee, const ArgInfo &OrigRet, 43*0b57cec5SDimitry Andric ArrayRef<ArgInfo> OrigArgs) const override; 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric private: 46*0b57cec5SDimitry Andric bool lowerReturnVal(MachineIRBuilder &MIRBuilder, const Value *Val, 47*0b57cec5SDimitry Andric ArrayRef<Register> VRegs, 48*0b57cec5SDimitry Andric MachineInstrBuilder &Ret) const; 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric /// Split an argument into one or more arguments that the CC lowering can cope 51*0b57cec5SDimitry Andric /// with. 52*0b57cec5SDimitry Andric void splitToValueTypes(const ArgInfo &OrigArg, 53*0b57cec5SDimitry Andric SmallVectorImpl<ArgInfo> &SplitArgs, 54*0b57cec5SDimitry Andric MachineFunction &MF) const; 55*0b57cec5SDimitry Andric }; 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric } // end namespace llvm 58*0b57cec5SDimitry Andric 59*0b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_ARM_ARMCALLLOWERING_H 60