1 //===- ToLLVMInterface.cpp - MLIR LLVM Conversion -------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h" 10 #include "mlir/IR/Dialect.h" 11 #include "mlir/IR/Operation.h" 12 #include "llvm/ADT/DenseSet.h" 13 14 using namespace mlir; 15 16 void mlir::populateConversionTargetFromOperation( 17 Operation *root, ConversionTarget &target, LLVMTypeConverter &typeConverter, 18 RewritePatternSet &patterns) { 19 DenseSet<Dialect *> dialects; 20 root->walk([&](Operation *op) { 21 Dialect *dialect = op->getDialect(); 22 if (!dialects.insert(dialect).second) 23 return; 24 // First time we encounter this dialect: if it implements the interface, 25 // let's populate patterns ! 26 auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect); 27 if (!iface) 28 return; 29 iface->populateConvertToLLVMConversionPatterns(target, typeConverter, 30 patterns); 31 }); 32 } 33 34 void mlir::populateOpConvertToLLVMConversionPatterns( 35 Operation *op, ConversionTarget &target, LLVMTypeConverter &typeConverter, 36 RewritePatternSet &patterns) { 37 auto iface = dyn_cast<ConvertToLLVMOpInterface>(op); 38 if (!iface) 39 iface = op->getParentOfType<ConvertToLLVMOpInterface>(); 40 if (!iface) 41 return; 42 SmallVector<ConvertToLLVMAttrInterface, 12> attrs; 43 iface.getConvertToLLVMConversionAttrs(attrs); 44 for (ConvertToLLVMAttrInterface attr : attrs) 45 attr.populateConvertToLLVMConversionPatterns(target, typeConverter, 46 patterns); 47 } 48 49 #include "mlir/Conversion/ConvertToLLVM/ToLLVMAttrInterface.cpp.inc" 50 51 #include "mlir/Conversion/ConvertToLLVM/ToLLVMOpInterface.cpp.inc" 52