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