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