diff --git a/mlir/test/mlir-tblgen/attrdefs.td b/mlir/test/mlir-tblgen/attrdefs.td index 35d2c49619ee6..ecb1c93108597 100644 --- a/mlir/test/mlir-tblgen/attrdefs.td +++ b/mlir/test/mlir-tblgen/attrdefs.td @@ -1,5 +1,6 @@ // RUN: mlir-tblgen -gen-attrdef-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL // RUN: mlir-tblgen -gen-attrdef-defs -I %S/../../include %s | FileCheck %s --check-prefix=DEF +// RUN: mlir-tblgen -gen-attrdef-list -I %S/../../include %s | FileCheck %s --check-prefix=LIST include "mlir/IR/AttrTypeBase.td" include "mlir/IR/OpBase.td" @@ -19,6 +20,12 @@ include "mlir/IR/OpBase.td" // DEF: ::test::CompoundAAttr, // DEF: ::test::SingleParameterAttr +// LIST: ATTRDEF(IndexAttr) +// LIST: ATTRDEF(SimpleAAttr) +// LIST: ATTRDEF(CompoundAAttr) +// LIST: ATTRDEF(SingleParameterAttr) + +// LIST: #undef ATTRDEF // DEF-LABEL: ::mlir::OptionalParseResult generatedAttributeParser( // DEF-SAME: ::mlir::AsmParser &parser, // DEF-SAME: ::llvm::StringRef *mnemonic, ::mlir::Type type, diff --git a/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp b/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp index 6a39424bd463f..a5a9a5c559087 100644 --- a/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp +++ b/mlir/tools/mlir-tblgen/AttrOrTypeDefGen.cpp @@ -690,6 +690,7 @@ class DefGenerator { public: bool emitDecls(StringRef selectedDialect); bool emitDefs(StringRef selectedDialect); + bool emitList(StringRef selectedDialect); protected: DefGenerator(ArrayRef defs, raw_ostream &os, @@ -1025,6 +1026,23 @@ bool DefGenerator::emitDefs(StringRef selectedDialect) { return false; } +bool DefGenerator::emitList(StringRef selectedDialect) { + emitSourceFileHeader(("List of " + defType + "Def Definitions").str(), os); + + SmallVector defs; + collectAllDefs(selectedDialect, defRecords, defs); + if (defs.empty()) + return false; + + auto interleaveFn = [&](const AttrOrTypeDef &def) { + os << defType.upper() << "DEF(" << def.getCppClassName() << ")"; + }; + llvm::interleave(defs, os, interleaveFn, "\n"); + os << "\n\n"; + os << "#undef " << defType.upper() << "DEF" << "\n"; + return false; +} + //===----------------------------------------------------------------------===// // Type Constraints //===----------------------------------------------------------------------===// @@ -1099,7 +1117,12 @@ static mlir::GenRegistration AttrDefGenerator generator(records, os); return generator.emitDecls(attrDialect); }); - +static mlir::GenRegistration + genAttrList("gen-attrdef-list", "Generate an AttrDef list", + [](const RecordKeeper &records, raw_ostream &os) { + AttrDefGenerator generator(records, os); + return generator.emitList(attrDialect); + }); //===----------------------------------------------------------------------===// // TypeDef