Fix GCC build problem with 288f05f related to SmallVector. (#116958)
[llvm-project.git] / mlir / test / lib / Dialect / Test / TestOps.h
blobf070c3bedd92ce0e19e73c92b5bc73777c8ab160
1 //===- TestOps.h - MLIR Test Dialect Operations ---------------------------===//
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 //===----------------------------------------------------------------------===//
9 #ifndef MLIR_TESTOPS_H
10 #define MLIR_TESTOPS_H
12 #include "TestAttributes.h"
13 #include "TestInterfaces.h"
14 #include "TestTypes.h"
15 #include "mlir/Bytecode/BytecodeImplementation.h"
16 #include "mlir/Dialect/DLTI/DLTI.h"
17 #include "mlir/Dialect/DLTI/Traits.h"
18 #include "mlir/Dialect/Func/IR/FuncOps.h"
19 #include "mlir/Dialect/Linalg/IR/Linalg.h"
20 #include "mlir/Dialect/Linalg/IR/LinalgInterfaces.h"
21 #include "mlir/Dialect/Traits.h"
22 #include "mlir/IR/AsmState.h"
23 #include "mlir/IR/BuiltinOps.h"
24 #include "mlir/IR/BuiltinTypes.h"
25 #include "mlir/IR/Dialect.h"
26 #include "mlir/IR/DialectResourceBlobManager.h"
27 #include "mlir/IR/ExtensibleDialect.h"
28 #include "mlir/IR/OpDefinition.h"
29 #include "mlir/IR/OpImplementation.h"
30 #include "mlir/IR/RegionKindInterface.h"
31 #include "mlir/IR/SymbolTable.h"
32 #include "mlir/Interfaces/CallInterfaces.h"
33 #include "mlir/Interfaces/ControlFlowInterfaces.h"
34 #include "mlir/Interfaces/CopyOpInterface.h"
35 #include "mlir/Interfaces/DerivedAttributeOpInterface.h"
36 #include "mlir/Interfaces/InferIntRangeInterface.h"
37 #include "mlir/Interfaces/InferTypeOpInterface.h"
38 #include "mlir/Interfaces/LoopLikeInterface.h"
39 #include "mlir/Interfaces/MemorySlotInterfaces.h"
40 #include "mlir/Interfaces/SideEffectInterfaces.h"
41 #include "mlir/Interfaces/ValueBoundsOpInterface.h"
42 #include "mlir/Interfaces/ViewLikeInterface.h"
43 #include "llvm/ADT/SetVector.h"
45 namespace test {
46 class TestDialect;
48 //===----------------------------------------------------------------------===//
49 // TestResource
50 //===----------------------------------------------------------------------===//
52 /// A test resource for side effects.
53 struct TestResource : public mlir::SideEffects::Resource::Base<TestResource> {
54 llvm::StringRef getName() final { return "<Test>"; }
57 //===----------------------------------------------------------------------===//
58 // PropertiesWithCustomPrint
59 //===----------------------------------------------------------------------===//
61 struct PropertiesWithCustomPrint {
62 /// A shared_ptr to a const object is safe: it is equivalent to a value-based
63 /// member. Here the label will be deallocated when the last operation
64 /// refering to it is destroyed. However there is no pool-allocation: this is
65 /// offloaded to the client.
66 std::shared_ptr<const std::string> label;
67 int value;
68 bool operator==(const PropertiesWithCustomPrint &rhs) const {
69 return value == rhs.value && *label == *rhs.label;
73 llvm::LogicalResult setPropertiesFromAttribute(
74 PropertiesWithCustomPrint &prop, mlir::Attribute attr,
75 llvm::function_ref<mlir::InFlightDiagnostic()> emitError);
76 mlir::DictionaryAttr
77 getPropertiesAsAttribute(mlir::MLIRContext *ctx,
78 const PropertiesWithCustomPrint &prop);
79 llvm::hash_code computeHash(const PropertiesWithCustomPrint &prop);
80 void customPrintProperties(mlir::OpAsmPrinter &p,
81 const PropertiesWithCustomPrint &prop);
82 mlir::ParseResult customParseProperties(mlir::OpAsmParser &parser,
83 PropertiesWithCustomPrint &prop);
85 //===----------------------------------------------------------------------===//
86 // MyPropStruct
87 //===----------------------------------------------------------------------===//
89 class MyPropStruct {
90 public:
91 std::string content;
92 // These three methods are invoked through the `MyStructProperty` wrapper
93 // defined in TestOps.td
94 mlir::Attribute asAttribute(mlir::MLIRContext *ctx) const;
95 static llvm::LogicalResult
96 setFromAttr(MyPropStruct &prop, mlir::Attribute attr,
97 llvm::function_ref<mlir::InFlightDiagnostic()> emitError);
98 llvm::hash_code hash() const;
99 bool operator==(const MyPropStruct &rhs) const {
100 return content == rhs.content;
104 llvm::LogicalResult readFromMlirBytecode(mlir::DialectBytecodeReader &reader,
105 MyPropStruct &prop);
106 void writeToMlirBytecode(mlir::DialectBytecodeWriter &writer,
107 MyPropStruct &prop);
109 //===----------------------------------------------------------------------===//
110 // VersionedProperties
111 //===----------------------------------------------------------------------===//
113 struct VersionedProperties {
114 // For the sake of testing, assume that this object was associated to version
115 // 1.2 of the test dialect when having only one int value. In the current
116 // version 2.0, the property has two values. We also assume that the class is
117 // upgrade-able if value2 = 0.
118 int value1;
119 int value2;
120 bool operator==(const VersionedProperties &rhs) const {
121 return value1 == rhs.value1 && value2 == rhs.value2;
125 llvm::LogicalResult setPropertiesFromAttribute(
126 VersionedProperties &prop, mlir::Attribute attr,
127 llvm::function_ref<mlir::InFlightDiagnostic()> emitError);
128 mlir::DictionaryAttr getPropertiesAsAttribute(mlir::MLIRContext *ctx,
129 const VersionedProperties &prop);
130 llvm::hash_code computeHash(const VersionedProperties &prop);
131 void customPrintProperties(mlir::OpAsmPrinter &p,
132 const VersionedProperties &prop);
133 mlir::ParseResult customParseProperties(mlir::OpAsmParser &parser,
134 VersionedProperties &prop);
136 //===----------------------------------------------------------------------===//
137 // Bytecode Support
138 //===----------------------------------------------------------------------===//
140 llvm::LogicalResult readFromMlirBytecode(mlir::DialectBytecodeReader &reader,
141 llvm::MutableArrayRef<int64_t> prop);
142 void writeToMlirBytecode(mlir::DialectBytecodeWriter &writer,
143 llvm::ArrayRef<int64_t> prop);
145 } // namespace test
147 #define GET_OP_CLASSES
148 #include "TestOps.h.inc"
150 #endif // MLIR_TESTOPS_H