annotate mlir/tools/mlir-tblgen/PassGen.cpp @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 0572611fdcc8
children 5f17cb93ff66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- Pass.cpp - MLIR pass registration generator ------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // PassGen uses the description of passes to generate base classes for passes
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // and command line registration.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include "mlir/TableGen/GenInfo.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "mlir/TableGen/Pass.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "llvm/ADT/StringExtras.h"
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
17 #include "llvm/Support/CommandLine.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/Support/FormatVariadic.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/TableGen/Error.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "llvm/TableGen/Record.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 using namespace mlir;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 using namespace mlir::tblgen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
25 static llvm::cl::OptionCategory passGenCat("Options for -gen-pass-decls");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
26 static llvm::cl::opt<std::string>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
27 groupName("name", llvm::cl::desc("The name of this group of passes"),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
28 llvm::cl::cat(passGenCat));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
29
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 // GEN: Pass base class generation
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 /// The code snippet used to generate the start of a pass base class.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 ///
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 /// {0}: The def name of the pass record.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 /// {1}: The base class for the pass.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 /// {2): The command line argument for the pass.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
39 /// {3}: The dependent dialects registration.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 const char *const passDeclBegin = R"(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 // {0}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 template <typename DerivedT>
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 class {0}Base : public {1} {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 public:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
48 using Base = {0}Base;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
49
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 {0}Base() : {1}(::mlir::TypeID::get<DerivedT>()) {{}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 {0}Base(const {0}Base &) : {1}(::mlir::TypeID::get<DerivedT>()) {{}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 /// Returns the command-line argument attached to this pass.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
54 static constexpr ::llvm::StringLiteral getArgumentName() {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
55 return ::llvm::StringLiteral("{2}");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
56 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
57 ::llvm::StringRef getArgument() const override { return "{2}"; }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 /// Returns the derived pass name.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
60 static constexpr ::llvm::StringLiteral getPassName() {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
61 return ::llvm::StringLiteral("{0}");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
62 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
63 ::llvm::StringRef getName() const override { return "{0}"; }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 /// Support isa/dyn_cast functionality for the derived pass class.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 static bool classof(const ::mlir::Pass *pass) {{
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 /// A clone method to create a copy of this pass.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
71 std::unique_ptr<::mlir::Pass> clonePass() const override {{
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
75 /// Return the dialect that must be loaded in the context before this pass.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
76 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
77 {3}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
78 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
79
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 protected:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 )";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
83 /// Registration for a single dependent dialect, to be inserted for each
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
84 /// dependent dialect in the `getDependentDialects` above.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
85 const char *const dialectRegistrationTemplate = R"(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
86 registry.insert<{0}>();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
87 )";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
88
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 /// Emit the declarations for each of the pass options.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 static void emitPassOptionDecls(const Pass &pass, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 for (const PassOption &opt : pass.getOptions()) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
92 os.indent(2) << "::mlir::Pass::"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
93 << (opt.isListOption() ? "ListOption" : "Option");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
95 os << llvm::formatv("<{0}> {1}{{*this, \"{2}\", ::llvm::cl::desc(\"{3}\")",
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 opt.getType(), opt.getCppVariableName(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 opt.getArgument(), opt.getDescription());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 if (Optional<StringRef> defaultVal = opt.getDefaultValue())
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
99 os << ", ::llvm::cl::init(" << defaultVal << ")";
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 if (Optional<StringRef> additionalFlags = opt.getAdditionalFlags())
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 os << ", " << *additionalFlags;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 os << "};\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 /// Emit the declarations for each of the pass statistics.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 static void emitPassStatisticDecls(const Pass &pass, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 for (const PassStatistic &stat : pass.getStatistics()) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
109 os << llvm::formatv(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
110 " ::mlir::Pass::Statistic {0}{{this, \"{1}\", \"{2}\"};\n",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
111 stat.getCppVariableName(), stat.getName(), stat.getDescription());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 static void emitPassDecl(const Pass &pass, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 StringRef defName = pass.getDef()->getName();
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
117 std::string dependentDialectRegistrations;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
118 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
119 llvm::raw_string_ostream dialectsOs(dependentDialectRegistrations);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
120 for (StringRef dependentDialect : pass.getDependentDialects())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
121 dialectsOs << llvm::formatv(dialectRegistrationTemplate,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
122 dependentDialect);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
123 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 os << llvm::formatv(passDeclBegin, defName, pass.getBaseClass(),
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
125 pass.getArgument(), dependentDialectRegistrations);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 emitPassOptionDecls(pass, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 emitPassStatisticDecls(pass, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 os << "};\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 /// Emit the code for registering each of the given passes with the global
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 /// PassRegistry.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 static void emitPassDecls(ArrayRef<Pass> passes, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 os << "#ifdef GEN_PASS_CLASSES\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 for (const Pass &pass : passes)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 emitPassDecl(pass, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 os << "#undef GEN_PASS_CLASSES\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 os << "#endif // GEN_PASS_CLASSES\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 // GEN: Pass registration generation
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
145 /// The code snippet used to generate the start of a pass base class.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
146 ///
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
147 /// {0}: The def name of the pass record.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
148 /// {1}: The argument of the pass.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
149 /// {2): The summary of the pass.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
150 /// {3}: The code for constructing the pass.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
151 const char *const passRegistrationCode = R"(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
152 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
153 // {0} Registration
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
154 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
156 inline void register{0}Pass() {{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
157 ::mlir::registerPass("{1}", "{2}", []() -> std::unique_ptr<::mlir::Pass> {{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
158 return {3};
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
159 });
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
160 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
161 )";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
162
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
163 /// {0}: The name of the pass group.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
164 const char *const passGroupRegistrationCode = R"(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
165 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
166 // {0} Registration
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
167 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
168
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
169 inline void register{0}Passes() {{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
170 )";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
171
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 /// Emit the code for registering each of the given passes with the global
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 /// PassRegistry.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 static void emitRegistration(ArrayRef<Pass> passes, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 os << "#ifdef GEN_PASS_REGISTRATION\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 for (const Pass &pass : passes) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
177 os << llvm::formatv(passRegistrationCode, pass.getDef()->getName(),
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 pass.getArgument(), pass.getSummary(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 pass.getConstructor());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
182 os << llvm::formatv(passGroupRegistrationCode, groupName);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
183 for (const Pass &pass : passes)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
184 os << " register" << pass.getDef()->getName() << "Pass();\n";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
185 os << "}\n";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
186 os << "#undef GEN_PASS_REGISTRATION\n";
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 os << "#endif // GEN_PASS_REGISTRATION\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 // GEN: Registration hooks
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 //===----------------------------------------------------------------------===//
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 static void emitDecls(const llvm::RecordKeeper &recordKeeper, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 std::vector<Pass> passes;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 for (const auto *def : recordKeeper.getAllDerivedDefinitions("PassBase"))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 passes.push_back(Pass(def));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 emitPassDecls(passes, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 emitRegistration(passes, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 static mlir::GenRegistration
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 genRegister("gen-pass-decls", "Generate operation documentation",
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 [](const llvm::RecordKeeper &records, raw_ostream &os) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 emitDecls(records, os);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 });