xref: /llvm-project/mlir/lib/Conversion/ConvertToLLVM/ToLLVMInterface.cpp (revision 7498eaa9abf2e4ac0c10fa9a02576d708cc1b624)
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