1 | //===- Argument.h - Argument definitions ------------------------*- 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 | // This header file contains definitions for TableGen operation's arguments. |
10 | // Operation arguments fall into two categories: |
11 | // |
12 | // 1. Operands: SSA values operated on by the operation |
13 | // 2. Attributes: compile-time known properties that have influence over |
14 | // the operation's behavior |
15 | // |
16 | // These two categories are modelled with the unified argument concept in |
17 | // TableGen because we need similar pattern matching mechanisms for them. |
18 | // |
19 | //===----------------------------------------------------------------------===// |
20 | |
21 | #ifndef MLIR_TABLEGEN_ARGUMENT_H_ |
22 | #define MLIR_TABLEGEN_ARGUMENT_H_ |
23 | |
24 | #include "mlir/TableGen/Attribute.h" |
25 | #include "mlir/TableGen/Property.h" |
26 | #include "mlir/TableGen/Type.h" |
27 | #include "llvm/ADT/PointerUnion.h" |
28 | #include <string> |
29 | |
30 | namespace llvm { |
31 | class StringRef; |
32 | } // namespace llvm |
33 | |
34 | namespace mlir { |
35 | namespace tblgen { |
36 | |
37 | // A struct wrapping an op attribute and its name together |
38 | struct NamedAttribute { |
39 | llvm::StringRef name; |
40 | Attribute attr; |
41 | }; |
42 | |
43 | // A struct wrapping an op operand/result's constraint and its name together |
44 | struct NamedTypeConstraint { |
45 | // Returns true if this operand/result has constraint to be satisfied. |
46 | bool hasPredicate() const; |
47 | // Returns true if this is an optional type constraint. This is a special case |
48 | // of variadic for 0 or 1 type. |
49 | bool isOptional() const; |
50 | // Returns true if this operand/result is variadic. |
51 | bool isVariadic() const; |
52 | // Returns true if this operand/result is a variadic of a variadic constraint. |
53 | bool isVariadicOfVariadic() const; |
54 | // Returns true if this is a variable length type constraint. This is either |
55 | // variadic or optional. |
56 | bool isVariableLength() const { return isOptional() || isVariadic(); } |
57 | |
58 | llvm::StringRef name; |
59 | TypeConstraint constraint; |
60 | }; |
61 | |
62 | // Operation argument: either attribute, property, or operand |
63 | using Argument = llvm::PointerUnion<NamedAttribute *, NamedProperty *, |
64 | NamedTypeConstraint *>; |
65 | |
66 | } // namespace tblgen |
67 | } // namespace mlir |
68 | |
69 | #endif // MLIR_TABLEGEN_ARGUMENT_H_ |
70 | |