//===- DialectGen.cpp - MLIR dialect definitions generator ----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // DialectGen uses the description of dialects to generate C++ definitions. // //===----------------------------------------------------------------------===// #include "DialectGenUtilities.h" #include "mlir/TableGen/Class.h" #include "mlir/TableGen/CodeGenHelpers.h" #include "mlir/TableGen/Format.h" #include "mlir/TableGen/GenInfo.h" #include "mlir/TableGen/Interfaces.h" #include "mlir/TableGen/Operator.h" #include "mlir/TableGen/Trait.h" #include "llvm/ADT/Sequence.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Signals.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" #include "llvm/TableGen/TableGenBackend.h" #define DEBUG_TYPE … usingnamespacemlir; usingnamespacemlir::tblgen; Record; RecordKeeper; static llvm::cl::OptionCategory dialectGenCat("Options for -gen-dialect-*"); llvm::cl::opt<std::string> selectedDialect("dialect", llvm::cl::desc("The dialect to gen for"), llvm::cl::cat(dialectGenCat), llvm::cl::CommaSeparated); /// Utility iterator used for filtering records for a specific dialect. namespace { DialectFilterIterator; } // namespace static void populateDiscardableAttributes( Dialect &dialect, llvm::DagInit *discardableAttrDag, SmallVector<std::pair<std::string, std::string>> &discardableAttributes) { … } /// Given a set of records for a T, filter the ones that correspond to /// the given dialect. template <typename T> static iterator_range<DialectFilterIterator> filterForDialect(ArrayRef<Record *> records, Dialect &dialect) { … } std::optional<Dialect> tblgen::findDialectToGenerate(ArrayRef<Dialect> dialects) { … } //===----------------------------------------------------------------------===// // GEN: Dialect declarations //===----------------------------------------------------------------------===// /// The code block for the start of a dialect class declaration. /// /// {0}: The name of the dialect class. /// {1}: The dialect namespace. /// {2}: The dialect parent class. static const char *const dialectDeclBeginStr = …; /// Registration for a single dependent dialect: to be inserted in the ctor /// above for each dependent dialect. const char *const dialectRegistrationTemplate = …; /// The code block for the attribute parser/printer hooks. static const char *const attrParserDecl = …; /// The code block for the type parser/printer hooks. static const char *const typeParserDecl = …; /// The code block for the canonicalization pattern registration hook. static const char *const canonicalizerDecl = …; /// The code block for the constant materializer hook. static const char *const constantMaterializerDecl = …; /// The code block for the operation attribute verifier hook. static const char *const opAttrVerifierDecl = …; /// The code block for the region argument attribute verifier hook. static const char *const regionArgAttrVerifierDecl = …; /// The code block for the region result attribute verifier hook. static const char *const regionResultAttrVerifierDecl = …; /// The code block for the op interface fallback hook. static const char *const operationInterfaceFallbackDecl = …; /// The code block for the discardable attribute helper. static const char *const discardableAttrHelperDecl = …; /// Generate the declaration for the given dialect class. static void emitDialectDecl(Dialect &dialect, raw_ostream &os) { … } static bool emitDialectDecls(const RecordKeeper &records, raw_ostream &os) { … } //===----------------------------------------------------------------------===// // GEN: Dialect definitions //===----------------------------------------------------------------------===// /// The code block to generate a dialect constructor definition. /// /// {0}: The name of the dialect class. /// {1}: Initialization code that is emitted in the ctor body before calling /// initialize(), such as dependent dialect registration. /// {2}: The dialect parent class. /// {3}: Extra members to initialize static const char *const dialectConstructorStr = …; /// The code block to generate a default destructor definition. /// /// {0}: The name of the dialect class. static const char *const dialectDestructorStr = …; static void emitDialectDef(Dialect &dialect, const RecordKeeper &records, raw_ostream &os) { … } static bool emitDialectDefs(const RecordKeeper &records, raw_ostream &os) { … } //===----------------------------------------------------------------------===// // GEN: Dialect registration hooks //===----------------------------------------------------------------------===// static mlir::GenRegistration genDialectDecls("gen-dialect-decls", "Generate dialect declarations", [](const RecordKeeper &records, raw_ostream &os) { … }); static mlir::GenRegistration genDialectDefs("gen-dialect-defs", "Generate dialect definitions", [](const RecordKeeper &records, raw_ostream &os) { … });