//===- TestDialect.h - MLIR Dialect for testing -----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines a fake 'test' dialect that can be used for testing things // that do not have a respective counterpart in the main source directories. // //===----------------------------------------------------------------------===// #ifndef MLIR_TESTDIALECT_H #define MLIR_TESTDIALECT_H #include "TestAttributes.h" #include "TestInterfaces.h" #include "TestTypes.h" #include "mlir/Bytecode/BytecodeImplementation.h" #include "mlir/Dialect/DLTI/DLTI.h" #include "mlir/Dialect/DLTI/Traits.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/Linalg/IR/Linalg.h" #include "mlir/Dialect/Traits.h" #include "mlir/IR/AsmState.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/Dialect.h" #include "mlir/IR/DialectResourceBlobManager.h" #include "mlir/IR/ExtensibleDialect.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/OpImplementation.h" #include "mlir/IR/RegionKindInterface.h" #include "mlir/IR/SymbolTable.h" #include "mlir/Interfaces/CallInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/CopyOpInterface.h" #include "mlir/Interfaces/DerivedAttributeOpInterface.h" #include "mlir/Interfaces/InferIntRangeInterface.h" #include "mlir/Interfaces/InferTypeOpInterface.h" #include "mlir/Interfaces/LoopLikeInterface.h" #include "mlir/Interfaces/SideEffectInterfaces.h" #include "mlir/Interfaces/ViewLikeInterface.h" #include namespace mlir { class DLTIDialect; class RewritePatternSet; } // namespace mlir //===----------------------------------------------------------------------===// // TestDialect //===----------------------------------------------------------------------===// #include "TestOpInterfaces.h.inc" #include "TestOpsDialect.h.inc" namespace test { //===----------------------------------------------------------------------===// // TestDialect version utilities //===----------------------------------------------------------------------===// struct TestDialectVersion : public mlir::DialectVersion { TestDialectVersion() = default; TestDialectVersion(uint32_t majorVersion, uint32_t minorVersion) : major_(majorVersion), minor_(minorVersion){}; // We cannot use 'major' and 'minor' here because these identifiers may // already be used by on many POSIX systems including Linux and // FreeBSD. uint32_t major_ = 2; uint32_t minor_ = 0; }; // Define some classes to exercises the Properties feature. struct PropertiesWithCustomPrint { /// A shared_ptr to a const object is safe: it is equivalent to a value-based /// member. Here the label will be deallocated when the last operation /// refering to it is destroyed. However there is no pool-allocation: this is /// offloaded to the client. std::shared_ptr label; int value; bool operator==(const PropertiesWithCustomPrint &rhs) const { return value == rhs.value && *label == *rhs.label; } }; class MyPropStruct { public: std::string content; // These three methods are invoked through the `MyStructProperty` wrapper // defined in TestOps.td mlir::Attribute asAttribute(mlir::MLIRContext *ctx) const; static mlir::LogicalResult setFromAttr(MyPropStruct &prop, mlir::Attribute attr, llvm::function_ref emitError); llvm::hash_code hash() const; bool operator==(const MyPropStruct &rhs) const { return content == rhs.content; } }; struct VersionedProperties { // For the sake of testing, assume that this object was associated to version // 1.2 of the test dialect when having only one int value. In the current // version 2.0, the property has two values. We also assume that the class is // upgrade-able if value2 = 0. int value1; int value2; bool operator==(const VersionedProperties &rhs) const { return value1 == rhs.value1 && value2 == rhs.value2; } }; } // namespace test #define GET_OP_CLASSES #include "TestOps.h.inc" namespace test { // Op deliberately defined in C++ code rather than ODS to test that C++ // Ops can still use the old `fold` method. class ManualCppOpWithFold : public mlir::Op { public: using Op::Op; static llvm::StringRef getOperationName() { return "test.manual_cpp_op_with_fold"; } static llvm::ArrayRef getAttributeNames() { return {}; } mlir::OpFoldResult fold(llvm::ArrayRef attributes); }; void registerTestDialect(::mlir::DialectRegistry ®istry); void populateTestReductionPatterns(::mlir::RewritePatternSet &patterns); } // namespace test #endif // MLIR_TESTDIALECT_H