//===- DialectRegistry.h - Dialect Registration and Extension ---*- 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 functionality for registring and extending dialects. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_DIALECTREGISTRY_H #define MLIR_IR_DIALECTREGISTRY_H #include "mlir/IR/MLIRContext.h" #include "mlir/Support/TypeID.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/MapVector.h" #include <map> #include <tuple> namespace mlir { class Dialect; DialectAllocatorFunction; DialectAllocatorFunctionRef; DynamicDialectPopulationFunction; //===----------------------------------------------------------------------===// // DialectExtension //===----------------------------------------------------------------------===// /// This class represents an opaque dialect extension. It contains a set of /// required dialects and an application function. The required dialects control /// when the extension is applied, i.e. the extension is applied when all /// required dialects are loaded. The application function can be used to attach /// additional functionality to attributes, dialects, operations, types, etc., /// and may also load additional necessary dialects. class DialectExtensionBase { … }; /// This class represents a dialect extension anchored on the given set of /// dialects. When all of the specified dialects have been loaded, the /// application function of this extension will be executed. template <typename DerivedT, typename... DialectsT> class DialectExtension : public DialectExtensionBase { … }; namespace dialect_extension_detail { /// Checks if the given interface, which is attempting to be used, is a /// promised interface of this dialect that has yet to be implemented. If so, /// emits a fatal error. void handleUseOfUndefinedPromisedInterface(Dialect &dialect, TypeID interfaceRequestorID, TypeID interfaceID, StringRef interfaceName); /// Checks if the given interface, which is attempting to be attached, is a /// promised interface of this dialect that has yet to be implemented. If so, /// the promised interface is marked as resolved. void handleAdditionOfUndefinedPromisedInterface(Dialect &dialect, TypeID interfaceRequestorID, TypeID interfaceID); /// Checks if a promise has been made for the interface/requestor pair. bool hasPromisedInterface(Dialect &dialect, TypeID interfaceRequestorID, TypeID interfaceID); /// Checks if a promise has been made for the interface/requestor pair. template <typename ConcreteT, typename InterfaceT> bool hasPromisedInterface(Dialect &dialect) { … } } // namespace dialect_extension_detail //===----------------------------------------------------------------------===// // DialectRegistry //===----------------------------------------------------------------------===// /// The DialectRegistry maps a dialect namespace to a constructor for the /// matching dialect. This allows for decoupling the list of dialects /// "available" from the dialects loaded in the Context. The parser in /// particular will lazily load dialects in the Context as operations are /// encountered. class DialectRegistry { … }; } // namespace mlir #endif // MLIR_IR_DIALECTREGISTRY_H