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
18DEFINE_C_API_PTR_METHODS(MlirDynamicTypeDefinition, DynamicTypeDefinition)
19DEFINE_C_API_PTR_METHODS(MlirDynamicAttrDefinition, DynamicAttrDefinition)
20
21bool mlirDynamicOpTraitAttach(MlirDynamicOpTrait dynamicOpTrait,
22 MlirStringRef opName, MlirContext context) {
23 std::optional<RegisteredOperationName> opNameFound =
25 assert(opNameFound && "operation name must be registered in the context");
26
27 // The original getImpl() is protected, so we create a small helper struct
28 // here.
29 struct RegisteredOperationNameWithImpl : RegisteredOperationName {
30 Impl *getImpl() { return RegisteredOperationName::getImpl(); }
31 };
33 static_cast<RegisteredOperationNameWithImpl &>(*opNameFound).getImpl();
34
35 std::unique_ptr<DynamicOpTrait> trait(unwrap(dynamicOpTrait));
36 // TODO: we should enable llvm-style RTTI for `OperationName::Impl` and check
37 // whether the `impl` is a `DynamicOpDefinition` here.
38 return static_cast<DynamicOpDefinition *>(impl)->addTrait(std::move(trait));
39}
40
43}
44
47}
48
49void mlirDynamicOpTraitDestroy(MlirDynamicOpTrait dynamicOpTrait) {
50 delete unwrap(dynamicOpTrait);
51}
52
53namespace mlir {
54
56public:
58 void *userData)
59 : typeID(typeID), callbacks(callbacks), userData(userData) {
60 if (callbacks.construct)
61 callbacks.construct(userData);
62 }
64 if (callbacks.destruct)
65 callbacks.destruct(userData);
66 }
67
68 LogicalResult verifyTrait(Operation *op) const override {
69 return unwrap(callbacks.verifyTrait(wrap(op), userData));
70 };
71 LogicalResult verifyRegionTrait(Operation *op) const override {
72 return unwrap(callbacks.verifyRegionTrait(wrap(op), userData));
73 };
74
75 TypeID getTypeID() const override { return typeID; };
76
77private:
78 TypeID typeID;
80 void *userData;
81};
82
83} // namespace mlir
84
85MlirDynamicOpTrait mlirDynamicOpTraitCreate(
86 MlirTypeID typeID, MlirDynamicOpTraitCallbacks callbacks, void *userData) {
87 return wrap(
88 new mlir::ExternalDynamicOpTrait(unwrap(typeID), callbacks, userData));
89}
90
91bool mlirDialectIsAExtensibleDialect(MlirDialect dialect) {
92 return llvm::isa<mlir::ExtensibleDialect>(unwrap(dialect));
93}
94
95MlirDynamicTypeDefinition
97 MlirStringRef typeName) {
98 return wrap(llvm::cast<mlir::ExtensibleDialect>(unwrap(dialect))
99 ->lookupTypeDefinition(unwrap(typeName)));
100}
101
102bool mlirTypeIsADynamicType(MlirType type) {
103 return llvm::isa<mlir::DynamicType>(unwrap(type));
104}
105
109
110MlirType mlirDynamicTypeGet(MlirDynamicTypeDefinition typeDef,
111 MlirAttribute *attrs, intptr_t numAttrs) {
113 attributes.reserve(numAttrs);
114 for (intptr_t i = 0; i < numAttrs; ++i)
115 attributes.push_back(unwrap(attrs[i]));
116
117 return wrap(mlir::DynamicType::get(unwrap(typeDef), attributes));
118}
119
121 return llvm::cast<mlir::DynamicType>(unwrap(type)).getParams().size();
122}
123
124MlirAttribute mlirDynamicTypeGetParam(MlirType type, intptr_t index) {
125 return wrap(llvm::cast<mlir::DynamicType>(unwrap(type)).getParams()[index]);
126}
127
128MlirDynamicTypeDefinition mlirDynamicTypeGetTypeDef(MlirType type) {
129 return wrap(llvm::cast<mlir::DynamicType>(unwrap(type)).getTypeDef());
130}
131
132MlirTypeID
133mlirDynamicTypeDefinitionGetTypeID(MlirDynamicTypeDefinition typeDef) {
134 return wrap(unwrap(typeDef)->getTypeID());
135}
136
138mlirDynamicTypeDefinitionGetName(MlirDynamicTypeDefinition typeDef) {
139 return wrap(unwrap(typeDef)->getName());
140}
141
142MlirDialect
143mlirDynamicTypeDefinitionGetDialect(MlirDynamicTypeDefinition typeDef) {
144 return wrap(unwrap(typeDef)->getDialect());
145}
146
147MlirDynamicAttrDefinition
149 MlirStringRef attrName) {
150 return wrap(llvm::cast<mlir::ExtensibleDialect>(unwrap(dialect))
151 ->lookupAttrDefinition(unwrap(attrName)));
152}
153
154bool mlirAttributeIsADynamicAttr(MlirAttribute attr) {
155 return llvm::isa<mlir::DynamicAttr>(unwrap(attr));
156}
157
158MlirTypeID mlirDynamicAttrGetTypeID(void) {
160}
161
162MlirAttribute mlirDynamicAttrGet(MlirDynamicAttrDefinition attrDef,
163 MlirAttribute *attrs, intptr_t numAttrs) {
165 attributes.reserve(numAttrs);
166 for (intptr_t i = 0; i < numAttrs; ++i)
167 attributes.push_back(unwrap(attrs[i]));
168
169 return wrap(mlir::DynamicAttr::get(unwrap(attrDef), attributes));
170}
171
173 return llvm::cast<mlir::DynamicAttr>(unwrap(attr)).getParams().size();
174}
175
176MlirAttribute mlirDynamicAttrGetParam(MlirAttribute attr, intptr_t index) {
177 return wrap(llvm::cast<mlir::DynamicAttr>(unwrap(attr)).getParams()[index]);
178}
179
180MlirDynamicAttrDefinition mlirDynamicAttrGetAttrDef(MlirAttribute attr) {
181 return wrap(llvm::cast<mlir::DynamicAttr>(unwrap(attr)).getAttrDef());
182}
183
184MlirTypeID
185mlirDynamicAttrDefinitionGetTypeID(MlirDynamicAttrDefinition attrDef) {
186 return wrap(unwrap(attrDef)->getTypeID());
187}
188
190mlirDynamicAttrDefinitionGetName(MlirDynamicAttrDefinition attrDef) {
191 return wrap(unwrap(attrDef)->getName());
192}
193
194MlirDialect
195mlirDynamicAttrDefinitionGetDialect(MlirDynamicAttrDefinition attrDef) {
196 return wrap(unwrap(attrDef)->getDialect());
197}
bool mlirTypeIsADynamicType(MlirType type)
Check if the given type is a dynamic type.
MlirDialect mlirDynamicTypeDefinitionGetDialect(MlirDynamicTypeDefinition typeDef)
Get the dialect that the given dynamic type definition belongs to.
MlirDynamicTypeDefinition mlirDynamicTypeGetTypeDef(MlirType type)
Get the type definition of the given dynamic type.
MlirType mlirDynamicTypeGet(MlirDynamicTypeDefinition typeDef, MlirAttribute *attrs, intptr_t numAttrs)
Get a dynamic type by instantiating the given type definition with the provided attributes.
bool mlirDialectIsAExtensibleDialect(MlirDialect dialect)
Check if the given dialect is an extensible dialect.
MlirDynamicOpTrait mlirDynamicOpTraitCreate(MlirTypeID typeID, MlirDynamicOpTraitCallbacks callbacks, void *userData)
Create a custom dynamic op trait with the given type ID and callbacks.
MlirDynamicAttrDefinition mlirDynamicAttrGetAttrDef(MlirAttribute attr)
Get the attribute definition of the given dynamic attribute.
MlirDynamicTypeDefinition mlirExtensibleDialectLookupTypeDefinition(MlirDialect dialect, MlirStringRef typeName)
Look up a registered type definition by type name in the given dialect.
MlirDynamicOpTrait mlirDynamicOpTraitIsTerminatorCreate()
Get the dynamic op trait that indicates the operation is a terminator.
MlirStringRef mlirDynamicAttrDefinitionGetName(MlirDynamicAttrDefinition attrDef)
Get the name of the given dynamic attribute definition.
void mlirDynamicOpTraitDestroy(MlirDynamicOpTrait dynamicOpTrait)
Destroy the dynamic op trait.
MlirAttribute mlirDynamicAttrGet(MlirDynamicAttrDefinition attrDef, MlirAttribute *attrs, intptr_t numAttrs)
Get a dynamic attribute by instantiating the given attribute definition with the provided attributes.
MlirTypeID mlirDynamicAttrDefinitionGetTypeID(MlirDynamicAttrDefinition attrDef)
Get the type ID of a dynamic attribute definition.
MlirDynamicAttrDefinition mlirExtensibleDialectLookupAttrDefinition(MlirDialect dialect, MlirStringRef attrName)
Look up a registered attribute definition by attribute name in the given dialect.
MlirDialect mlirDynamicAttrDefinitionGetDialect(MlirDynamicAttrDefinition attrDef)
Get the dialect that the given dynamic attribute definition belongs to.
MlirTypeID mlirDynamicTypeDefinitionGetTypeID(MlirDynamicTypeDefinition typeDef)
Get the type ID of a dynamic type definition.
intptr_t mlirDynamicTypeGetNumParams(MlirType type)
Get the number of parameters in the given dynamic type.
MlirTypeID mlirDynamicTypeGetTypeID()
MlirStringRef mlirDynamicTypeDefinitionGetName(MlirDynamicTypeDefinition typeDef)
Get the name of the given dynamic type definition.
MlirAttribute mlirDynamicAttrGetParam(MlirAttribute attr, intptr_t index)
Get the parameter at the given index in the provided dynamic attribute.
MlirAttribute mlirDynamicTypeGetParam(MlirType type, intptr_t index)
Get the parameter at the given index in the provided dynamic type.
intptr_t mlirDynamicAttrGetNumParams(MlirAttribute attr)
Get the number of parameters in the given dynamic attribute.
bool mlirAttributeIsADynamicAttr(MlirAttribute attr)
Check if the given attribute is a dynamic attribute.
MlirTypeID mlirDynamicAttrGetTypeID(void)
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 attribute.
static DynamicAttr get(DynamicAttrDefinition *attrDef, ArrayRef< Attribute > params={})
Return an instance of a dynamic attribute given a dynamic attribute definition and attribute paramete...
The definition of a dynamic op.
Base class of traits for dynamic-defined operations.
The definition of a dynamic type.
static DynamicType get(DynamicTypeDefinition *typeDef, ArrayRef< Attribute > params={})
Return an instance of a dynamic type given a dynamic type definition and type parameters.
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