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
21namespace llvm {
22// Forward declarations.
23class MachineIRBuilder;
24class TargetLowering;
25class Value;
26
27class CallLowering {
28  const TargetLowering *TLI;
29 protected:
30  /// Getter for generic TargetLowering class.
31  const TargetLowering *getTLI() const {
32    return TLI;
33  }
34
35  /// Getter for target specific TargetLowering class.
36  template <class XXXTargetLowering>
37    const XXXTargetLowering *getTLI() const {
38    return static_cast<const XXXTargetLowering *>(TLI);
39  }
40 public:
41  CallLowering(const TargetLowering *TLI) : TLI(TLI) {}
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.
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
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