Skip to content

Commit 4a32519

Browse files
committed
add ToLLVMIR
1 parent 1c51d3f commit 4a32519

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,27 @@ mlirTypeFromLLVMIRTranslatorDestroy(MlirTypeFromLLVMIRTranslator translator);
5353
MLIR_CAPI_EXPORTED MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
5454
MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType);
5555

56+
struct MlirTypeToLLVMIRTranslator {
57+
void *ptr;
58+
};
59+
60+
typedef struct MlirTypeToLLVMIRTranslator MlirTypeToLLVMIRTranslator;
61+
62+
/// Create an LLVM::TypeToLLVMIRTranslator and transfer ownership to the
63+
/// caller.
64+
MLIR_CAPI_EXPORTED MlirTypeToLLVMIRTranslator
65+
mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx);
66+
67+
/// Takes an LLVM::TypeToLLVMIRTranslator owned by the caller and destroys it.
68+
/// It is the responsibility of the user to only pass an
69+
/// LLVM::TypeToLLVMIRTranslator class.
70+
MLIR_CAPI_EXPORTED void
71+
mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator);
72+
73+
/// Translates the given MLIR LLVM dialect to the LLVM IR type.
74+
MLIR_CAPI_EXPORTED LLVMTypeRef mlirTypeToLLVMIRTranslatorTranslateType(
75+
MlirTypeToLLVMIRTranslator translator, MlirType mlirType);
76+
5677
#ifdef __cplusplus
5778
}
5879
#endif

mlir/lib/CAPI/Target/LLVMIR.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,25 @@ MlirType mlirTypeFromLLVMIRTranslatorTranslateType(
5555
mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));
5656
return wrap(type);
5757
}
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: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,22 @@ static void testTypeFromLLVMIRTranslator(MlirContext ctx) {
6464
LLVMContextRef llvmCtx = LLVMContextCreate();
6565

6666
LLVMTypeRef llvmTy = LLVMInt32TypeInContext(llvmCtx);
67-
MlirTypeFromLLVMIRTranslator translator =
67+
MlirTypeFromLLVMIRTranslator fromLLVMTranslator =
6868
mlirTypeFromLLVMIRTranslatorCreate(ctx);
6969
MlirType mlirTy =
70-
mlirTypeFromLLVMIRTranslatorTranslateType(translator, llvmTy);
70+
mlirTypeFromLLVMIRTranslatorTranslateType(fromLLVMTranslator, llvmTy);
7171
// CHECK: i32
7272
mlirTypeDump(mlirTy);
7373

74+
MlirTypeToLLVMIRTranslator toLLVMTranslator =
75+
mlirTypeToLLVMIRTranslatorCreate(llvmCtx);
76+
LLVMTypeRef llvmTy2 =
77+
mlirTypeToLLVMIRTranslatorTranslateType(toLLVMTranslator, mlirTy);
78+
// CHECK: i32
79+
LLVMDumpType(llvmTy2);
80+
81+
mlirTypeFromLLVMIRTranslatorDestroy(fromLLVMTranslator);
82+
mlirTypeToLLVMIRTranslatorDestroy(toLLVMTranslator);
7483
LLVMContextDispose(llvmCtx);
7584
}
7685

0 commit comments

Comments
 (0)