MLIR 23.0.0git
ExtensibleDialect.cpp
Go to the documentation of this file.
1//===- ExtensibleDialect - C API for MLIR Extensible Dialect --------------===//
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
10#include "mlir/CAPI/IR.h"
11#include "mlir/CAPI/Support.h"
14
15using namespace mlir;
16
18
19bool mlirDynamicOpTraitAttach(MlirDynamicOpTrait dynamicOpTrait,
20 MlirStringRef opName, MlirContext context) {
21 std::optional<RegisteredOperationName> opNameFound =
23 assert(opNameFound && "operation name must be registered in the context");
24
25 // The original getImpl() is protected, so we create a small helper struct
26 // here.
27 struct RegisteredOperationNameWithImpl : RegisteredOperationName {
28 Impl *getImpl() { return RegisteredOperationName::getImpl(); }
29 };
31 static_cast<RegisteredOperationNameWithImpl &>(*opNameFound).getImpl();
32
33 std::unique_ptr<DynamicOpTrait> trait(unwrap(dynamicOpTrait));
34 // TODO: we should enable llvm-style RTTI for `OperationName::Impl` and check
35 // whether the `impl` is a `DynamicOpDefinition` here.
36 return static_cast<DynamicOpDefinition *>(impl)->addTrait(std::move(trait));
37}
38
41}
42
45}
46
47void mlirDynamicOpTraitDestroy(MlirDynamicOpTrait dynamicOpTrait) {
48 delete unwrap(dynamicOpTrait);
49}
50
51namespace mlir {
52
54public:
56 void *userData)
57 : typeID(typeID), callbacks(callbacks), userData(userData) {
58 if (callbacks.construct)
59 callbacks.construct(userData);
60 }
62 if (callbacks.destruct)
63 callbacks.destruct(userData);
64 }
65
66 LogicalResult verifyTrait(Operation *op) const override {
67 return unwrap(callbacks.verifyTrait(wrap(op), userData));
68 };
69 LogicalResult verifyRegionTrait(Operation *op) const override {
70 return unwrap(callbacks.verifyRegionTrait(wrap(op), userData));
71 };
72
73 TypeID getTypeID() const override { return typeID; };
74
75private:
76 TypeID typeID;
78 void *userData;
79};
80
81} // namespace mlir
82
83MlirDynamicOpTrait mlirDynamicOpTraitCreate(
84 MlirTypeID typeID, MlirDynamicOpTraitCallbacks callbacks, void *userData) {
85 return wrap(
86 new mlir::ExternalDynamicOpTrait(unwrap(typeID), callbacks, userData));
87}
MlirDynamicOpTrait mlirDynamicOpTraitCreate(MlirTypeID typeID, MlirDynamicOpTraitCallbacks callbacks, void *userData)
Create a custom dynamic op trait with the given type ID and callbacks.
MlirDynamicOpTrait mlirDynamicOpTraitIsTerminatorCreate()
Get the dynamic op trait that indicates the operation is a terminator.
void mlirDynamicOpTraitDestroy(MlirDynamicOpTrait dynamicOpTrait)
Destroy the dynamic op trait.
MlirDynamicOpTrait mlirDynamicOpTraitNoTerminatorCreate()
Get the dynamic op trait that indicates regions have no terminator.
#define DEFINE_C_API_PTR_METHODS(name, cpptype)
Definition Wrap.h:25
The definition of a dynamic op.
Base class of traits for dynamic-defined operations.
ExternalDynamicOpTrait(TypeID typeID, MlirDynamicOpTraitCallbacks callbacks, void *userData)
TypeID getTypeID() const override
Returns the TypeID of the trait.
LogicalResult verifyRegionTrait(Operation *op) const override
LogicalResult verifyTrait(Operation *op) const override
Operation is the basic unit of execution within MLIR.
Definition Operation.h:88
This is a "type erased" representation of a registered operation.
static std::optional< RegisteredOperationName > lookup(StringRef name, MLIRContext *ctx)
Lookup the registered operation information for the given operation.
This class provides an efficient unique identifier for a specific C++ type.
Definition TypeID.h:107
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
Definition Diagnostics.h:24
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Definition Diagnostics.h:19
MLIR_CAPI_EXPORTED bool mlirDynamicOpTraitAttach(MlirDynamicOpTrait dynamicOpTrait, MlirStringRef opName, MlirContext context)
Attach a dynamic op trait to the given operation name.
Include the generated interface declarations.
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:78