• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- llvm/CodeGen/GlobalISel/CallLowering.h - Call lowering --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// This file describes how to lower LLVM calls to machine code calls.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
16 #define LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
17 
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/IR/Function.h"
20 
21 namespace llvm {
22 // Forward declarations.
23 class MachineIRBuilder;
24 class TargetLowering;
25 class Value;
26 
27 class CallLowering {
28   const TargetLowering *TLI;
29  protected:
30   /// Getter for generic TargetLowering class.
getTLI()31   const TargetLowering *getTLI() const {
32     return TLI;
33   }
34 
35   /// Getter for target specific TargetLowering class.
36   template <class XXXTargetLowering>
getTLI()37     const XXXTargetLowering *getTLI() const {
38     return static_cast<const XXXTargetLowering *>(TLI);
39   }
40  public:
CallLowering(const TargetLowering * TLI)41   CallLowering(const TargetLowering *TLI) : TLI(TLI) {}
~CallLowering()42   virtual ~CallLowering() {}
43 
44   /// This hook must be implemented to lower outgoing return values, described
45   /// by \p Val, into the specified virtual register \p VReg.
46   /// This hook is used by GlobalISel.
47   ///
48   /// \return True if the lowering succeeds, false otherwise.
lowerReturn(MachineIRBuilder & MIRBuilder,const Value * Val,unsigned VReg)49   virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
50                            unsigned VReg) const {
51     return false;
52   }
53 
54   /// This hook must be implemented to lower the incoming (formal)
55   /// arguments, described by \p Args, for GlobalISel. Each argument
56   /// must end up in the related virtual register described by VRegs.
57   /// In other words, the first argument should end up in VRegs[0],
58   /// the second in VRegs[1], and so on.
59   /// \p MIRBuilder is set to the proper insertion for the argument
60   /// lowering.
61   ///
62   /// \return True if the lowering succeeded, false otherwise.
63   virtual bool
lowerFormalArguments(MachineIRBuilder & MIRBuilder,const Function::ArgumentListType & Args,const SmallVectorImpl<unsigned> & VRegs)64   lowerFormalArguments(MachineIRBuilder &MIRBuilder,
65                        const Function::ArgumentListType &Args,
66                        const SmallVectorImpl<unsigned> &VRegs) const {
67     return false;
68   }
69 };
70 } // End namespace llvm.
71 
72 #endif
73