17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/InitLLVM.h"
19 #include "llvm/Support/Signals.h"
20 #include "llvm/TableGen/Error.h"
21 #include "llvm/TableGen/Main.h"
22 #include "llvm/TableGen/Record.h"
32 static bool findUse(
const Init *field,
const Init *deprecatedInit,
34 if (field == deprecatedInit)
37 auto it = known.find(field);
38 if (it != known.end())
41 auto memoize = [&](
bool val) {
46 if (
auto *defInit = dyn_cast<DefInit>(field)) {
51 if (!defInit->getDef()->isAnonymous())
57 llvm::any_of(defInit->getDef()->getValues(), [&](
const RecordVal &val) {
58 return findUse(val.getValue(), deprecatedInit, known);
62 if (
auto *dagInit = dyn_cast<DagInit>(field)) {
63 if (
findUse(dagInit->getOperator(), deprecatedInit, known))
66 return memoize(llvm::any_of(dagInit->getArgs(), [&](
const Init *arg) {
67 return findUse(arg, deprecatedInit, known);
71 if (
const ListInit *li = dyn_cast<ListInit>(field)) {
72 return memoize(llvm::any_of(li->getElements(), [&](
const Init *jt) {
73 return findUse(jt, deprecatedInit, known);
85 static bool findUse(Record &record,
const Init *deprecatedInit,
87 return llvm::any_of(record.getValues(), [&](
const RecordVal &val) {
88 return findUse(val.getValue(), deprecatedInit, known);
96 bool deprecatedDefsFounds =
false;
97 for (
auto &it : records.getDefs()) {
98 const RecordVal *r = it.second->getValue(
"odsDeprecated");
99 if (!r || !r->getValue())
103 if (
auto *si = dyn_cast<StringInit>(r->getValue())) {
104 for (
auto &jt : records.getDefs()) {
106 if (jt.second->isAnonymous())
109 if (
findUse(*jt.second, it.second->getDefInit(), hasUse)) {
110 PrintWarning(jt.second->getLoc(),
111 "Using deprecated def `" + it.first +
"`");
112 PrintNote(si->getAsUnquotedString());
113 deprecatedDefsFounds =
true;
118 if (deprecatedDefsFounds &&
120 PrintFatalNote(
"Error'ing out due to deprecated defs");
141 llvm::InitLLVM y(argc, argv);
143 llvm::cl::opt<DeprecatedAction, true> actionOnDeprecated(
144 "on-deprecated", llvm::cl::desc(
"Action to perform on deprecated def"),
151 llvm::cl::opt<const mlir::GenInfo *, true, mlir::GenNameParser>
generator(
152 "", llvm::cl::desc(
"Generator to run"), cl::location(::
generator));
154 cl::ParseCommandLineOptions(argc, argv);
static DeprecatedAction actionOnDeprecatedValue
static bool findUse(const Init *field, const Init *deprecatedInit, llvm::DenseMap< const Init *, bool > &known)
static const mlir::GenInfo * generator
static void warnOfDeprecatedUses(const RecordKeeper &records)
static bool mlirTableGenMain(raw_ostream &os, const RecordKeeper &records)
Structure to group information about a generator (argument to invoke via mlir-tblgen,...
bool invoke(const llvm::RecordKeeper &records, raw_ostream &os) const
Invokes the generator and returns whether the generator failed.
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Include the generated interface declarations.
int MlirTblgenMain(int argc, char **argv)
Main Program for tools like 'mlir-tblgen' with custom backends.