| //===- Registration.h - C API Registration implementation ------*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MLIR_CAPI_REGISTRATION_H |
| #define MLIR_CAPI_REGISTRATION_H |
| |
| #include "mlir-c/IR.h" |
| #include "mlir-c/Registration.h" |
| #include "mlir/CAPI/IR.h" |
| #include "mlir/CAPI/Support.h" |
| |
| //===----------------------------------------------------------------------===// |
| // Corrolary to MLIR_DECLARE_CAPI_DIALECT_REGISTRATION that defines an impl. |
| // Takes the same name passed to the above and the fully qualified class name |
| // of the dialect class. |
| //===----------------------------------------------------------------------===// |
| |
| /// Hooks for dynamic discovery of dialects. |
| typedef void (*MlirContextRegisterDialectHook)(MlirContext context); |
| typedef MlirDialect (*MlirContextLoadDialectHook)(MlirContext context); |
| typedef MlirStringRef (*MlirDialectGetNamespaceHook)(); |
| |
| /// Structure of dialect registration hooks. |
| struct MlirDialectRegistrationHooks { |
| MlirContextRegisterDialectHook registerHook; |
| MlirContextLoadDialectHook loadHook; |
| MlirDialectGetNamespaceHook getNamespaceHook; |
| }; |
| typedef struct MlirDialectRegistrationHooks MlirDialectRegistrationHooks; |
| |
| #define MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Name, Namespace, ClassName) \ |
| static void mlirContextRegister##Name##Dialect(MlirContext context) { \ |
| mlir::DialectRegistry registry; \ |
| registry.insert<ClassName>(); \ |
| unwrap(context)->appendDialectRegistry(registry); \ |
| } \ |
| static MlirDialect mlirContextLoad##Name##Dialect(MlirContext context) { \ |
| return wrap(unwrap(context)->getOrLoadDialect<ClassName>()); \ |
| } \ |
| static MlirStringRef mlir##Name##DialectGetNamespace() { \ |
| return wrap(ClassName::getDialectNamespace()); \ |
| } \ |
| MlirDialectHandle mlirGetDialectHandle__##Namespace##__() { \ |
| static MlirDialectRegistrationHooks hooks = { \ |
| mlirContextRegister##Name##Dialect, mlirContextLoad##Name##Dialect, \ |
| mlir##Name##DialectGetNamespace}; \ |
| return MlirDialectHandle{&hooks}; \ |
| } |
| |
| #endif // MLIR_CAPI_REGISTRATION_H |