//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements lowering of CIR attributes and operations directly to // LLVMIR. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/IR/DialectRegistry.h" #include "mlir/Target/LLVMIR/LLVMTranslationInterface.h" #include "mlir/Target/LLVMIR/ModuleTranslation.h" #include "clang/CIR/Dialect/IR/CIRAttrs.h" #include "clang/CIR/Dialect/IR/CIRDialect.h" #include "clang/CIR/MissingFeatures.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/IR/Constant.h" #include "llvm/IR/GlobalVariable.h" using namespace llvm; namespace cir { namespace direct { /// Implementation of the dialect interface that converts CIR attributes to LLVM /// IR metadata. class CIRDialectLLVMIRTranslationInterface : public mlir::LLVMTranslationDialectInterface { public: using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface; /// Translates the given operation to LLVM IR using the provided IR builder /// and saving the state in `moduleTranslation`. mlir::LogicalResult convertOperation( mlir::Operation *op, llvm::IRBuilderBase &builder, mlir::LLVM::ModuleTranslation &moduleTranslation) const final { if (auto cirOp = llvm::dyn_cast(op)) moduleTranslation.mapValue(cirOp.getResult()) = llvm::Constant::getNullValue( moduleTranslation.convertType(cirOp.getType())); return mlir::success(); } }; void registerCIRDialectTranslation(mlir::DialectRegistry ®istry) { registry.insert(); registry.addExtension(+[](mlir::MLIRContext *ctx, cir::CIRDialect *dialect) { dialect->addInterfaces(); }); } } // namespace direct } // namespace cir namespace mlir { void registerCIRDialectTranslation(mlir::MLIRContext &context) { mlir::DialectRegistry registry; cir::direct::registerCIRDialectTranslation(registry); context.appendDialectRegistry(registry); } } // namespace mlir