xref: /llvm-project/mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h (revision 7498eaa9abf2e4ac0c10fa9a02576d708cc1b624)
1 //===- ToLLVMInterface.h - Conversion to LLVM iface ---*- C++ -*-=============//
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 #ifndef MLIR_CONVERSION_CONVERTTOLLVM_TOLLVMINTERFACE_H
10 #define MLIR_CONVERSION_CONVERTTOLLVM_TOLLVMINTERFACE_H
11 
12 #include "mlir/IR/DialectInterface.h"
13 #include "mlir/IR/MLIRContext.h"
14 #include "mlir/IR/OpDefinition.h"
15 
16 namespace mlir {
17 class ConversionTarget;
18 class LLVMTypeConverter;
19 class MLIRContext;
20 class Operation;
21 class RewritePatternSet;
22 class AnalysisManager;
23 
24 /// Base class for dialect interfaces providing translation to LLVM IR.
25 /// Dialects that can be translated should provide an implementation of this
26 /// interface for the supported operations. The interface may be implemented in
27 /// a separate library to avoid the "main" dialect library depending on LLVM IR.
28 /// The interface can be attached using the delayed registration mechanism
29 /// available in DialectRegistry.
30 class ConvertToLLVMPatternInterface
31     : public DialectInterface::Base<ConvertToLLVMPatternInterface> {
32 public:
33   ConvertToLLVMPatternInterface(Dialect *dialect) : Base(dialect) {}
34 
35   /// Hook for derived dialect interface to load the dialects they
36   /// target. The LLVMDialect is implicitly already loaded, but this
37   /// method allows to load other intermediate dialects used in the
38   /// conversion, or target dialects like NVVM for example.
39   virtual void loadDependentDialects(MLIRContext *context) const {}
40 
41   /// Hook for derived dialect interface to provide conversion patterns
42   /// and mark dialect legal for the conversion target.
43   virtual void populateConvertToLLVMConversionPatterns(
44       ConversionTarget &target, LLVMTypeConverter &typeConverter,
45       RewritePatternSet &patterns) const = 0;
46 };
47 
48 /// Recursively walk the IR and collect all dialects implementing the interface,
49 /// and populate the conversion patterns.
50 void populateConversionTargetFromOperation(Operation *op,
51                                            ConversionTarget &target,
52                                            LLVMTypeConverter &typeConverter,
53                                            RewritePatternSet &patterns);
54 
55 /// Helper function for populating LLVM conversion patterns. If `op` implements
56 /// the `ConvertToLLVMOpInterface` interface, then the LLVM conversion pattern
57 /// attributes provided by the interface will be used to configure the
58 /// conversion target, type converter, and the pattern set.
59 void populateOpConvertToLLVMConversionPatterns(Operation *op,
60                                                ConversionTarget &target,
61                                                LLVMTypeConverter &typeConverter,
62                                                RewritePatternSet &patterns);
63 } // namespace mlir
64 
65 #include "mlir/Conversion/ConvertToLLVM/ToLLVMAttrInterface.h.inc"
66 
67 #include "mlir/Conversion/ConvertToLLVM/ToLLVMOpInterface.h.inc"
68 
69 #endif // MLIR_CONVERSION_CONVERTTOLLVM_TOLLVMINTERFACE_H
70