[Mlir-commits] [mlir] [mlir-c] Add mlirIRDLLoadDialects (PR #89949)

Paul Berg llvmlistbot at llvm.org
Wed Apr 24 09:38:41 PDT 2024


https://github.com/Pangoraw created https://github.com/llvm/llvm-project/pull/89949

This allows C-API users to load IRDL dialects.

I noticed in https://github.com/llvm/llvm-project/pull/86329 that `MlirModule` is being depriviledged in favour of `MlirOperation` so I am not sure if I need to change the signature of `mlirIRDLLoadDialects` to `mlirIRDLLoadDialects(MlirOperation)`.

>From 32ce76b800709ca2fb62cd12676e6445e471b3ac Mon Sep 17 00:00:00 2001
From: Paul Berg <paul at plutojl.org>
Date: Wed, 24 Apr 2024 09:55:28 +0200
Subject: [PATCH] [mlir-c] Add mlirIRDLLoadDialects

---
 mlir/include/mlir-c/Dialect/IRDL.h   | 28 +++++++++++
 mlir/lib/CAPI/Dialect/CMakeLists.txt |  9 ++++
 mlir/lib/CAPI/Dialect/IRDL.cpp       | 20 ++++++++
 mlir/test/CAPI/CMakeLists.txt        |  8 ++++
 mlir/test/CAPI/irdl.c                | 69 ++++++++++++++++++++++++++++
 5 files changed, 134 insertions(+)
 create mode 100644 mlir/include/mlir-c/Dialect/IRDL.h
 create mode 100644 mlir/lib/CAPI/Dialect/IRDL.cpp
 create mode 100644 mlir/test/CAPI/irdl.c

diff --git a/mlir/include/mlir-c/Dialect/IRDL.h b/mlir/include/mlir-c/Dialect/IRDL.h
new file mode 100644
index 00000000000000..774fa8f7747c21
--- /dev/null
+++ b/mlir/include/mlir-c/Dialect/IRDL.h
@@ -0,0 +1,28 @@
+//===-- mlir-c/Dialect/IRDL.h - C API for IRDL 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_C_DIALECT_IRDL_H
+#define MLIR_C_DIALECT_IRDL_H
+
+#include "mlir-c/IR.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(IRDL, irdl);
+
+/// Load all the dialects defined in the module.
+MLIR_CAPI_EXPORTED MlirLogicalResult mlirIRDLLoadDialects(MlirModule module);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLIR_C_DIALECT_IRDL_H
diff --git a/mlir/lib/CAPI/Dialect/CMakeLists.txt b/mlir/lib/CAPI/Dialect/CMakeLists.txt
index 58b8739043f9df..3106318babb1fd 100644
--- a/mlir/lib/CAPI/Dialect/CMakeLists.txt
+++ b/mlir/lib/CAPI/Dialect/CMakeLists.txt
@@ -40,6 +40,15 @@ add_mlir_upstream_c_api_library(MLIRCAPIControlFlow
   MLIRControlFlowDialect
 )
 
+add_mlir_upstream_c_api_library(MLIRCAPIIRDL
+  IRDL.cpp
+
+  PARTIAL_SOURCES_INTENDED
+  LINK_LIBS PUBLIC
+  MLIRCAPIIR
+  MLIRIRDL
+)
+
 add_mlir_upstream_c_api_library(MLIRCAPIMath
   Math.cpp
 
diff --git a/mlir/lib/CAPI/Dialect/IRDL.cpp b/mlir/lib/CAPI/Dialect/IRDL.cpp
new file mode 100644
index 00000000000000..757aba3c795354
--- /dev/null
+++ b/mlir/lib/CAPI/Dialect/IRDL.cpp
@@ -0,0 +1,20 @@
+//===- IRDL.cpp - C Interface for IRDL 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/IRDL.h"
+#include "mlir/CAPI/Registration.h"
+#include "mlir/Dialect/IRDL/IR/IRDL.h"
+#include "mlir/Dialect/IRDL/IRDLLoading.h"
+
+using namespace mlir;
+
+MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(IRDL, irdl, irdl::IRDLDialect)
+
+extern "C" MlirLogicalResult mlirIRDLLoadDialects(MlirModule module) {
+  return wrap(irdl::loadDialects(unwrap(module)));
+}
diff --git a/mlir/test/CAPI/CMakeLists.txt b/mlir/test/CAPI/CMakeLists.txt
index b9cd63ef7c673d..a20990812e289a 100644
--- a/mlir/test/CAPI/CMakeLists.txt
+++ b/mlir/test/CAPI/CMakeLists.txt
@@ -38,6 +38,14 @@ _add_capi_test_executable(mlir-capi-ir-test
     MLIRCAPIRegisterEverything
 )
 
+_add_capi_test_executable(mlir-capi-irdl-test
+  irdl.c
+  LINK_LIBS PRIVATE
+    MLIRCAPIIR
+    MLIRCAPIIRDL
+    MLIRCAPIRegisterEverything
+)
+
 _add_capi_test_executable(mlir-capi-llvm-test
   llvm.c
   LINK_LIBS PRIVATE
diff --git a/mlir/test/CAPI/irdl.c b/mlir/test/CAPI/irdl.c
new file mode 100644
index 00000000000000..a7d79c6d541b62
--- /dev/null
+++ b/mlir/test/CAPI/irdl.c
@@ -0,0 +1,69 @@
+//===- irdl.c - Test of IRDL dialect C API --------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// RUN: mlir-capi-irdl-test 2>&1 | FileCheck %s
+
+#include "mlir-c/Dialect/IRDL.h"
+#include "mlir-c/IR.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+// CHECK-LABEL: testLoadDialect
+int testLoadDialect(MlirContext ctx) {
+  fprintf(stderr, "testLoadDialect\n");
+
+  const char *moduleString = "irdl.dialect @cmath {"
+                             "  irdl.type @complex {"
+                             "    %0 = irdl.is f32"
+                             "    %1 = irdl.is f64"
+                             "    %2 = irdl.any_of(%0, %1)"
+                             "    irdl.parameters(%2)"
+                             "  }"
+                             "  irdl.operation @mul {"
+                             "    %0 = irdl.is f32"
+                             "    %1 = irdl.is f64"
+                             "    %2 = irdl.any_of(%0, %1)"
+                             "    %3 = irdl.parametric @complex<%2>"
+                             "    irdl.operands(%3, %3)"
+                             "    irdl.results(%3)"
+                             "  }"
+                             "}";
+
+  MlirModule module =
+      mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(moduleString));
+
+  if (mlirModuleIsNull(module))
+    return 1;
+
+  MlirLogicalResult result = mlirIRDLLoadDialects(module);
+  if (mlirLogicalResultIsFailure(result))
+    return 2;
+
+  if (!mlirContextIsRegisteredOperation(
+          ctx, mlirStringRefCreateFromCString("cmath.mul")))
+    return 3;
+
+  mlirModuleDestroy(module);
+
+  return 0;
+}
+
+int main(void) {
+  MlirContext ctx = mlirContextCreate();
+  if (mlirContextIsNull(ctx))
+    return 1;
+  mlirDialectHandleRegisterDialect(mlirGetDialectHandle__irdl__(), ctx);
+  int result = testLoadDialect(ctx);
+  mlirContextDestroy(ctx);
+  if (result)
+    return result;
+
+  return EXIT_SUCCESS;
+}



More information about the Mlir-commits mailing list