1 //===- PassDocGen.cpp - MLIR pass documentation generator -----------------===//
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
7 //===----------------------------------------------------------------------===//
9 // PassDocGen uses the description of passes to generate documentation.
11 //===----------------------------------------------------------------------===//
13 #include "DocGenUtilities.h"
14 #include "mlir/TableGen/GenInfo.h"
15 #include "mlir/TableGen/Pass.h"
16 #include "llvm/Support/FormatVariadic.h"
17 #include "llvm/TableGen/Record.h"
20 using namespace mlir::tblgen
;
21 using llvm::RecordKeeper
;
23 /// Emit the documentation for the given pass.
24 static void emitDoc(const Pass
&pass
, raw_ostream
&os
) {
25 os
<< llvm::formatv("### `-{0}`\n", pass
.getArgument());
26 emitSummary(pass
.getSummary(), os
);
27 emitDescription(pass
.getDescription(), os
);
29 // Handle the options of the pass.
30 ArrayRef
<PassOption
> options
= pass
.getOptions();
31 if (!options
.empty()) {
32 os
<< "\n#### Options\n```\n";
33 size_t longestOption
= 0;
34 for (const PassOption
&option
: options
)
35 longestOption
= std::max(option
.getArgument().size(), longestOption
);
36 for (const PassOption
&option
: options
) {
37 os
<< "-" << option
.getArgument();
38 os
.indent(longestOption
- option
.getArgument().size())
39 << " : " << option
.getDescription() << "\n";
44 // Handle the statistics of the pass.
45 ArrayRef
<PassStatistic
> stats
= pass
.getStatistics();
47 os
<< "\n#### Statistics\n```\n";
48 size_t longestStat
= 0;
49 for (const PassStatistic
&stat
: stats
)
50 longestStat
= std::max(stat
.getName().size(), longestStat
);
51 for (const PassStatistic
&stat
: stats
) {
53 os
.indent(longestStat
- stat
.getName().size())
54 << " : " << stat
.getDescription() << "\n";
60 static void emitDocs(const RecordKeeper
&records
, raw_ostream
&os
) {
61 os
<< "<!-- Autogenerated by mlir-tblgen; don't manually edit -->\n";
62 auto passDefs
= records
.getAllDerivedDefinitions("PassBase");
64 // Collect the registered passes, sorted by argument name.
65 SmallVector
<Pass
, 16> passes(passDefs
.begin(), passDefs
.end());
66 SmallVector
<Pass
*, 16> sortedPasses(llvm::make_pointer_range(passes
));
67 llvm::array_pod_sort(sortedPasses
.begin(), sortedPasses
.end(),
68 [](Pass
*const *lhs
, Pass
*const *rhs
) {
69 return (*lhs
)->getArgument().compare(
70 (*rhs
)->getArgument());
72 for (Pass
*pass
: sortedPasses
)
76 static mlir::GenRegistration
77 genRegister("gen-pass-doc", "Generate pass documentation",
78 [](const RecordKeeper
&records
, raw_ostream
&os
) {
79 emitDocs(records
, os
);