xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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