89 lines · cpp
1//===-- LLVMIR.h - C Interface for MLIR LLVMIR Target ---------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM4// Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#include "mlir-c/Target/LLVMIR.h"11 12#include "llvm/IR/LLVMContext.h"13#include "llvm/IR/Module.h"14#include "llvm/IR/Type.h"15 16#include "mlir/CAPI/IR.h"17#include "mlir/CAPI/Wrap.h"18#include "mlir/Target/LLVMIR/ModuleTranslation.h"19#include "mlir/Target/LLVMIR/TypeFromLLVM.h"20 21using namespace mlir;22 23LLVMModuleRef mlirTranslateModuleToLLVMIR(MlirOperation module,24 LLVMContextRef context) {25 Operation *moduleOp = unwrap(module);26 27 llvm::LLVMContext *ctx = llvm::unwrap(context);28 29 std::unique_ptr<llvm::Module> llvmModule =30 mlir::translateModuleToLLVMIR(moduleOp, *ctx);31 32 LLVMModuleRef moduleRef = llvm::wrap(llvmModule.release());33 34 return moduleRef;35}36 37char *mlirTranslateModuleToLLVMIRToString(MlirOperation module) {38 LLVMContextRef llvmCtx = LLVMContextCreate();39 LLVMModuleRef llvmModule = mlirTranslateModuleToLLVMIR(module, llvmCtx);40 char *llvmir = LLVMPrintModuleToString(llvmModule);41 LLVMDisposeModule(llvmModule);42 LLVMContextDispose(llvmCtx);43 return llvmir;44}45 46DEFINE_C_API_PTR_METHODS(MlirTypeFromLLVMIRTranslator,47 mlir::LLVM::TypeFromLLVMIRTranslator)48 49MlirTypeFromLLVMIRTranslator50mlirTypeFromLLVMIRTranslatorCreate(MlirContext ctx) {51 MLIRContext *context = unwrap(ctx);52 auto *translator = new LLVM::TypeFromLLVMIRTranslator(*context);53 return wrap(translator);54}55 56void mlirTypeFromLLVMIRTranslatorDestroy(57 MlirTypeFromLLVMIRTranslator translator) {58 delete static_cast<LLVM::TypeFromLLVMIRTranslator *>(unwrap(translator));59}60 61MlirType mlirTypeFromLLVMIRTranslatorTranslateType(62 MlirTypeFromLLVMIRTranslator translator, LLVMTypeRef llvmType) {63 LLVM::TypeFromLLVMIRTranslator *translator_ = unwrap(translator);64 mlir::Type type = translator_->translateType(llvm::unwrap(llvmType));65 return wrap(type);66}67 68DEFINE_C_API_PTR_METHODS(MlirTypeToLLVMIRTranslator,69 mlir::LLVM::TypeToLLVMIRTranslator)70 71MlirTypeToLLVMIRTranslator72mlirTypeToLLVMIRTranslatorCreate(LLVMContextRef ctx) {73 llvm::LLVMContext *context = llvm::unwrap(ctx);74 auto *translator = new LLVM::TypeToLLVMIRTranslator(*context);75 return wrap(translator);76}77 78void mlirTypeToLLVMIRTranslatorDestroy(MlirTypeToLLVMIRTranslator translator) {79 delete static_cast<LLVM::TypeToLLVMIRTranslator *>(unwrap(translator));80}81 82LLVMTypeRef83mlirTypeToLLVMIRTranslatorTranslateType(MlirTypeToLLVMIRTranslator translator,84 MlirType mlirType) {85 LLVM::TypeToLLVMIRTranslator *translator_ = unwrap(translator);86 llvm::Type *type = translator_->translateType(unwrap(mlirType));87 return llvm::wrap(type);88}89