Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- llvm/CodeGen/GlobalISel/InlineAsmLowering.h --------------*- C++ -*-===// |
2 | // |
||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
4 | // See https://llvm.org/LICENSE.txt for license information. |
||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
6 | // |
||
7 | //===----------------------------------------------------------------------===// |
||
8 | /// |
||
9 | /// \file |
||
10 | /// This file describes how to lower LLVM inline asm to machine code INLINEASM. |
||
11 | /// |
||
12 | //===----------------------------------------------------------------------===// |
||
13 | |||
14 | #ifndef LLVM_CODEGEN_GLOBALISEL_INLINEASMLOWERING_H |
||
15 | #define LLVM_CODEGEN_GLOBALISEL_INLINEASMLOWERING_H |
||
16 | |||
17 | #include "llvm/ADT/ArrayRef.h" |
||
18 | #include <functional> |
||
19 | |||
20 | namespace llvm { |
||
21 | class CallBase; |
||
22 | class MachineIRBuilder; |
||
23 | class MachineOperand; |
||
24 | class Register; |
||
25 | class TargetLowering; |
||
26 | class Value; |
||
27 | |||
28 | class InlineAsmLowering { |
||
29 | const TargetLowering *TLI; |
||
30 | |||
31 | virtual void anchor(); |
||
32 | |||
33 | public: |
||
34 | /// Lower the given inline asm call instruction |
||
35 | /// \p GetOrCreateVRegs is a callback to materialize a register for the |
||
36 | /// input and output operands of the inline asm |
||
37 | /// \return True if the lowering succeeds, false otherwise. |
||
38 | bool lowerInlineAsm(MachineIRBuilder &MIRBuilder, const CallBase &CB, |
||
39 | std::function<ArrayRef<Register>(const Value &Val)> |
||
40 | GetOrCreateVRegs) const; |
||
41 | |||
42 | /// Lower the specified operand into the Ops vector. |
||
43 | /// \p Val is the IR input value to be lowered |
||
44 | /// \p Constraint is the user supplied constraint string |
||
45 | /// \p Ops is the vector to be filled with the lowered operands |
||
46 | /// \return True if the lowering succeeds, false otherwise. |
||
47 | virtual bool lowerAsmOperandForConstraint(Value *Val, StringRef Constraint, |
||
48 | std::vector<MachineOperand> &Ops, |
||
49 | MachineIRBuilder &MIRBuilder) const; |
||
50 | |||
51 | protected: |
||
52 | /// Getter for generic TargetLowering class. |
||
53 | const TargetLowering *getTLI() const { return TLI; } |
||
54 | |||
55 | /// Getter for target specific TargetLowering class. |
||
56 | template <class XXXTargetLowering> const XXXTargetLowering *getTLI() const { |
||
57 | return static_cast<const XXXTargetLowering *>(TLI); |
||
58 | } |
||
59 | |||
60 | public: |
||
61 | InlineAsmLowering(const TargetLowering *TLI) : TLI(TLI) {} |
||
62 | virtual ~InlineAsmLowering() = default; |
||
63 | }; |
||
64 | |||
65 | } // end namespace llvm |
||
66 | |||
67 | #endif // LLVM_CODEGEN_GLOBALISEL_INLINEASMLOWERING_H |