14529797aSMehdi Amini //===- ToLLVMInterface.cpp - MLIR LLVM Conversion -------------------------===// 24529797aSMehdi Amini // 34529797aSMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44529797aSMehdi Amini // See https://llvm.org/LICENSE.txt for license information. 54529797aSMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64529797aSMehdi Amini // 74529797aSMehdi Amini //===----------------------------------------------------------------------===// 84529797aSMehdi Amini 94529797aSMehdi Amini #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h" 104529797aSMehdi Amini #include "mlir/IR/Dialect.h" 114529797aSMehdi Amini #include "mlir/IR/Operation.h" 124529797aSMehdi Amini #include "llvm/ADT/DenseSet.h" 134529797aSMehdi Amini 144529797aSMehdi Amini using namespace mlir; 154529797aSMehdi Amini 16876a480cSMatthias Springer void mlir::populateConversionTargetFromOperation( 17876a480cSMatthias Springer Operation *root, ConversionTarget &target, LLVMTypeConverter &typeConverter, 184529797aSMehdi Amini RewritePatternSet &patterns) { 194529797aSMehdi Amini DenseSet<Dialect *> dialects; 204529797aSMehdi Amini root->walk([&](Operation *op) { 214529797aSMehdi Amini Dialect *dialect = op->getDialect(); 224529797aSMehdi Amini if (!dialects.insert(dialect).second) 234529797aSMehdi Amini return; 244529797aSMehdi Amini // First time we encounter this dialect: if it implements the interface, 254529797aSMehdi Amini // let's populate patterns ! 26ad7937d3SMehdi Amini auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect); 274529797aSMehdi Amini if (!iface) 284529797aSMehdi Amini return; 29876a480cSMatthias Springer iface->populateConvertToLLVMConversionPatterns(target, typeConverter, 30876a480cSMatthias Springer patterns); 314529797aSMehdi Amini }); 324529797aSMehdi Amini } 33*7498eaa9SFabian Mora 34*7498eaa9SFabian Mora void mlir::populateOpConvertToLLVMConversionPatterns( 35*7498eaa9SFabian Mora Operation *op, ConversionTarget &target, LLVMTypeConverter &typeConverter, 36*7498eaa9SFabian Mora RewritePatternSet &patterns) { 37*7498eaa9SFabian Mora auto iface = dyn_cast<ConvertToLLVMOpInterface>(op); 38*7498eaa9SFabian Mora if (!iface) 39*7498eaa9SFabian Mora iface = op->getParentOfType<ConvertToLLVMOpInterface>(); 40*7498eaa9SFabian Mora if (!iface) 41*7498eaa9SFabian Mora return; 42*7498eaa9SFabian Mora SmallVector<ConvertToLLVMAttrInterface, 12> attrs; 43*7498eaa9SFabian Mora iface.getConvertToLLVMConversionAttrs(attrs); 44*7498eaa9SFabian Mora for (ConvertToLLVMAttrInterface attr : attrs) 45*7498eaa9SFabian Mora attr.populateConvertToLLVMConversionPatterns(target, typeConverter, 46*7498eaa9SFabian Mora patterns); 47*7498eaa9SFabian Mora } 48*7498eaa9SFabian Mora 49*7498eaa9SFabian Mora #include "mlir/Conversion/ConvertToLLVM/ToLLVMAttrInterface.cpp.inc" 50*7498eaa9SFabian Mora 51*7498eaa9SFabian Mora #include "mlir/Conversion/ConvertToLLVM/ToLLVMOpInterface.cpp.inc" 52