[MLIR] Unique autogenerated file for tablegen passes
Being the generated code macro-guarded, the autogenerated `.cpp.inc` file has been merged into the `.h.inc` to reduce the build steps. Reviewed By: mehdi_amini, rriddle Differential Revision: https://reviews.llvm.org/D132884
This commit is contained in:
parent
56bd3185cd
commit
13ed6958df
|
@ -829,12 +829,10 @@ def MyPass : Pass<"my-pass", "ModuleOp"> {
|
|||
}
|
||||
```
|
||||
|
||||
Using the `gen-pass-decls` and `gen-pass-defs` generators, we can generate most
|
||||
of the boilerplate above automatically.
|
||||
|
||||
The `gen-pass-decls` generator takes as an input a `-name` parameter, that
|
||||
Using the `gen-pass-decls` generator, we can generate most of the boilerplate
|
||||
above automatically. This generator takes as an input a `-name` parameter, that
|
||||
provides a tag for the group of passes that are being generated. This generator
|
||||
produces code with two purposes:
|
||||
produces code with multiple purposes:
|
||||
|
||||
The first is to register the declared passes with the global registry. For
|
||||
each pass, the generator produces a `registerPassName` where
|
||||
|
@ -902,14 +900,11 @@ std::unique_ptr<::mlir::Pass> createMyPass(const MyPassOptions &options);
|
|||
#endif // GEN_PASS_DECL_MYPASS
|
||||
```
|
||||
|
||||
The `gen-pass-defs` generator produces the definitions to be used for the pass
|
||||
implementation.
|
||||
|
||||
It generates a base class for each of the passes, containing most of the boiler
|
||||
plate related to pass definitions. These classes are named in the form of
|
||||
`MyPassBase` and are declared inside the `impl` namespace, where `MyPass` is
|
||||
the name of the pass definition in tablegen. We can update the original C++
|
||||
pass definition as so:
|
||||
The last purpose of this generator is to emit a base class for each of the
|
||||
passes, containing most of the boiler plate related to pass definitions. These
|
||||
classes are named in the form of `MyPassBase` and are declared inside the
|
||||
`impl` namespace, where `MyPass` is the name of the pass definition in
|
||||
tablegen. We can update the original C++ pass definition as so:
|
||||
|
||||
```c++
|
||||
// MyPass.cpp
|
||||
|
@ -917,7 +912,7 @@ pass definition as so:
|
|||
/// Include the generated base pass class definitions.
|
||||
namespace foo {
|
||||
#define GEN_PASS_DEF_MYPASS
|
||||
#include "Passes.cpp.inc"
|
||||
#include "Passes.h.inc"
|
||||
}
|
||||
|
||||
/// Define the main class as deriving from the generated base class.
|
||||
|
@ -929,9 +924,9 @@ struct MyPass : foo::impl::MyPassBase<MyPass> {
|
|||
};
|
||||
```
|
||||
|
||||
Similarly to the previous generator, the definitions can be enabled on a
|
||||
per-pass basis by defining the appropriate preprocessor `GEN_PASS_DEF_PASSNAME`
|
||||
macro, with `PASSNAME` equal to the uppercase version of the name of the pass
|
||||
Similarly to the previous cases, the definitions can be enabled on a per-pass
|
||||
basis by defining the appropriate preprocessor `GEN_PASS_DEF_PASSNAME` macro,
|
||||
with `PASSNAME` equal to the uppercase version of the name of the pass
|
||||
definition in tablegen.
|
||||
If the `constructor` field has not been specified in tablegen, then the default
|
||||
constructors are also defined and expect the name of the actual pass class to
|
||||
|
|
|
@ -118,8 +118,6 @@ static void emitPassDecls(const Pass &pass, raw_ostream &os) {
|
|||
std::string enableVarName = "GEN_PASS_DECL_" + passName.upper();
|
||||
|
||||
os << "#ifdef " << enableVarName << "\n";
|
||||
os << llvm::formatv(passHeader, passName);
|
||||
|
||||
emitPassOptionsStruct(pass, os);
|
||||
|
||||
if (StringRef constructor = pass.getConstructor(); constructor.empty()) {
|
||||
|
@ -164,24 +162,6 @@ static void emitRegistrations(llvm::ArrayRef<Pass> passes, raw_ostream &os) {
|
|||
os << "#endif // GEN_PASS_REGISTRATION\n";
|
||||
}
|
||||
|
||||
static void emitDecls(const llvm::RecordKeeper &recordKeeper, raw_ostream &os) {
|
||||
std::vector<Pass> passes = getPasses(recordKeeper);
|
||||
os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
|
||||
|
||||
for (const Pass &pass : passes)
|
||||
emitPassDecls(pass, os);
|
||||
|
||||
emitRegistrations(passes, os);
|
||||
|
||||
// TODO drop old pass declarations
|
||||
// Emit the old code until all the passes have switched to the new design.
|
||||
os << "#ifdef GEN_PASS_CLASSES\n";
|
||||
for (const Pass &pass : passes)
|
||||
emitOldPassDecl(pass, os);
|
||||
os << "#undef GEN_PASS_CLASSES\n";
|
||||
os << "#endif // GEN_PASS_CLASSES\n";
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// GEN: Pass base class generation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -313,7 +293,6 @@ static void emitPassDefs(const Pass &pass, raw_ostream &os) {
|
|||
bool emitDefaultConstructorWithOptions = !pass.getOptions().empty();
|
||||
|
||||
os << "#ifdef " << enableVarName << "\n";
|
||||
os << llvm::formatv(passHeader, passName);
|
||||
|
||||
if (emitDefaultConstructors) {
|
||||
os << llvm::formatv(friendDefaultConstructorDeclTemplate, passName);
|
||||
|
@ -377,14 +356,6 @@ static void emitPassDefs(const Pass &pass, raw_ostream &os) {
|
|||
os << "#endif // " << enableVarName << "\n";
|
||||
}
|
||||
|
||||
static void emitDefs(const llvm::RecordKeeper &recordKeeper, raw_ostream &os) {
|
||||
std::vector<Pass> passes = getPasses(recordKeeper);
|
||||
os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
|
||||
|
||||
for (const Pass &pass : passes)
|
||||
emitPassDefs(pass, os);
|
||||
}
|
||||
|
||||
// TODO drop old pass declarations
|
||||
// The old pass base class is being kept until all the passes have switched to
|
||||
// the new decls/defs design.
|
||||
|
@ -452,16 +423,36 @@ static void emitOldPassDecl(const Pass &pass, raw_ostream &os) {
|
|||
os << "};\n";
|
||||
}
|
||||
|
||||
static void emitPass(const Pass &pass, raw_ostream &os) {
|
||||
StringRef passName = pass.getDef()->getName();
|
||||
os << llvm::formatv(passHeader, passName);
|
||||
|
||||
emitPassDecls(pass, os);
|
||||
emitPassDefs(pass, os);
|
||||
}
|
||||
|
||||
static void emitPasses(const llvm::RecordKeeper &recordKeeper,
|
||||
raw_ostream &os) {
|
||||
std::vector<Pass> passes = getPasses(recordKeeper);
|
||||
os << "/* Autogenerated by mlir-tblgen; don't manually edit */\n";
|
||||
|
||||
for (const Pass &pass : passes)
|
||||
emitPass(pass, os);
|
||||
|
||||
emitRegistrations(passes, os);
|
||||
|
||||
// TODO: Drop old pass declarations.
|
||||
// Emit the old code until all the passes have switched to the new design.
|
||||
os << "#ifdef GEN_PASS_CLASSES\n";
|
||||
for (const Pass &pass : passes)
|
||||
emitOldPassDecl(pass, os);
|
||||
os << "#undef GEN_PASS_CLASSES\n";
|
||||
os << "#endif // GEN_PASS_CLASSES\n";
|
||||
}
|
||||
|
||||
static mlir::GenRegistration
|
||||
genPassDecls("gen-pass-decls", "Generate pass declarations",
|
||||
[](const llvm::RecordKeeper &records, raw_ostream &os) {
|
||||
emitDecls(records, os);
|
||||
emitPasses(records, os);
|
||||
return false;
|
||||
});
|
||||
|
||||
static mlir::GenRegistration
|
||||
genPassDefs("gen-pass-defs", "Generate pass definitions",
|
||||
[](const llvm::RecordKeeper &records, raw_ostream &os) {
|
||||
emitDefs(records, os);
|
||||
return false;
|
||||
});
|
||||
|
|
|
@ -5,7 +5,6 @@ add_public_tablegen_target(MLIRTableGenEnumsIncGen)
|
|||
|
||||
set(LLVM_TARGET_DEFINITIONS passes.td)
|
||||
mlir_tablegen(PassGenTest.h.inc -gen-pass-decls -name TableGenTest)
|
||||
mlir_tablegen(PassGenTest.cpp.inc -gen-pass-defs -name TableGenTest)
|
||||
add_public_tablegen_target(MLIRTableGenTestPassIncGen)
|
||||
|
||||
add_mlir_unittest(MLIRTableGenTests
|
||||
|
|
|
@ -22,7 +22,7 @@ std::unique_ptr<mlir::Pass> createTestPassWithCustomConstructor(int v = 0);
|
|||
#define GEN_PASS_DEF_TESTPASS
|
||||
#define GEN_PASS_DEF_TESTPASSWITHOPTIONS
|
||||
#define GEN_PASS_DEF_TESTPASSWITHCUSTOMCONSTRUCTOR
|
||||
#include "PassGenTest.cpp.inc"
|
||||
#include "PassGenTest.h.inc"
|
||||
|
||||
struct TestPass : public impl::TestPassBase<TestPass> {
|
||||
using TestPassBase::TestPassBase;
|
||||
|
|
Loading…
Reference in New Issue