[Mlir-commits] [mlir] [MLIR][Python] enable precise registration (PR #160742)
Maksim Levental
llvmlistbot at llvm.org
Fri Sep 26 20:35:39 PDT 2025
https://github.com/makslevental updated https://github.com/llvm/llvm-project/pull/160742
>From 17d76f802f323ce0b909064580921021724e007d Mon Sep 17 00:00:00 2001
From: makslevental <maksim.levental at gmail.com>
Date: Thu, 25 Sep 2025 09:40:53 -0700
Subject: [PATCH 1/2] [MLIR][Python] enable precise registration
---
mlir/cmake/modules/AddMLIRPython.cmake | 14 +++++++++++---
mlir/python/CMakeLists.txt | 24 +++++++++++++++++++++---
mlir/python/mlir/_mlir_libs/_capi.py.in | 8 ++++++++
mlir/test/python/ir/capi.py | 6 ++++++
4 files changed, 46 insertions(+), 6 deletions(-)
create mode 100644 mlir/python/mlir/_mlir_libs/_capi.py.in
create mode 100644 mlir/test/python/ir/capi.py
diff --git a/mlir/cmake/modules/AddMLIRPython.cmake b/mlir/cmake/modules/AddMLIRPython.cmake
index 208cbdd1dd535..d8b6d493f985c 100644
--- a/mlir/cmake/modules/AddMLIRPython.cmake
+++ b/mlir/cmake/modules/AddMLIRPython.cmake
@@ -23,11 +23,14 @@
# grouping. Source groupings form a DAG.
# SOURCES: List of specific source files relative to ROOT_DIR to include.
# SOURCES_GLOB: List of glob patterns relative to ROOT_DIR to include.
+# EMBED_CAPI_LINK_LIBS: Dependent CAPI libraries that this extension depends
+# on. These will be collected for all extensions and put into an
+# aggregate dylib that is linked against.
function(declare_mlir_python_sources name)
cmake_parse_arguments(ARG
""
"ROOT_DIR;ADD_TO_PARENT"
- "SOURCES;SOURCES_GLOB"
+ "SOURCES;SOURCES_GLOB;EMBED_CAPI_LINK_LIBS"
${ARGN})
if(NOT ARG_ROOT_DIR)
@@ -53,9 +56,10 @@ function(declare_mlir_python_sources name)
set_target_properties(${name} PROPERTIES
# Yes: Leading-lowercase property names are load bearing and the recommended
# way to do this: https://gitlab.kitware.com/cmake/cmake/-/issues/19261
- EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_DEPENDS"
+ EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_DEPENDS;mlir_python_EMBED_CAPI_LINK_LIBS"
mlir_python_SOURCES_TYPE pure
mlir_python_DEPENDS ""
+ mlir_python_EMBED_CAPI_LINK_LIBS "${ARG_EMBED_CAPI_LINK_LIBS}"
)
# Use the interface include directories and sources on the target to carry the
@@ -374,6 +378,9 @@ endfunction()
# This file is where the *EnumAttrs are defined, not where the *Enums are defined.
# **WARNING**: This arg will shortly be removed when the just-below TODO is satisfied. Use at your
# risk.
+# EMBED_CAPI_LINK_LIBS: Dependent CAPI libraries that this extension depends
+# on. These will be collected for all extensions and put into an
+# aggregate dylib that is linked against.
#
# TODO: Right now `TD_FILE` can't be the actual dialect tablegen file, since we
# use its path to determine where to place the generated python file. If
@@ -383,7 +390,7 @@ function(declare_mlir_dialect_python_bindings)
cmake_parse_arguments(ARG
"GEN_ENUM_BINDINGS"
"ROOT_DIR;ADD_TO_PARENT;TD_FILE;DIALECT_NAME"
- "SOURCES;SOURCES_GLOB;DEPENDS;GEN_ENUM_BINDINGS_TD_FILE"
+ "SOURCES;SOURCES_GLOB;DEPENDS;GEN_ENUM_BINDINGS_TD_FILE;EMBED_CAPI_LINK_LIBS"
${ARGN})
# Sources.
set(_dialect_target "${ARG_ADD_TO_PARENT}.${ARG_DIALECT_NAME}")
@@ -424,6 +431,7 @@ function(declare_mlir_dialect_python_bindings)
ROOT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
ADD_TO_PARENT "${_dialect_target}"
SOURCES ${_sources}
+ EMBED_CAPI_LINK_LIBS "${ARG_EMBED_CAPI_LINK_LIBS}"
)
endif()
endfunction()
diff --git a/mlir/python/CMakeLists.txt b/mlir/python/CMakeLists.txt
index 9f5246de6bda0..368f344841ed1 100644
--- a/mlir/python/CMakeLists.txt
+++ b/mlir/python/CMakeLists.txt
@@ -326,7 +326,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/arith.py
DIALECT_NAME arith
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIArith
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -846,8 +849,20 @@ endif()
# once ready.
################################################################################
+set(MLIR_PYTHON_CAPI_DYLIB_NAME MLIRPythonCAPI)
+configure_file(
+ "${CMAKE_CURRENT_LIST_DIR}/mlir/_mlir_libs/_capi.py.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/_mlir_libs/_capi.py"
+ @ONLY
+)
+declare_mlir_python_sources(
+ MLIRPythonCAPICTypesBinding
+ ROOT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
+ SOURCES _mlir_libs/_capi.py
+)
+
set(MLIRPythonModules_ROOT_PREFIX "${MLIR_BINARY_DIR}/${MLIR_BINDINGS_PYTHON_INSTALL_PREFIX}")
-add_mlir_python_common_capi_library(MLIRPythonCAPI
+add_mlir_python_common_capi_library(${MLIR_PYTHON_CAPI_DYLIB_NAME}
INSTALL_COMPONENT MLIRPythonModules
INSTALL_DESTINATION "${MLIR_BINDINGS_PYTHON_INSTALL_PREFIX}/_mlir_libs"
OUTPUT_DIRECTORY "${MLIRPythonModules_ROOT_PREFIX}/_mlir_libs"
@@ -963,7 +978,10 @@ endif()
# This must come last.
################################################################################
-set(_declared_sources MLIRPythonSources MLIRPythonExtension.RegisterEverything)
+set(_declared_sources
+ MLIRPythonSources
+ MLIRPythonExtension.RegisterEverything
+ MLIRPythonCAPICTypesBinding)
if(NOT CMAKE_CROSSCOMPILING)
list(APPEND _declared_sources MLIRPythonExtension.Core.type_stub_gen)
endif()
diff --git a/mlir/python/mlir/_mlir_libs/_capi.py.in b/mlir/python/mlir/_mlir_libs/_capi.py.in
new file mode 100644
index 0000000000000..9568845e67de9
--- /dev/null
+++ b/mlir/python/mlir/_mlir_libs/_capi.py.in
@@ -0,0 +1,8 @@
+# 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
+
+import ctypes
+from pathlib import Path
+
+_capi = ctypes.CDLL(str(Path(__file__).parent / "@CMAKE_SHARED_LIBRARY_PREFIX@@MLIR_PYTHON_CAPI_DYLIB_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@"))
\ No newline at end of file
diff --git a/mlir/test/python/ir/capi.py b/mlir/test/python/ir/capi.py
new file mode 100644
index 0000000000000..d60fbd820f91e
--- /dev/null
+++ b/mlir/test/python/ir/capi.py
@@ -0,0 +1,6 @@
+# RUN: %PYTHON %s | FileCheck %s
+
+from mlir._mlir_libs._capi import _capi
+
+print("success")
+# CHECK: success
\ No newline at end of file
>From 103bc72a5c518d0879f3e38c3669b326d9c0c975 Mon Sep 17 00:00:00 2001
From: makslevental <maksim.levental at gmail.com>
Date: Thu, 25 Sep 2025 14:59:58 -0700
Subject: [PATCH 2/2] [MLIR][Python] enable precise registration
---
mlir/include/mlir-c/Bindings/Python/Interop.h | 9 +
mlir/include/mlir-c/Dialect/Affine.h | 33 +++
mlir/include/mlir-c/Dialect/Bufferization.h | 33 +++
mlir/include/mlir-c/Dialect/Builtin.h | 33 +++
mlir/include/mlir-c/Dialect/Complex.h | 33 +++
mlir/include/mlir-c/Dialect/Tosa.h | 33 +++
mlir/include/mlir-c/Dialect/UB.h | 33 +++
mlir/include/mlir-c/IR.h | 18 +-
mlir/lib/Bindings/Python/IRCore.cpp | 34 ++-
mlir/lib/CAPI/Dialect/Affine.cpp | 14 ++
mlir/lib/CAPI/Dialect/Bufferization.cpp | 14 ++
mlir/lib/CAPI/Dialect/Builtin.cpp | 13 ++
mlir/lib/CAPI/Dialect/CMakeLists.txt | 53 +++++
mlir/lib/CAPI/Dialect/Complex.cpp | 14 ++
mlir/lib/CAPI/Dialect/Tosa.cpp | 13 ++
mlir/lib/CAPI/Dialect/UB.cpp | 13 ++
mlir/lib/CAPI/IR/IR.cpp | 12 +
mlir/python/CMakeLists.txt | 207 +++++++++++++-----
mlir/python/mlir/_mlir_libs/_capi.py.in | 10 +-
mlir/python/mlir/dialects/QuantOps.td | 14 ++
mlir/python/mlir/dialects/quant.py | 1 +
mlir/test/python/dialects/gpu/dialect.py | 1 +
mlir/test/python/dialects/irdl.py | 1 +
mlir/test/python/integration/dialects/pdl.py | 2 +-
mlir/test/python/ir/capi.py | 39 +++-
mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp | 17 +-
26 files changed, 629 insertions(+), 68 deletions(-)
create mode 100644 mlir/include/mlir-c/Dialect/Affine.h
create mode 100644 mlir/include/mlir-c/Dialect/Bufferization.h
create mode 100644 mlir/include/mlir-c/Dialect/Builtin.h
create mode 100644 mlir/include/mlir-c/Dialect/Complex.h
create mode 100644 mlir/include/mlir-c/Dialect/Tosa.h
create mode 100644 mlir/include/mlir-c/Dialect/UB.h
create mode 100644 mlir/lib/CAPI/Dialect/Affine.cpp
create mode 100644 mlir/lib/CAPI/Dialect/Bufferization.cpp
create mode 100644 mlir/lib/CAPI/Dialect/Builtin.cpp
create mode 100644 mlir/lib/CAPI/Dialect/Complex.cpp
create mode 100644 mlir/lib/CAPI/Dialect/Tosa.cpp
create mode 100644 mlir/lib/CAPI/Dialect/UB.cpp
create mode 100644 mlir/python/mlir/dialects/QuantOps.td
diff --git a/mlir/include/mlir-c/Bindings/Python/Interop.h b/mlir/include/mlir-c/Bindings/Python/Interop.h
index a33190c380d37..89559da689017 100644
--- a/mlir/include/mlir-c/Bindings/Python/Interop.h
+++ b/mlir/include/mlir-c/Bindings/Python/Interop.h
@@ -84,6 +84,8 @@
#define MLIR_PYTHON_CAPSULE_VALUE MAKE_MLIR_PYTHON_QUALNAME("ir.Value._CAPIPtr")
#define MLIR_PYTHON_CAPSULE_TYPEID \
MAKE_MLIR_PYTHON_QUALNAME("ir.TypeID._CAPIPtr")
+#define MLIR_PYTHON_CAPSULE_DIALECT_HANDLE \
+ MAKE_MLIR_PYTHON_QUALNAME("ir.DialectHandle._CAPIPtr")
/** Attribute on MLIR Python objects that expose their C-API pointer.
* This will be a type-specific capsule created as per one of the helpers
@@ -457,6 +459,13 @@ static inline MlirValue mlirPythonCapsuleToValue(PyObject *capsule) {
return value;
}
+static inline MlirDialectHandle
+mlirPythonCapsuleToDialectHandle(PyObject *capsule) {
+ void *ptr = PyCapsule_GetPointer(capsule, MLIR_PYTHON_CAPSULE_DIALECT_HANDLE);
+ MlirDialectHandle handle = {ptr};
+ return handle;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/mlir/include/mlir-c/Dialect/Affine.h b/mlir/include/mlir-c/Dialect/Affine.h
new file mode 100644
index 0000000000000..3382c485194e8
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/Affine.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/Affine.h - C API for Affine dialect --------*- 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 header declares the C interface for registering and accessing the
+// Affine dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_AFFINE_H
+#define MLIR_C_DIALECT_AFFINE_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Affine, affine);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_AFFINE_H
diff --git a/mlir/include/mlir-c/Dialect/Bufferization.h b/mlir/include/mlir-c/Dialect/Bufferization.h
new file mode 100644
index 0000000000000..33fa64ac7c8a8
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/Bufferization.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/Bufferization.h - C API for Bufferization dialect ----------*- 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 header declares the C interface for registering and accessing the
+// Bufferization dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_BUFFERIZATION_H
+#define MLIR_C_DIALECT_BUFFERIZATION_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Bufferization, bufferization);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_BUFFERIZATION_H
diff --git a/mlir/include/mlir-c/Dialect/Builtin.h b/mlir/include/mlir-c/Dialect/Builtin.h
new file mode 100644
index 0000000000000..c5d958249b36f
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/Builtin.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/Builtin.h - C API for Builtin dialect ------*- 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 header declares the C interface for registering and accessing the
+// Builtin dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_BUILTIN_H
+#define MLIR_C_DIALECT_BUILTIN_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Builtin, builtin);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_BUILTIN_H
diff --git a/mlir/include/mlir-c/Dialect/Complex.h b/mlir/include/mlir-c/Dialect/Complex.h
new file mode 100644
index 0000000000000..e51a67346a6ee
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/Complex.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/Complex.h - C API for Complex dialect ------*- 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 header declares the C interface for registering and accessing the
+// Complex dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_COMPLEX_H
+#define MLIR_C_DIALECT_COMPLEX_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Complex, complex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_COMPLEX_H
diff --git a/mlir/include/mlir-c/Dialect/Tosa.h b/mlir/include/mlir-c/Dialect/Tosa.h
new file mode 100644
index 0000000000000..3dc1d2a042fb2
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/Tosa.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/Tosa.h - C API for Tosa dialect ----------*- 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 header declares the C interface for registering and accessing the
+// Tosa dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_TOSA_H
+#define MLIR_C_DIALECT_TOSA_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Tosa, tosa);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_TOSA_H
diff --git a/mlir/include/mlir-c/Dialect/UB.h b/mlir/include/mlir-c/Dialect/UB.h
new file mode 100644
index 0000000000000..74159f0c705de
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/UB.h
@@ -0,0 +1,33 @@
+//===-- mlir-c/Dialect/UB.h - C API for UB dialect ----------------*- 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 header declares the C interface for registering and accessing the
+// UB dialect. A dialect should be registered with a context to make it
+// available to users of the context. These users must load the dialect
+// before using any of its attributes, operations or types. Parser and pass
+// manager can load registered dialects automatically.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_UB_H
+#define MLIR_C_DIALECT_UB_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(UB, ub);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_UB_H
diff --git a/mlir/include/mlir-c/IR.h b/mlir/include/mlir-c/IR.h
index 061d7620ba077..55cc86accb8a0 100644
--- a/mlir/include/mlir-c/IR.h
+++ b/mlir/include/mlir-c/IR.h
@@ -66,6 +66,7 @@ DEFINE_C_API_STRUCT(MlirLocation, const void);
DEFINE_C_API_STRUCT(MlirModule, const void);
DEFINE_C_API_STRUCT(MlirType, const void);
DEFINE_C_API_STRUCT(MlirValue, const void);
+DEFINE_C_API_STRUCT(MlirDialectHandle, const void);
#undef DEFINE_C_API_STRUCT
@@ -207,11 +208,6 @@ MLIR_CAPI_EXPORTED MlirStringRef mlirDialectGetNamespace(MlirDialect dialect);
// registration schemes.
//===----------------------------------------------------------------------===//
-struct MlirDialectHandle {
- const void *ptr;
-};
-typedef struct MlirDialectHandle MlirDialectHandle;
-
#define MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Name, Namespace) \
MLIR_CAPI_EXPORTED MlirDialectHandle mlirGetDialectHandle__##Namespace##__( \
void)
@@ -233,6 +229,11 @@ MLIR_CAPI_EXPORTED void mlirDialectHandleRegisterDialect(MlirDialectHandle,
MLIR_CAPI_EXPORTED MlirDialect mlirDialectHandleLoadDialect(MlirDialectHandle,
MlirContext);
+/// Checks if the dialect handle is null.
+static inline bool mlirDialectHandleIsNull(MlirDialectHandle handle) {
+ return !handle.ptr;
+}
+
//===----------------------------------------------------------------------===//
// DialectRegistry API.
//===----------------------------------------------------------------------===//
@@ -249,6 +250,13 @@ static inline bool mlirDialectRegistryIsNull(MlirDialectRegistry registry) {
MLIR_CAPI_EXPORTED void
mlirDialectRegistryDestroy(MlirDialectRegistry registry);
+MLIR_CAPI_EXPORTED int64_t
+mlirDialectRegistryGetNumDialectNames(MlirDialectRegistry registry);
+
+MLIR_CAPI_EXPORTED void
+mlirDialectRegistryGetDialectNames(MlirDialectRegistry registry,
+ MlirStringRef *dialectNames);
+
//===----------------------------------------------------------------------===//
// Location API.
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Bindings/Python/IRCore.cpp b/mlir/lib/Bindings/Python/IRCore.cpp
index 83a8757bb72c7..c3d28733c2cee 100644
--- a/mlir/lib/Bindings/Python/IRCore.cpp
+++ b/mlir/lib/Bindings/Python/IRCore.cpp
@@ -2897,6 +2897,14 @@ maybeGetTracebackLocation(const std::optional<PyLocation> &location) {
// Populates the core exports of the 'ir' submodule.
//------------------------------------------------------------------------------
+MlirDialectHandle createMlirDialectHandleFromCapsule(nb::object capsule) {
+ MlirDialectHandle rawRegistry =
+ mlirPythonCapsuleToDialectHandle(capsule.ptr());
+ if (mlirDialectHandleIsNull(rawRegistry))
+ throw nb::python_error();
+ return rawRegistry;
+}
+
void mlir::python::populateIRCore(nb::module_ &m) {
// disable leak warnings which tend to be false positives.
nb::set_leak_warnings(false);
@@ -3126,6 +3134,14 @@ void mlir::python::populateIRCore(nb::module_ &m) {
},
nb::sig("def __repr__(self) -> str"));
+ //----------------------------------------------------------------------------
+ // Mapping of MlirDialectHandle
+ //----------------------------------------------------------------------------
+
+ nb::class_<MlirDialectHandle>(m, "DialectHandle")
+ .def_static(MLIR_PYTHON_CAPI_FACTORY_ATTR,
+ &createMlirDialectHandleFromCapsule);
+
//----------------------------------------------------------------------------
// Mapping of PyDialectRegistry
//----------------------------------------------------------------------------
@@ -3133,7 +3149,23 @@ void mlir::python::populateIRCore(nb::module_ &m) {
.def_prop_ro(MLIR_PYTHON_CAPI_PTR_ATTR, &PyDialectRegistry::getCapsule)
.def_static(MLIR_PYTHON_CAPI_FACTORY_ATTR,
&PyDialectRegistry::createFromCapsule)
- .def(nb::init<>());
+ .def(nb::init<>())
+ .def("insert_dialect",
+ [](PyDialectRegistry &self, MlirDialectHandle handle) {
+ mlirDialectHandleInsertDialect(handle, self.get());
+ })
+ .def("insert_dialect",
+ [](PyDialectRegistry &self, intptr_t ptr) {
+ mlirDialectHandleInsertDialect(
+ {reinterpret_cast<const void *>(ptr)}, self.get());
+ })
+ .def_prop_ro("dialect_names", [](PyDialectRegistry &self) {
+ int64_t numDialectNames =
+ mlirDialectRegistryGetNumDialectNames(self.get());
+ std::vector<MlirStringRef> dialectNames(numDialectNames);
+ mlirDialectRegistryGetDialectNames(self.get(), dialectNames.data());
+ return dialectNames;
+ });
//----------------------------------------------------------------------------
// Mapping of Location
diff --git a/mlir/lib/CAPI/Dialect/Affine.cpp b/mlir/lib/CAPI/Dialect/Affine.cpp
new file mode 100644
index 0000000000000..b796523390a29
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/Affine.cpp
@@ -0,0 +1,14 @@
+//===- Affine.cpp - C Interface for Affine dialect ------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/Affine.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/Affine/IR/AffineOps.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Affine, affine,
+ mlir::affine::AffineDialect)
diff --git a/mlir/lib/CAPI/Dialect/Bufferization.cpp b/mlir/lib/CAPI/Dialect/Bufferization.cpp
new file mode 100644
index 0000000000000..da50dfaab44b6
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/Bufferization.cpp
@@ -0,0 +1,14 @@
+//===- Bufferization.cpp - C Interface for Bufferization dialect ----------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/Bufferization.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/Bufferization/IR/Bufferization.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Bufferization, bufferization,
+ mlir::bufferization::BufferizationDialect)
diff --git a/mlir/lib/CAPI/Dialect/Builtin.cpp b/mlir/lib/CAPI/Dialect/Builtin.cpp
new file mode 100644
index 0000000000000..d095daa294c56
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/Builtin.cpp
@@ -0,0 +1,13 @@
+//===- Builtin.cpp - C Interface for Builtin dialect ----------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/Builtin.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/IR/BuiltinDialect.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Builtin, builtin, mlir::BuiltinDialect)
diff --git a/mlir/lib/CAPI/Dialect/CMakeLists.txt b/mlir/lib/CAPI/Dialect/CMakeLists.txt
index bb1fdf8be3c8f..106fa4b8038ff 100644
--- a/mlir/lib/CAPI/Dialect/CMakeLists.txt
+++ b/mlir/lib/CAPI/Dialect/CMakeLists.txt
@@ -7,6 +7,15 @@ add_mlir_upstream_c_api_library(MLIRCAPIAMDGPU
MLIRAMDGPUDialect
)
+add_mlir_upstream_c_api_library(MLIRCAPIAffine
+ Affine.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+ MLIRAffineDialect
+)
+
add_mlir_upstream_c_api_library(MLIRCAPIArith
Arith.cpp
@@ -16,6 +25,23 @@ add_mlir_upstream_c_api_library(MLIRCAPIArith
MLIRArithDialect
)
+add_mlir_upstream_c_api_library(MLIRCAPIBufferization
+ Bufferization.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+ MLIRBufferizationDialect
+)
+
+add_mlir_upstream_c_api_library(MLIRCAPIBuiltin
+ Builtin.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+)
+
add_mlir_upstream_c_api_library(MLIRCAPIAsync
Async.cpp
AsyncPasses.cpp
@@ -31,6 +57,15 @@ add_mlir_upstream_c_api_library(MLIRCAPIAsync
MLIRPass
)
+add_mlir_upstream_c_api_library(MLIRCAPIComplex
+ Complex.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+ MLIRComplexDialect
+)
+
add_mlir_upstream_c_api_library(MLIRCAPIControlFlow
ControlFlow.cpp
@@ -278,3 +313,21 @@ add_mlir_upstream_c_api_library(MLIRCAPISMT
MLIRCAPIIR
MLIRSMT
)
+
+add_mlir_upstream_c_api_library(MLIRCAPITosa
+ Tosa.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+ MLIRTosaDialect
+)
+
+add_mlir_upstream_c_api_library(MLIRCAPIUB
+ UB.cpp
+
+ PARTIAL_SOURCES_INTENDED
+ LINK_LIBS PUBLIC
+ MLIRCAPIIR
+ MLIRUBDialect
+)
\ No newline at end of file
diff --git a/mlir/lib/CAPI/Dialect/Complex.cpp b/mlir/lib/CAPI/Dialect/Complex.cpp
new file mode 100644
index 0000000000000..7063028e5d640
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/Complex.cpp
@@ -0,0 +1,14 @@
+//===- Complex.cpp - C Interface for Complex dialect ----------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/Complex.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/Complex/IR/Complex.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Complex, complex,
+ mlir::complex::ComplexDialect)
diff --git a/mlir/lib/CAPI/Dialect/Tosa.cpp b/mlir/lib/CAPI/Dialect/Tosa.cpp
new file mode 100644
index 0000000000000..357717a2ed5a5
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/Tosa.cpp
@@ -0,0 +1,13 @@
+//===- Tosa.cpp - C Interface for Tosa dialect ----------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/Tosa.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/Tosa/IR/TosaOps.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Tosa, tosa, mlir::tosa::TosaDialect)
diff --git a/mlir/lib/CAPI/Dialect/UB.cpp b/mlir/lib/CAPI/Dialect/UB.cpp
new file mode 100644
index 0000000000000..de989237159c4
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/UB.cpp
@@ -0,0 +1,13 @@
+//===- Ub.cpp - C Interface for UB dialect --------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir-c/Dialect/UB.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/UB/IR/UBOps.h"
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(UB, ub, mlir::ub::UBDialect)
diff --git a/mlir/lib/CAPI/IR/IR.cpp b/mlir/lib/CAPI/IR/IR.cpp
index e9844a7cc1909..a81e2a14e5255 100644
--- a/mlir/lib/CAPI/IR/IR.cpp
+++ b/mlir/lib/CAPI/IR/IR.cpp
@@ -150,6 +150,18 @@ void mlirDialectRegistryDestroy(MlirDialectRegistry registry) {
delete unwrap(registry);
}
+int64_t mlirDialectRegistryGetNumDialectNames(MlirDialectRegistry registry) {
+ auto dialectNames = unwrap(registry)->getDialectNames();
+ return std::distance(dialectNames.begin(), dialectNames.end());
+}
+
+void mlirDialectRegistryGetDialectNames(MlirDialectRegistry registry,
+ MlirStringRef *dialectNames) {
+ for (auto [i, location] :
+ llvm::enumerate(unwrap(registry)->getDialectNames()))
+ dialectNames[i] = wrap(location);
+}
+
//===----------------------------------------------------------------------===//
// AsmState API.
//===----------------------------------------------------------------------===//
diff --git a/mlir/python/CMakeLists.txt b/mlir/python/CMakeLists.txt
index 368f344841ed1..c54b2a057148a 100644
--- a/mlir/python/CMakeLists.txt
+++ b/mlir/python/CMakeLists.txt
@@ -64,7 +64,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/affine.py
DIALECT_NAME affine
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIAffine
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -73,14 +76,20 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/amdgpu.py
DIALECT_NAME amdgpu
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIAMDGPU
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
TD_FILE dialects/AsyncOps.td
SOURCES_GLOB dialects/async_dialect/*.py
- DIALECT_NAME async)
+ DIALECT_NAME async
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIAsync
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -91,6 +100,8 @@ declare_mlir_dialect_python_bindings(
DIALECT_NAME bufferization
GEN_ENUM_BINDINGS_TD_FILE
"../../include/mlir/Dialect/Bufferization/IR/BufferizationEnums.td"
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIBufferization
)
declare_mlir_dialect_python_bindings(
@@ -99,7 +110,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/BuiltinOps.td
SOURCES
dialects/builtin.py
- DIALECT_NAME builtin)
+ DIALECT_NAME builtin
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIBuiltin
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -107,7 +121,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/ComplexOps.td
SOURCES
dialects/complex.py
- DIALECT_NAME complex)
+ DIALECT_NAME complex
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIComplex
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -116,7 +133,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/index.py
DIALECT_NAME index
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIIndex
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -124,7 +144,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/ControlFlowOps.td
SOURCES
dialects/cf.py
- DIALECT_NAME cf)
+ DIALECT_NAME cf
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIControlFlow
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -132,7 +155,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/FuncOps.td
SOURCES
dialects/func.py
- DIALECT_NAME func)
+ DIALECT_NAME func
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIFunc
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -140,7 +166,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/GPUOps.td
SOURCES_GLOB dialects/gpu/*.py
DIALECT_NAME gpu
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIGPU
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -151,7 +180,10 @@ declare_mlir_dialect_python_bindings(
dialects/linalg/*.py
DIALECT_NAME linalg
DEPENDS LinalgOdsGen
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPILinalg
+ )
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -160,7 +192,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/llvm.py
DIALECT_NAME llvm
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPILLVM
+ )
declare_mlir_dialect_extension_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -208,7 +243,9 @@ declare_mlir_dialect_python_bindings(
DIALECT_NAME transform
GEN_ENUM_BINDINGS_TD_FILE
"../../include/mlir/Dialect/Transform/IR/TransformAttrs.td"
-)
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPITransformDialect
+ )
declare_mlir_python_sources(
MLIRPythonSources.Dialects.transform.extras
@@ -317,7 +354,10 @@ declare_mlir_dialect_python_bindings(
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
TD_FILE dialects/MathOps.td
SOURCES dialects/math.py
- DIALECT_NAME math)
+ DIALECT_NAME math
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIMath
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -329,7 +369,7 @@ declare_mlir_dialect_python_bindings(
GEN_ENUM_BINDINGS
EMBED_CAPI_LINK_LIBS
MLIRCAPIArith
- )
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -337,7 +377,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/MemRefOps.td
SOURCES
dialects/memref.py
- DIALECT_NAME memref)
+ DIALECT_NAME memref
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIMemRef
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -345,7 +388,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/MLProgramOps.td
SOURCES
dialects/ml_program.py
- DIALECT_NAME ml_program)
+ DIALECT_NAME ml_program
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIMLProgram
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -354,7 +400,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/nvgpu.py
DIALECT_NAME nvgpu
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPINVGPU
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -363,7 +412,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/nvvm.py
DIALECT_NAME nvvm
- GEN_ENUM_BINDINGS)
+ GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPINVVM
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -371,16 +423,23 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/ROCDLOps.td
SOURCES
dialects/rocdl.py
- DIALECT_NAME rocdl)
+ DIALECT_NAME rocdl
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIROCDL
+)
-declare_mlir_python_sources(
- MLIRPythonSources.Dialects.quant
+declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
+ TD_FILE dialects/QuantOps.td
GEN_ENUM_BINDINGS
SOURCES
dialects/quant.py
- _mlir_libs/_mlir/dialects/quant.pyi)
+ _mlir_libs/_mlir/dialects/quant.pyi
+ DIALECT_NAME quant
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIQuant
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -388,7 +447,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/EmitC.td
SOURCES
dialects/emitc.py
- DIALECT_NAME emitc)
+ DIALECT_NAME emitc
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIEmitC
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -397,7 +459,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/pdl.py
_mlir_libs/_mlir/dialects/pdl.pyi
- DIALECT_NAME pdl)
+ DIALECT_NAME pdl
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIPDL
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -406,7 +471,10 @@ declare_mlir_dialect_python_bindings(
SOURCES
dialects/openmp.py
DIALECT_NAME omp
- DEPENDS omp_common_td)
+ DEPENDS omp_common_td
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIOpenMP
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -414,14 +482,20 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/SCFOps.td
SOURCES
dialects/scf.py
- DIALECT_NAME scf)
+ DIALECT_NAME scf
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPISCF
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
TD_FILE dialects/ShapeOps.td
SOURCES dialects/shape.py
- DIALECT_NAME shape)
+ DIALECT_NAME shape
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIShape
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -431,6 +505,8 @@ declare_mlir_dialect_python_bindings(
DIALECT_NAME sparse_tensor
GEN_ENUM_BINDINGS_TD_FILE
"../../include/mlir/Dialect/SparseTensor/IR/SparseTensorAttrDefs.td"
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPISparseTensor
)
declare_mlir_dialect_python_bindings(
@@ -440,14 +516,20 @@ declare_mlir_dialect_python_bindings(
GEN_ENUM_BINDINGS
SOURCES
dialects/smt.py
- DIALECT_NAME smt)
+ DIALECT_NAME smt
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPISMT
+)
declare_mlir_dialect_python_bindings(
- ADD_TO_PARENT MLIRPythonSources.Dialects
- ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
- TD_FILE dialects/SPIRVOps.td
- SOURCES dialects/spirv.py
- DIALECT_NAME spirv)
+ ADD_TO_PARENT MLIRPythonSources.Dialects
+ ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
+ TD_FILE dialects/SPIRVOps.td
+ SOURCES dialects/spirv.py
+ DIALECT_NAME spirv
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPISPIRV
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -455,7 +537,10 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/TensorOps.td
SOURCES
dialects/tensor.py
- DIALECT_NAME tensor)
+ DIALECT_NAME tensor
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPITensor
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -463,6 +548,8 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/TosaOps.td
SOURCES dialects/tosa.py
DIALECT_NAME tosa
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPITosa
)
declare_mlir_dialect_python_bindings(
@@ -471,6 +558,8 @@ declare_mlir_dialect_python_bindings(
TD_FILE dialects/UBOps.td
SOURCES dialects/ub.py
DIALECT_NAME ub
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIUB
)
declare_mlir_dialect_python_bindings(
@@ -480,7 +569,10 @@ declare_mlir_dialect_python_bindings(
SOURCES dialects/vector.py
DIALECT_NAME vector
GEN_ENUM_BINDINGS_TD_FILE
- "dialects/VectorAttributes.td")
+ "dialects/VectorAttributes.td"
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIVector
+)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT MLIRPythonSources.Dialects
@@ -489,6 +581,8 @@ declare_mlir_dialect_python_bindings(
SOURCES dialects/irdl.py
DIALECT_NAME irdl
GEN_ENUM_BINDINGS
+ EMBED_CAPI_LINK_LIBS
+ MLIRCAPIIRDL
)
################################################################################
@@ -528,31 +622,32 @@ declare_mlir_python_extension(MLIRPythonExtension.Core
MLIRCAPIDebug
MLIRCAPIIR
MLIRCAPIInterfaces
+ MLIRCAPITransforms
+ MLIRCAPIBuiltin
# Dialects
MLIRCAPIFunc
)
-# This extension exposes an API to register all dialects, extensions, and passes
-# packaged in upstream MLIR and it is used for the upstream "mlir" Python
-# package. Downstreams will likely want to provide their own and not depend
-# on this one, since it links in the world.
-# Note that this is not added to any top-level source target for transitive
-# inclusion: It must be included explicitly by downstreams if desired. Note that
-# this has a very large impact on what gets built/packaged.
-declare_mlir_python_extension(MLIRPythonExtension.RegisterEverything
- MODULE_NAME _mlirRegisterEverything
- ROOT_DIR "${PYTHON_SOURCE_DIR}"
- PYTHON_BINDINGS_LIBRARY nanobind
- SOURCES
- RegisterEverything.cpp
- PRIVATE_LINK_LIBS
- LLVMSupport
- EMBED_CAPI_LINK_LIBS
- MLIRCAPIConversion
- MLIRCAPITransforms
- MLIRCAPIRegisterEverything
-)
+## This extension exposes an API to register all dialects, extensions, and passes
+## packaged in upstream MLIR and it is used for the upstream "mlir" Python
+## package. Downstreams will likely want to provide their own and not depend
+## on this one, since it links in the world.
+## Note that this is not added to any top-level source target for transitive
+## inclusion: It must be included explicitly by downstreams if desired. Note that
+## this has a very large impact on what gets built/packaged.
+#declare_mlir_python_extension(MLIRPythonExtension.RegisterEverything
+# MODULE_NAME _mlirRegisterEverything
+# ROOT_DIR "${PYTHON_SOURCE_DIR}"
+# PYTHON_BINDINGS_LIBRARY nanobind
+# SOURCES
+# RegisterEverything.cpp
+# PRIVATE_LINK_LIBS
+# LLVMSupport
+# MLIRCAPIConversion
+# MLIRCAPITransforms
+# MLIRCAPIRegisterEverything
+#)
declare_mlir_python_extension(MLIRPythonExtension.Dialects.Linalg.Pybind
MODULE_NAME _mlirDialectsLinalg
@@ -871,7 +966,6 @@ add_mlir_python_common_capi_library(${MLIR_PYTHON_CAPI_DYLIB_NAME}
MLIRPythonCAPI.HeaderSources
DECLARED_SOURCES
MLIRPythonSources
- MLIRPythonExtension.RegisterEverything
${_ADDL_TEST_SOURCES}
)
@@ -980,7 +1074,6 @@ endif()
set(_declared_sources
MLIRPythonSources
- MLIRPythonExtension.RegisterEverything
MLIRPythonCAPICTypesBinding)
if(NOT CMAKE_CROSSCOMPILING)
list(APPEND _declared_sources MLIRPythonExtension.Core.type_stub_gen)
diff --git a/mlir/python/mlir/_mlir_libs/_capi.py.in b/mlir/python/mlir/_mlir_libs/_capi.py.in
index 9568845e67de9..b79d14957a511 100644
--- a/mlir/python/mlir/_mlir_libs/_capi.py.in
+++ b/mlir/python/mlir/_mlir_libs/_capi.py.in
@@ -5,4 +5,12 @@
import ctypes
from pathlib import Path
-_capi = ctypes.CDLL(str(Path(__file__).parent / "@CMAKE_SHARED_LIBRARY_PREFIX@@MLIR_PYTHON_CAPI_DYLIB_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@"))
\ No newline at end of file
+_capi = ctypes.CDLL(str(Path(__file__).parent / "@CMAKE_SHARED_LIBRARY_PREFIX@@MLIR_PYTHON_CAPI_DYLIB_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@"))
+
+PyCapsule_New = ctypes.pythonapi.PyCapsule_New
+PyCapsule_New.restype = ctypes.py_object
+PyCapsule_New.argtypes = ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p
+
+MLIR_PYTHON_CAPSULE_DIALECT_HANDLE = (
+ "@MLIR_PYTHON_PACKAGE_PREFIX at .ir.DialectHandle._CAPIPtr"
+).encode()
diff --git a/mlir/python/mlir/dialects/QuantOps.td b/mlir/python/mlir/dialects/QuantOps.td
new file mode 100644
index 0000000000000..46385fd00ac0c
--- /dev/null
+++ b/mlir/python/mlir/dialects/QuantOps.td
@@ -0,0 +1,14 @@
+//===-- QuantOps.td - Entry point for QuantOps bind --------*- tablegen -*-===//
+//
+// 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 PYTHON_BINDINGS_QUANT_OPS
+#define PYTHON_BINDINGS_QUANT_OPS
+
+include "mlir/Dialect/Quant/IR/QuantOps.td"
+
+#endif
diff --git a/mlir/python/mlir/dialects/quant.py b/mlir/python/mlir/dialects/quant.py
index bf1fc5f2de378..7a7273d8e26be 100644
--- a/mlir/python/mlir/dialects/quant.py
+++ b/mlir/python/mlir/dialects/quant.py
@@ -2,4 +2,5 @@
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+from ._quant_ops_gen import *
from .._mlir_libs._mlirDialectsQuant import *
diff --git a/mlir/test/python/dialects/gpu/dialect.py b/mlir/test/python/dialects/gpu/dialect.py
index 26ee9f34cb332..3517b6519b93e 100644
--- a/mlir/test/python/dialects/gpu/dialect.py
+++ b/mlir/test/python/dialects/gpu/dialect.py
@@ -2,6 +2,7 @@
from mlir.ir import *
import mlir.dialects.gpu as gpu
+import mlir.dialects.nvvm as nvvm
import mlir.dialects.gpu.passes
from mlir.passmanager import *
diff --git a/mlir/test/python/dialects/irdl.py b/mlir/test/python/dialects/irdl.py
index ed62db9b69968..4dbcdd6d0cef2 100644
--- a/mlir/test/python/dialects/irdl.py
+++ b/mlir/test/python/dialects/irdl.py
@@ -2,6 +2,7 @@
from mlir.ir import *
from mlir.dialects.irdl import *
+import mlir.dialects.arith
import sys
diff --git a/mlir/test/python/integration/dialects/pdl.py b/mlir/test/python/integration/dialects/pdl.py
index c8e6197e03842..5876ecfa41a5a 100644
--- a/mlir/test/python/integration/dialects/pdl.py
+++ b/mlir/test/python/integration/dialects/pdl.py
@@ -1,6 +1,6 @@
# RUN: %PYTHON %s 2>&1 | FileCheck %s
-from mlir.dialects import arith, func, pdl
+from mlir.dialects import arith, func, pdl, irdl
from mlir.dialects.builtin import module
from mlir.ir import *
from mlir.rewrite import *
diff --git a/mlir/test/python/ir/capi.py b/mlir/test/python/ir/capi.py
index d60fbd820f91e..934fab91f05a0 100644
--- a/mlir/test/python/ir/capi.py
+++ b/mlir/test/python/ir/capi.py
@@ -1,6 +1,41 @@
# RUN: %PYTHON %s | FileCheck %s
-from mlir._mlir_libs._capi import _capi
+import ctypes
+
+from mlir._mlir_libs import get_dialect_registry
+from mlir._mlir_libs._capi import (
+ _capi,
+ PyCapsule_New,
+ MLIR_PYTHON_CAPSULE_DIALECT_HANDLE,
+)
+from mlir.ir import DialectHandle
print("success")
-# CHECK: success
\ No newline at end of file
+# CHECK: success
+
+
+if not hasattr(_capi, "mlirGetDialectHandle__arith__"):
+ raise Exception("missing API")
+_capi.mlirGetDialectHandle__arith__.argtypes = []
+_capi.mlirGetDialectHandle__arith__.restype = ctypes.c_void_p
+
+if not hasattr(_capi, "mlirGetDialectHandle__quant__"):
+ raise Exception("missing API")
+_capi.mlirGetDialectHandle__quant__.argtypes = []
+_capi.mlirGetDialectHandle__quant__.restype = ctypes.c_void_p
+
+dialect_registry = get_dialect_registry()
+# CHECK: ['builtin']
+print(dialect_registry.dialect_names)
+
+arith_handle = _capi.mlirGetDialectHandle__arith__()
+dialect_registry.insert_dialect(arith_handle)
+# CHECK: ['arith', 'builtin']
+print(dialect_registry.dialect_names)
+
+quant_handle = _capi.mlirGetDialectHandle__quant__()
+capsule = PyCapsule_New(quant_handle, MLIR_PYTHON_CAPSULE_DIALECT_HANDLE, None)
+dialect_handle = DialectHandle._CAPICreate(capsule)
+dialect_registry.insert_dialect(dialect_handle)
+# CHECK: ['arith', 'builtin', 'quant']
+print(dialect_registry.dialect_names)
diff --git a/mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp b/mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp
index 0172b3fa38a6b..270c438bc3bbb 100644
--- a/mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpPythonBindingGen.cpp
@@ -47,6 +47,21 @@ _ods_cext.globals.register_traceback_file_exclusion(__file__)
import builtins
from typing import Sequence as _Sequence, Union as _Union, Optional as _Optional
+import ctypes
+from .._mlir_libs import get_dialect_registry as _get_dialect_registry
+from .._mlir_libs._capi import _capi
+
+_dialect_registry = _get_dialect_registry()
+
+if not hasattr(_capi, "mlirGetDialectHandle__{0}__"):
+ raise RuntimeError("missing mlirGetDialectHandle__{0}__ API")
+
+_capi.mlirGetDialectHandle__{0}__.argtypes = []
+_capi.mlirGetDialectHandle__{0}__.restype = ctypes.c_void_p
+
+_{0}_handle = _capi.mlirGetDialectHandle__{0}__()
+_dialect_registry.insert_dialect(_{0}_handle)
+
)Py";
/// Template for dialect class:
@@ -1191,7 +1206,7 @@ static bool emitAllOps(const RecordKeeper &records, raw_ostream &os) {
if (clDialectName.empty())
llvm::PrintFatalError("dialect name not provided");
- os << fileHeader;
+ os << formatv(fileHeader, clDialectName.getValue());
if (!clDialectExtensionName.empty())
os << formatv(dialectExtensionTemplate, clDialectName.getValue());
else
More information about the Mlir-commits
mailing list