add_mlir_dialect(AMX amx)
-add_mlir_doc(AMX AMX Dialects/ -gen-dialect-doc)
+add_mlir_doc(AMX AMX Dialects/ -gen-dialect-doc -dialect=amx)
set(LLVM_TARGET_DEFINITIONS AMX.td)
mlir_tablegen(AMXConversions.inc -gen-llvmir-conversions)
add_mlir_dialect(ArmNeon arm_neon)
-add_mlir_doc(ArmNeon ArmNeon Dialects/ -gen-dialect-doc)
+add_mlir_doc(ArmNeon ArmNeon Dialects/ -gen-dialect-doc -dialect=arm_neon)
set(LLVM_TARGET_DEFINITIONS ArmNeon.td)
mlir_tablegen(ArmNeonConversions.inc -gen-llvmir-conversions)
add_mlir_dialect(ArmSVE arm_sve ArmSVE)
-add_mlir_doc(ArmSVE ArmSVE Dialects/ -gen-dialect-doc)
+add_mlir_doc(ArmSVE ArmSVE Dialects/ -gen-dialect-doc -dialect=arm_sve)
set(LLVM_TARGET_DEFINITIONS ArmSVE.td)
mlir_tablegen(ArmSVEConversions.inc -gen-llvmir-conversions)
-// RUN: mlir-tblgen -gen-dialect-doc -I %S/../../include %s | FileCheck %s
+// RUN: mlir-tblgen -gen-dialect-doc -I %S/../../include -dialect=test %s | FileCheck %s
+// RUN: mlir-tblgen -gen-dialect-doc -I %S/../../include -dialect=test_toc %s | FileCheck %s --check-prefix=CHECK_TOC
include "mlir/IR/OpBase.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
}
def BOp : Op<Toc_Dialect, "b", []>;
-// CHECK: Dialect with
-// CHECK: [TOC]
-// CHECK: here.
+// CHECK_TOC: Dialect with
+// CHECK_TOC: [TOC]
+// CHECK_TOC: here.
//
//===----------------------------------------------------------------------===//
+#include "DialectGenUtilities.h"
#include "mlir/TableGen/Class.h"
#include "mlir/TableGen/CodeGenHelpers.h"
#include "mlir/TableGen/Format.h"
DialectFilterIterator(records.end(), records.end(), filterFn)};
}
-static Optional<Dialect>
-findSelectedDialect(ArrayRef<const llvm::Record *> dialectDefs) {
- // Select the dialect to gen for.
- if (dialectDefs.size() == 1 && selectedDialect.getNumOccurrences() == 0) {
- return Dialect(dialectDefs.front());
+Optional<Dialect> tblgen::findDialectToGenerate(ArrayRef<Dialect> dialects) {
+ if (dialects.empty()) {
+ llvm::errs() << "no dialect was found\n";
+ return llvm::None;
}
+ // Select the dialect to gen for.
+ if (dialects.size() == 1 && selectedDialect.getNumOccurrences() == 0)
+ return dialects.front();
+
if (selectedDialect.getNumOccurrences() == 0) {
llvm::errs() << "when more than 1 dialect is present, one must be selected "
"via '-dialect'\n";
return llvm::None;
}
- const auto *dialectIt =
- llvm::find_if(dialectDefs, [](const llvm::Record *def) {
- return Dialect(def).getName() == selectedDialect;
- });
- if (dialectIt == dialectDefs.end()) {
+ const auto *dialectIt = llvm::find_if(dialects, [](const Dialect &dialect) {
+ return dialect.getName() == selectedDialect;
+ });
+ if (dialectIt == dialects.end()) {
llvm::errs() << "selected dialect with '-dialect' does not exist\n";
return llvm::None;
}
- return Dialect(*dialectIt);
+ return *dialectIt;
}
//===----------------------------------------------------------------------===//
if (dialectDefs.empty())
return false;
- Optional<Dialect> dialect = findSelectedDialect(dialectDefs);
+ SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
+ Optional<Dialect> dialect = findDialectToGenerate(dialects);
if (!dialect)
return true;
auto attrDefs = recordKeeper.getAllDerivedDefinitions("DialectAttr");
if (dialectDefs.empty())
return false;
- Optional<Dialect> dialect = findSelectedDialect(dialectDefs);
+ SmallVector<Dialect> dialects(dialectDefs.begin(), dialectDefs.end());
+ Optional<Dialect> dialect = findDialectToGenerate(dialects);
if (!dialect)
return true;
emitDialectDef(*dialect, os);
--- /dev/null
+//===- DialectGenUtilities.h - Utilities for dialect generation -----------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
+#define MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
+
+#include "mlir/Support/LLVM.h"
+
+namespace mlir {
+namespace tblgen {
+class Dialect;
+
+/// Find the dialect selected by the user to generate for. Returns None if no
+/// dialect was found, or if more than one potential dialect was found.
+Optional<Dialect> findDialectToGenerate(ArrayRef<Dialect> dialects);
+} // namespace tblgen
+} // namespace mlir
+
+#endif // MLIR_TOOLS_MLIRTBLGEN_DIALECTGENUTILITIES_H_
//
//===----------------------------------------------------------------------===//
+#include "DialectGenUtilities.h"
#include "DocGenUtilities.h"
#include "OpGenHelpers.h"
#include "mlir/Support/IndentedOstream.h"
#include "mlir/TableGen/GenInfo.h"
#include "mlir/TableGen/Operator.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FormatVariadic.h"
using mlir::tblgen::Operator;
-extern llvm::cl::opt<std::string> selectedDialect;
-
// Emit the description by aligning the text to the left per line (e.g.,
// removing the minimum indentation across the block).
//
ArrayRef<AttrDef> attrDefs, ArrayRef<Operator> ops,
ArrayRef<Type> types, ArrayRef<TypeDef> typeDefs,
raw_ostream &os) {
- if (selectedDialect.getNumOccurrences() &&
- dialect.getName() != selectedDialect)
- return;
os << "# '" << dialect.getName() << "' Dialect\n\n";
emitIfNotEmpty(dialect.getSummary(), os);
emitIfNotEmpty(dialect.getDescription(), os);
}
}
-static void emitDialectDoc(const RecordKeeper &recordKeeper, raw_ostream &os) {
+static bool emitDialectDoc(const RecordKeeper &recordKeeper, raw_ostream &os) {
std::vector<Record *> opDefs = getRequestedOpDefinitions(recordKeeper);
std::vector<Record *> attrDefs =
recordKeeper.getAllDerivedDefinitionsIfDefined("DialectAttr");
std::vector<Record *> attrDefDefs =
recordKeeper.getAllDerivedDefinitionsIfDefined("AttrDef");
- std::set<Dialect> dialectsWithDocs;
+ llvm::SetVector<Dialect, SmallVector<Dialect>, std::set<Dialect>>
+ dialectsWithDocs;
llvm::StringMap<std::vector<Attribute>> dialectAttrs;
llvm::StringMap<std::vector<AttrDef>> dialectAttrDefs;
dialectsWithDocs.insert(type.getDialect());
}
+ Optional<Dialect> dialect =
+ findDialectToGenerate(dialectsWithDocs.getArrayRef());
+ if (!dialect)
+ return true;
+
os << "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
- for (const Dialect &dialect : dialectsWithDocs) {
- StringRef dialectName = dialect.getName();
- emitDialectDoc(dialect, dialectAttrs[dialectName],
- dialectAttrDefs[dialectName], dialectOps[dialectName],
- dialectTypes[dialectName], dialectTypeDefs[dialectName], os);
- }
+ StringRef dialectName = dialect->getName();
+ emitDialectDoc(*dialect, dialectAttrs[dialectName],
+ dialectAttrDefs[dialectName], dialectOps[dialectName],
+ dialectTypes[dialectName], dialectTypeDefs[dialectName], os);
+ return false;
}
//===----------------------------------------------------------------------===//
static mlir::GenRegistration
genRegister("gen-dialect-doc", "Generate dialect documentation",
[](const RecordKeeper &records, raw_ostream &os) {
- emitDialectDoc(records, os);
- return false;
+ return emitDialectDoc(records, os);
});