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 |
68 | |