17 #include "llvm/Support/Debug.h"
21 #define DEBUG_TYPE "convert-to-emitc"
24 #define GEN_PASS_DEF_CONVERTTOEMITC
25 #include "mlir/Conversion/Passes.h.inc"
33 class ConvertToEmitCPassInterface {
37 virtual ~ConvertToEmitCPassInterface() =
default;
45 virtual LogicalResult initialize() = 0;
52 virtual LogicalResult transform(
Operation *op,
60 LogicalResult visitInterfaces(
81 LLVM_DEBUG(llvm::dbgs() <<
"Convert to EmitC extension load\n");
82 for (
Dialect *dialect : dialects) {
83 auto *iface = dyn_cast<ConvertToEmitCPatternInterface>(dialect);
86 LLVM_DEBUG(llvm::dbgs() <<
"Convert to EmitC found dialect interface for "
87 << dialect->getNamespace() <<
"\n");
92 std::unique_ptr<DialectExtensionBase>
clone() const final {
93 return std::make_unique<LoadDependentDialectExtension>(*
this);
103 struct StaticConvertToEmitC :
public ConvertToEmitCPassInterface {
105 std::shared_ptr<const FrozenRewritePatternSet>
patterns;
107 std::shared_ptr<const ConversionTarget> target;
109 std::shared_ptr<const TypeConverter> typeConverter;
110 using ConvertToEmitCPassInterface::ConvertToEmitCPassInterface;
113 LogicalResult initialize() final {
114 auto target = std::make_shared<ConversionTarget>(*context);
115 auto typeConverter = std::make_shared<TypeConverter>();
118 typeConverter->addConversion([](
Type type) -> std::optional<Type> {
125 target->addLegalDialect<emitc::EmitCDialect>();
129 *target, *typeConverter, tempPatterns);
133 std::make_unique<FrozenRewritePatternSet>(std::move(tempPatterns));
134 this->target = target;
135 this->typeConverter = typeConverter;
154 class ConvertToEmitC :
public impl::ConvertToEmitCBase<ConvertToEmitC> {
155 std::shared_ptr<const ConvertToEmitCPassInterface>
impl;
158 using impl::ConvertToEmitCBase<ConvertToEmitC>::ConvertToEmitCBase;
160 ConvertToEmitCPassInterface::getDependentDialects(registry);
163 LogicalResult initialize(
MLIRContext *context)
final {
164 std::shared_ptr<ConvertToEmitCPassInterface>
impl;
165 impl = std::make_shared<StaticConvertToEmitC>(context, filterDialects);
166 if (failed(
impl->initialize()))
172 void runOnOperation() final {
173 if (failed(
impl->transform(getOperation(), getAnalysisManager())))
174 return signalPassFailure();
184 ConvertToEmitCPassInterface::ConvertToEmitCPassInterface(
186 : context(context), filterDialects(filterDialects) {}
188 void ConvertToEmitCPassInterface::getDependentDialects(
190 registry.
insert<emitc::EmitCDialect>();
194 LogicalResult ConvertToEmitCPassInterface::visitInterfaces(
196 if (!filterDialects.empty()) {
200 for (StringRef dialectName : filterDialects) {
201 Dialect *dialect = context->getLoadedDialect(dialectName);
204 <<
"dialect not loaded: " << dialectName <<
"\n";
205 auto *iface = dyn_cast<ConvertToEmitCPatternInterface>(dialect);
208 <<
"dialect does not implement ConvertToEmitCPatternInterface: "
209 << dialectName <<
"\n";
215 for (
Dialect *dialect : context->getLoadedDialects()) {
216 auto *iface = dyn_cast<ConvertToEmitCPatternInterface>(dialect);
#define MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(CLASS_NAME)
This class represents an analysis manager for a particular operation instance.
virtual void populateConvertToEmitCConversionPatterns(ConversionTarget &target, TypeConverter &typeConverter, RewritePatternSet &patterns) const =0
Hook for derived dialect interface to provide conversion patterns and mark dialect legal for the conv...
This class represents an opaque dialect extension.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
void addExtensions()
Add the given extensions to the registry.
Dialects are groups of MLIR operations, types and attributes, as well as behavior associated with the...
MLIRContext is the top-level object for a collection of MLIR operations.
Operation is the basic unit of execution within MLIR.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
bool isSupportedEmitCType(mlir::Type type)
Determines whether type is valid in EmitC.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
const FrozenRewritePatternSet & patterns
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
LogicalResult applyPartialConversion(ArrayRef< Operation * > ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config=ConversionConfig())
Below we define several entry points for operation conversion.