Skip to content

Commit 7ae964c

Browse files
authored
[mlir][llvmir] expose Type(To/From)LLVMIRTranslator C API (#124864)
1 parent 1128343 commit 7ae964c

File tree

5 files changed

+123
-3
lines changed

5 files changed

+123
-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/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+
}

mlir/test/CAPI/translation.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,38 @@ static void testToLLVMIR(MlirContext ctx) {
5858
LLVMContextDispose(llvmCtx);
5959
}
6060

61+
// CHECK-LABEL: testTypeToFromLLVMIRTranslator
62+
static void testTypeToFromLLVMIRTranslator(MlirContext ctx) {
63+
fprintf(stderr, "testTypeToFromLLVMIRTranslator\n");
64+
LLVMContextRef llvmCtx = LLVMContextCreate();
65+
66+
LLVMTypeRef llvmTy = LLVMInt32TypeInContext(llvmCtx);
67+
MlirTypeFromLLVMIRTranslator fromLLVMTranslator =
68+
mlirTypeFromLLVMIRTranslatorCreate(ctx);
69+
MlirType mlirTy =
70+
mlirTypeFromLLVMIRTranslatorTranslateType(fromLLVMTranslator, llvmTy);
71+
// CHECK: i32
72+
mlirTypeDump(mlirTy);
73+
74+
MlirTypeToLLVMIRTranslator toLLVMTranslator =
75+
mlirTypeToLLVMIRTranslatorCreate(llvmCtx);
76+
LLVMTypeRef llvmTy2 =
77+
mlirTypeToLLVMIRTranslatorTranslateType(toLLVMTranslator, mlirTy);
78+
// CHECK: i32
79+
LLVMDumpType(llvmTy2);
80+
fprintf(stderr, "\n");
81+
82+
mlirTypeFromLLVMIRTranslatorDestroy(fromLLVMTranslator);
83+
mlirTypeToLLVMIRTranslatorDestroy(toLLVMTranslator);
84+
LLVMContextDispose(llvmCtx);
85+
}
86+
6187
int main(void) {
6288
MlirContext ctx = mlirContextCreate();
6389
mlirDialectHandleRegisterDialect(mlirGetDialectHandle__llvm__(), ctx);
6490
mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("llvm"));
6591
testToLLVMIR(ctx);
92+
testTypeToFromLLVMIRTranslator(ctx);
6693
mlirContextDestroy(ctx);
6794
return 0;
6895
}

0 commit comments

Comments
 (0)