Skip to content
This repository was archived by the owner on Oct 11, 2025. It is now read-only.

Commit 569b6cd

Browse files
authored
[mlir][llvmir][reland] expose Type(To/From)LLVMIRTranslator C API (#125110)
1 parent 361d86f commit 569b6cd

File tree

5 files changed

+97
-3
lines changed

5 files changed

+97
-3
lines changed

mlir/include/mlir-c/Dialect/LLVM.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ MLIR_CAPI_EXPORTED intptr_t mlirLLVMFunctionTypeGetNumInputs(MlirType type);
5252
MLIR_CAPI_EXPORTED MlirType mlirLLVMFunctionTypeGetInput(MlirType type,
5353
intptr_t pos);
5454

55+
/// Returns the return type of the function type.
56+
MLIR_CAPI_EXPORTED MlirType mlirLLVMFunctionTypeGetReturnType(MlirType type);
57+
5558
/// Returns `true` if the type is an LLVM dialect struct type.
5659
MLIR_CAPI_EXPORTED bool mlirTypeIsALLVMStructType(MlirType type);
5760

mlir/include/mlir-c/Target/LLVMIR.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "mlir-c/IR.h"
1818
#include "mlir-c/Support.h"
19+
#include "llvm-c/Core.h"
1920
#include "llvm-c/Support.h"
2021

2122
#ifdef __cplusplus
@@ -32,6 +33,48 @@ extern "C" {
3233
MLIR_CAPI_EXPORTED LLVMModuleRef
3334
mlirTranslateModuleToLLVMIR(MlirOperation module, LLVMContextRef context);
3435

36+
struct MlirTypeFromLLVMIRTranslator {
37+
void *ptr;
38+
};
39+
40+
typedef struct MlirTypeFromLLVMIRTranslator MlirTypeFromLLVMIRTranslator;
41+
42+
/// Create an LLVM::TypeFromLLVMIRTranslator and transfer ownership to the
43+
/// caller.
44+
MLIR_CAPI_EXPORTED MlirTypeFromLLVMIRTranslator
45+
mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx);
46+
47+
/// Takes an LLVM::TypeFromLLVMIRTranslator owned by the caller and destroys it.
48+
/// It is the responsibility of the user to only pass an
49+
/// LLVM::TypeFromLLVMIRTranslator class.
50+
MLIR_CAPI_EXPORTED void
51+
mlirTypeFromLLVMIRTranslatorDestroy(MlirTypeFromLLVMIRTranslator translator);
52+
53+
/// Translates the given LLVM IR type to the MLIR LLVM dialect.
54+
MLIR_CAPI_EXPORTED MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
55+
MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType);
56+
57+
struct MlirTypeToLLVMIRTranslator {
58+
void *ptr;
59+
};
60+
61+
typedef struct MlirTypeToLLVMIRTranslator MlirTypeToLLVMIRTranslator;
62+
63+
/// Create an LLVM::TypeToLLVMIRTranslator and transfer ownership to the
64+
/// caller.
65+
MLIR_CAPI_EXPORTED MlirTypeToLLVMIRTranslator
66+
mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx);
67+
68+
/// Takes an LLVM::TypeToLLVMIRTranslator owned by the caller and destroys it.
69+
/// It is the responsibility of the user to only pass an
70+
/// LLVM::TypeToLLVMIRTranslator class.
71+
MLIR_CAPI_EXPORTED void
72+
mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator);
73+
74+
/// Translates the given MLIR LLVM dialect to the LLVM IR type.
75+
MLIR_CAPI_EXPORTED LLVMTypeRef mlirTypeToLLVMIRTranslatorTranslateType(
76+
MlirTypeToLLVMIRTranslator translator, MlirType mlirType);
77+
3578
#ifdef __cplusplus
3679
}
3780
#endif

mlir/lib/CAPI/Dialect/LLVM.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ MlirType mlirLLVMFunctionTypeGetInput(MlirType type, intptr_t pos) {
6565
.getParamType(static_cast<unsigned>(pos)));
6666
}
6767

68+
MlirType mlirLLVMFunctionTypeGetReturnType(MlirType type) {
69+
return wrap(llvm::cast<LLVM::LLVMFunctionType>(unwrap(type)).getReturnType());
70+
}
71+
6872
bool mlirTypeIsALLVMStructType(MlirType type) {
6973
return isa<LLVM::LLVMStructType>(unwrap(type));
7074
}

mlir/lib/CAPI/Target/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ add_mlir_upstream_c_api_library(MLIRCAPITarget
88
MLIRToLLVMIRTranslationRegistration
99
MLIRCAPIIR
1010
MLIRLLVMToLLVMIRTranslation
11+
MLIRLLVMIRToLLVMTranslation
1112
MLIRSupport
1213
)

mlir/lib/CAPI/Target/LLVMIR.cpp

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,15 @@
88
//===----------------------------------------------------------------------===//
99

1010
#include "mlir-c/Target/LLVMIR.h"
11-
#include "llvm-c/Support.h"
1211

1312
#include "llvm/IR/LLVMContext.h"
1413
#include "llvm/IR/Module.h"
15-
#include <memory>
14+
#include "llvm/IR/Type.h"
1615

1716
#include "mlir/CAPI/IR.h"
18-
#include "mlir/CAPI/Support.h"
1917
#include "mlir/CAPI/Wrap.h"
2018
#include "mlir/Target/LLVMIR/ModuleTranslation.h"
19+
#include "mlir/Target/LLVMIR/TypeFromLLVM.h"
2120

2221
using namespace mlir;
2322

@@ -34,3 +33,47 @@ LLVMModuleRef mlirTranslateModuleToLLVMIR(MlirOperation module,
3433

3534
return moduleRef;
3635
}
36+
37+
DEFINE_C_API_PTR_METHODS(MlirTypeFromLLVMIRTranslator,
38+
mlir::LLVM::TypeFromLLVMIRTranslator)
39+
40+
MlirTypeFromLLVMIRTranslator
41+
mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx) {
42+
MLIRContext *context = unwrap(ctx);
43+
auto *translator = new LLVM::TypeFromLLVMIRTranslator(*context);
44+
return wrap(translator);
45+
}
46+
47+
void mlirTypeFromLLVMIRTranslatorDestroy(
48+
MlirTypeFromLLVMIRTranslator translator) {
49+
delete static_cast<LLVM::TypeFromLLVMIRTranslator *>(unwrap(translator));
50+
}
51+
52+
MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
53+
MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType) {
54+
LLVM::TypeFromLLVMIRTranslator *translator_ = unwrap(translator);
55+
mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));
56+
return wrap(type);
57+
}
58+
59+
DEFINE_C_API_PTR_METHODS(MlirTypeToLLVMIRTranslator,
60+
mlir::LLVM::TypeToLLVMIRTranslator)
61+
62+
MlirTypeToLLVMIRTranslator
63+
mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx) {
64+
llvm::LLVMContext *context = llvm::unwrap(ctx);
65+
auto *translator = new LLVM::TypeToLLVMIRTranslator(*context);
66+
return wrap(translator);
67+
}
68+
69+
void mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator) {
70+
delete static_cast<LLVM::TypeToLLVMIRTranslator *>(unwrap(translator));
71+
}
72+
73+
LLVMTypeRef
74+
mlirTypeToLLVMIRTranslatorTranslateType(MlirTypeToLLVMIRTranslator translator,
75+
MlirType mlirType) {
76+
LLVM::TypeToLLVMIRTranslator *translator_ = unwrap(translator);
77+
llvm::Type *type = translator_->translateType(unwrap(mlirType));
78+
return llvm::wrap(type);
79+
}

0 commit comments

Comments
 (0)