[Mlir-commits] [mlir] [mlir][llvmir] expose TypeFromLLVMIRTranslator (PR #124864)

Maksim Levental llvmlistbot at llvm.org
Wed Jan 29 17:29:24 PST 2025


https://github.com/makslevental updated https://github.com/llvm/llvm-project/pull/124864

>From 473dd7a95a31bf9bc388879b272d2a69b328f9ff Mon Sep 17 00:00:00 2001
From: max <maksim.levental at gmail.com>
Date: Tue, 28 Jan 2025 19:37:34 -0500
Subject: [PATCH 1/4] [mlir][llvmir] expose TypeFromLLVMIRTranslator

---
 mlir/include/mlir-c/Target/LLVMIR.h | 20 ++++++++++++++++++++
 mlir/lib/CAPI/Target/LLVMIR.cpp     | 19 ++++++++++++++++---
 mlir/test/CAPI/translation.c        | 17 +++++++++++++++++
 3 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/mlir/include/mlir-c/Target/LLVMIR.h b/mlir/include/mlir-c/Target/LLVMIR.h
index effa74b905ce66..28b497f5d8d832 100644
--- a/mlir/include/mlir-c/Target/LLVMIR.h
+++ b/mlir/include/mlir-c/Target/LLVMIR.h
@@ -16,6 +16,8 @@
 
 #include "mlir-c/IR.h"
 #include "mlir-c/Support.h"
+#include "mlir/CAPI/Wrap.h"
+#include "mlir/Target/LLVMIR/TypeFromLLVM.h"
 #include "llvm-c/Support.h"
 
 #ifdef __cplusplus
@@ -32,6 +34,24 @@ extern "C" {
 MLIR_CAPI_EXPORTED LLVMModuleRef
 mlirTranslateModuleToLLVMIR(MlirOperation module, LLVMContextRef context);
 
+struct MlirTypeFromLLVMIRTranslator {
+  void *ptr;
+};
+
+typedef struct MlirTypeFromLLVMIRTranslator MlirTypeFromLLVMIRTranslator;
+
+DEFINE_C_API_PTR_METHODS(MlirTypeFromLLVMIRTranslator,
+                         mlir::LLVM::TypeFromLLVMIRTranslator);
+
+MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
+mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
+
+MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
+mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
+
+MLIR_CAPI_EXPORTED MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
+    MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/mlir/lib/CAPI/Target/LLVMIR.cpp b/mlir/lib/CAPI/Target/LLVMIR.cpp
index dc798372be7467..6606e2376e0d1e 100644
--- a/mlir/lib/CAPI/Target/LLVMIR.cpp
+++ b/mlir/lib/CAPI/Target/LLVMIR.cpp
@@ -8,16 +8,15 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir-c/Target/LLVMIR.h"
-#include "llvm-c/Support.h"
 
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
-#include <memory>
+#include "llvm/IR/Type.h"
 
 #include "mlir/CAPI/IR.h"
-#include "mlir/CAPI/Support.h"
 #include "mlir/CAPI/Wrap.h"
 #include "mlir/Target/LLVMIR/ModuleTranslation.h"
+#include "mlir/Target/LLVMIR/TypeFromLLVM.h"
 
 using namespace mlir;
 
@@ -34,3 +33,17 @@ LLVMModuleRef mlirTranslateModuleToLLVMIR(MlirOperation module,
 
   return moduleRef;
 }
+
+MlirTypeFromLLVMIRTranslator
+mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx) {
+  MLIRContext *context = unwrap(ctx);
+  auto *translator = new LLVM::TypeFromLLVMIRTranslator(*context);
+  return wrap(translator);
+}
+
+MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
+    MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType) {
+  LLVM::TypeFromLLVMIRTranslator *translator_ = unwrap(translator);
+  mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));
+  return wrap(type);
+}
\ No newline at end of file
diff --git a/mlir/test/CAPI/translation.c b/mlir/test/CAPI/translation.c
index c9233d95fd5120..ddbf217c1d9862 100644
--- a/mlir/test/CAPI/translation.c
+++ b/mlir/test/CAPI/translation.c
@@ -58,11 +58,28 @@ static void testToLLVMIR(MlirContext ctx) {
   LLVMContextDispose(llvmCtx);
 }
 
+// CHECK-LABEL: testTypeFromLLVMIRTranslator
+static void testTypeFromLLVMIRTranslator(MlirContext ctx) {
+  fprintf(stderr, "testTypeFromLLVMIRTranslator\n");
+  LLVMContextRef llvmCtx = LLVMContextCreate();
+
+  LLVMTypeRef llvmTy = LLVMInt32TypeInContext(llvmCtx);
+  MlirTypeFromLLVMIRTranslator translator =
+      mlirTypeFromLLVMIRTranslatorCreate(ctx);
+  MlirType mlirTy =
+      mlirTypeFromLLVMIRTranslatorTranslateType(translator, llvmTy);
+  // CHECK: i32
+  mlirTypeDump(mlirTy);
+
+  LLVMContextDispose(llvmCtx);
+}
+
 int main(void) {
   MlirContext ctx = mlirContextCreate();
   mlirDialectHandleRegisterDialect(mlirGetDialectHandle__llvm__(), ctx);
   mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("llvm"));
   testToLLVMIR(ctx);
+  testTypeFromLLVMIRTranslator(ctx);
   mlirContextDestroy(ctx);
   return 0;
 }

>From d2eab6ee70235a4837fcbc2f2de1519a03050827 Mon Sep 17 00:00:00 2001
From: max <maksim.levental at gmail.com>
Date: Tue, 28 Jan 2025 20:00:40 -0500
Subject: [PATCH 2/4] [mlir][llvmir] expose TypeFromLLVMIRTranslator

---
 mlir/include/mlir-c/Target/LLVMIR.h | 5 -----
 mlir/lib/CAPI/Target/LLVMIR.cpp     | 3 +++
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/mlir/include/mlir-c/Target/LLVMIR.h b/mlir/include/mlir-c/Target/LLVMIR.h
index 28b497f5d8d832..90204626013952 100644
--- a/mlir/include/mlir-c/Target/LLVMIR.h
+++ b/mlir/include/mlir-c/Target/LLVMIR.h
@@ -16,8 +16,6 @@
 
 #include "mlir-c/IR.h"
 #include "mlir-c/Support.h"
-#include "mlir/CAPI/Wrap.h"
-#include "mlir/Target/LLVMIR/TypeFromLLVM.h"
 #include "llvm-c/Support.h"
 
 #ifdef __cplusplus
@@ -40,9 +38,6 @@ struct MlirTypeFromLLVMIRTranslator {
 
 typedef struct MlirTypeFromLLVMIRTranslator MlirTypeFromLLVMIRTranslator;
 
-DEFINE_C_API_PTR_METHODS(MlirTypeFromLLVMIRTranslator,
-                         mlir::LLVM::TypeFromLLVMIRTranslator);
-
 MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
 mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
 
diff --git a/mlir/lib/CAPI/Target/LLVMIR.cpp b/mlir/lib/CAPI/Target/LLVMIR.cpp
index 6606e2376e0d1e..7d81b490ed0c7b 100644
--- a/mlir/lib/CAPI/Target/LLVMIR.cpp
+++ b/mlir/lib/CAPI/Target/LLVMIR.cpp
@@ -34,6 +34,9 @@ LLVMModuleRef mlirTranslateModuleToLLVMIR(MlirOperation module,
   return moduleRef;
 }
 
+DEFINE_C_API_PTR_METHODS(MlirTypeFromLLVMIRTranslator,
+                         mlir::LLVM::TypeFromLLVMIRTranslator);
+
 MlirTypeFromLLVMIRTranslator
 mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx) {
   MLIRContext *context = unwrap(ctx);

>From 1c51d3ffbdcea07e04b90b428897def71bd17eec Mon Sep 17 00:00:00 2001
From: max <maksim.levental at gmail.com>
Date: Wed, 29 Jan 2025 20:14:03 -0500
Subject: [PATCH 3/4] comments

---
 mlir/include/mlir-c/Target/LLVMIR.h | 10 ++++++++--
 mlir/lib/CAPI/Target/LLVMIR.cpp     |  7 ++++++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/mlir/include/mlir-c/Target/LLVMIR.h b/mlir/include/mlir-c/Target/LLVMIR.h
index 90204626013952..94663574eac038 100644
--- a/mlir/include/mlir-c/Target/LLVMIR.h
+++ b/mlir/include/mlir-c/Target/LLVMIR.h
@@ -38,12 +38,18 @@ struct MlirTypeFromLLVMIRTranslator {
 
 typedef struct MlirTypeFromLLVMIRTranslator MlirTypeFromLLVMIRTranslator;
 
+/// Create an LLVM::TypeFromLLVMIRTranslator and transfer ownership to the
+/// caller.
 MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
 mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
 
-MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
-mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
+/// Takes an LLVM::TypeFromLLVMIRTranslator owned by the caller and destroys it.
+/// It is the responsibility of the user to only pass an
+/// LLVM::TypeFromLLVMIRTranslator class.
+MLIR_CAPI_EXPORTED void
+mlirTypeFromLLVMIRTranslatorDestroy(MlirTypeFromLLVMIRTranslator translator);
 
+/// Translates the given LLVM IR type to the MLIR LLVM dialect.
 MLIR_CAPI_EXPORTED MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
     MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType);
 
diff --git a/mlir/lib/CAPI/Target/LLVMIR.cpp b/mlir/lib/CAPI/Target/LLVMIR.cpp
index 7d81b490ed0c7b..5261c8773faf7d 100644
--- a/mlir/lib/CAPI/Target/LLVMIR.cpp
+++ b/mlir/lib/CAPI/Target/LLVMIR.cpp
@@ -44,9 +44,14 @@ mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx) {
   return wrap(translator);
 }
 
+void mlirTypeFromLLVMIRTranslatorDestroy(
+    MlirTypeFromLLVMIRTranslator translator) {
+  delete static_cast<LLVM::TypeFromLLVMIRTranslator *>(unwrap(translator));
+}
+
 MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
     MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType) {
   LLVM::TypeFromLLVMIRTranslator *translator_ = unwrap(translator);
   mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));
   return wrap(type);
-}
\ No newline at end of file
+}

>From 4a32519e4a8773c838e86ab419bf06f6ff8d49e9 Mon Sep 17 00:00:00 2001
From: max <maksim.levental at gmail.com>
Date: Wed, 29 Jan 2025 20:27:37 -0500
Subject: [PATCH 4/4] add ToLLVMIR

---
 mlir/include/mlir-c/Target/LLVMIR.h | 21 +++++++++++++++++++++
 mlir/lib/CAPI/Target/LLVMIR.cpp     | 22 ++++++++++++++++++++++
 mlir/test/CAPI/translation.c        | 13 +++++++++++--
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/mlir/include/mlir-c/Target/LLVMIR.h b/mlir/include/mlir-c/Target/LLVMIR.h
index 94663574eac038..6a026c31d05117 100644
--- a/mlir/include/mlir-c/Target/LLVMIR.h
+++ b/mlir/include/mlir-c/Target/LLVMIR.h
@@ -53,6 +53,27 @@ mlirTypeFromLLVMIRTranslatorDestroy(MlirTypeFromLLVMIRTranslator translator);
 MLIR_CAPI_EXPORTED MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
     MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType);
 
+struct MlirTypeToLLVMIRTranslator {
+  void *ptr;
+};
+
+typedef struct MlirTypeToLLVMIRTranslator MlirTypeToLLVMIRTranslator;
+
+/// Create an LLVM::TypeToLLVMIRTranslator and transfer ownership to the
+/// caller.
+MLIR_CAPI_EXPORTED MlirTypeToLLVMIRTranslator
+mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx);
+
+/// Takes an LLVM::TypeToLLVMIRTranslator owned by the caller and destroys it.
+/// It is the responsibility of the user to only pass an
+/// LLVM::TypeToLLVMIRTranslator class.
+MLIR_CAPI_EXPORTED void
+mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator);
+
+/// Translates the given MLIR LLVM dialect to the LLVM IR type.
+MLIR_CAPI_EXPORTED LLVMTypeRef mlirTypeToLLVMIRTranslatorTranslateType(
+    MlirTypeToLLVMIRTranslator translator, MlirType mlirType);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/mlir/lib/CAPI/Target/LLVMIR.cpp b/mlir/lib/CAPI/Target/LLVMIR.cpp
index 5261c8773faf7d..5e2bba8be45624 100644
--- a/mlir/lib/CAPI/Target/LLVMIR.cpp
+++ b/mlir/lib/CAPI/Target/LLVMIR.cpp
@@ -55,3 +55,25 @@ MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
   mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));
   return wrap(type);
 }
+
+DEFINE_C_API_PTR_METHODS(MlirTypeToLLVMIRTranslator,
+                         mlir::LLVM::TypeToLLVMIRTranslator);
+
+MlirTypeToLLVMIRTranslator
+mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx) {
+  llvm::LLVMContext *context = llvm::unwrap(ctx);
+  auto *translator = new LLVM::TypeToLLVMIRTranslator(*context);
+  return wrap(translator);
+}
+
+void mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator) {
+  delete static_cast<LLVM::TypeToLLVMIRTranslator *>(unwrap(translator));
+}
+
+LLVMTypeRef
+mlirTypeToLLVMIRTranslatorTranslateType(MlirTypeToLLVMIRTranslator translator,
+                                        MlirType mlirType) {
+  LLVM::TypeToLLVMIRTranslator *translator_ = unwrap(translator);
+  llvm::Type *type = translator_->translateType(unwrap(mlirType));
+  return llvm::wrap(type);
+}
diff --git a/mlir/test/CAPI/translation.c b/mlir/test/CAPI/translation.c
index ddbf217c1d9862..a1284bbc95b3d5 100644
--- a/mlir/test/CAPI/translation.c
+++ b/mlir/test/CAPI/translation.c
@@ -64,13 +64,22 @@ static void testTypeFromLLVMIRTranslator(MlirContext ctx) {
   LLVMContextRef llvmCtx = LLVMContextCreate();
 
   LLVMTypeRef llvmTy = LLVMInt32TypeInContext(llvmCtx);
-  MlirTypeFromLLVMIRTranslator translator =
+  MlirTypeFromLLVMIRTranslator fromLLVMTranslator =
       mlirTypeFromLLVMIRTranslatorCreate(ctx);
   MlirType mlirTy =
-      mlirTypeFromLLVMIRTranslatorTranslateType(translator, llvmTy);
+      mlirTypeFromLLVMIRTranslatorTranslateType(fromLLVMTranslator, llvmTy);
   // CHECK: i32
   mlirTypeDump(mlirTy);
 
+  MlirTypeToLLVMIRTranslator toLLVMTranslator =
+      mlirTypeToLLVMIRTranslatorCreate(llvmCtx);
+  LLVMTypeRef llvmTy2 =
+      mlirTypeToLLVMIRTranslatorTranslateType(toLLVMTranslator, mlirTy);
+  // CHECK: i32
+  LLVMDumpType(llvmTy2);
+
+  mlirTypeFromLLVMIRTranslatorDestroy(fromLLVMTranslator);
+  mlirTypeToLLVMIRTranslatorDestroy(toLLVMTranslator);
   LLVMContextDispose(llvmCtx);
 }
 



More information about the Mlir-commits mailing list