xref: /llvm-project/mlir/lib/Tools/mlir-query/MlirQueryMain.cpp (revision db791b278a414fb6df1acc1799adcf11d8fb9169)
102d9f4d1SDevajith //===- MlirQueryMain.cpp - MLIR Query main --------------------------------===//
202d9f4d1SDevajith //
302d9f4d1SDevajith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
402d9f4d1SDevajith // See https://llvm.org/LICENSE.txt for license information.
502d9f4d1SDevajith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
602d9f4d1SDevajith //
702d9f4d1SDevajith //===----------------------------------------------------------------------===//
802d9f4d1SDevajith //
902d9f4d1SDevajith // This file implements the general framework of the MLIR query tool. It
1002d9f4d1SDevajith // parses the command line arguments, parses the MLIR file and outputs the query
1102d9f4d1SDevajith // results.
1202d9f4d1SDevajith //
1302d9f4d1SDevajith //===----------------------------------------------------------------------===//
1402d9f4d1SDevajith 
1502d9f4d1SDevajith #include "mlir/Tools/mlir-query/MlirQueryMain.h"
1602d9f4d1SDevajith #include "mlir/IR/BuiltinOps.h"
1702d9f4d1SDevajith #include "mlir/Parser/Parser.h"
1802d9f4d1SDevajith #include "mlir/Query/Query.h"
1902d9f4d1SDevajith #include "mlir/Query/QuerySession.h"
2002d9f4d1SDevajith #include "mlir/Support/FileUtilities.h"
2102d9f4d1SDevajith #include "llvm/LineEditor/LineEditor.h"
2202d9f4d1SDevajith #include "llvm/Support/CommandLine.h"
2302d9f4d1SDevajith #include "llvm/Support/InitLLVM.h"
2402d9f4d1SDevajith #include "llvm/Support/SourceMgr.h"
2502d9f4d1SDevajith 
2602d9f4d1SDevajith //===----------------------------------------------------------------------===//
2702d9f4d1SDevajith // Query Parser
2802d9f4d1SDevajith //===----------------------------------------------------------------------===//
2902d9f4d1SDevajith 
30*db791b27SRamkumar Ramachandra llvm::LogicalResult
mlirQueryMain(int argc,char ** argv,MLIRContext & context,const mlir::query::matcher::Registry & matcherRegistry)3102d9f4d1SDevajith mlir::mlirQueryMain(int argc, char **argv, MLIRContext &context,
3202d9f4d1SDevajith                     const mlir::query::matcher::Registry &matcherRegistry) {
3302d9f4d1SDevajith 
3402d9f4d1SDevajith   // Override the default '-h' and use the default PrintHelpMessage() which
3502d9f4d1SDevajith   // won't print options in categories.
3602d9f4d1SDevajith   static llvm::cl::opt<bool> help("h", llvm::cl::desc("Alias for -help"),
3702d9f4d1SDevajith                                   llvm::cl::Hidden);
3802d9f4d1SDevajith 
3902d9f4d1SDevajith   static llvm::cl::OptionCategory mlirQueryCategory("mlir-query options");
4002d9f4d1SDevajith 
4102d9f4d1SDevajith   static llvm::cl::list<std::string> commands(
4202d9f4d1SDevajith       "c", llvm::cl::desc("Specify command to run"),
4302d9f4d1SDevajith       llvm::cl::value_desc("command"), llvm::cl::cat(mlirQueryCategory));
4402d9f4d1SDevajith 
4502d9f4d1SDevajith   static llvm::cl::opt<std::string> inputFilename(
4602d9f4d1SDevajith       llvm::cl::Positional, llvm::cl::desc("<input file>"),
4702d9f4d1SDevajith       llvm::cl::cat(mlirQueryCategory));
4802d9f4d1SDevajith 
4902d9f4d1SDevajith   static llvm::cl::opt<bool> noImplicitModule{
5002d9f4d1SDevajith       "no-implicit-module",
5102d9f4d1SDevajith       llvm::cl::desc(
5202d9f4d1SDevajith           "Disable implicit addition of a top-level module op during parsing"),
5302d9f4d1SDevajith       llvm::cl::init(false)};
5402d9f4d1SDevajith 
5502d9f4d1SDevajith   static llvm::cl::opt<bool> allowUnregisteredDialects(
5602d9f4d1SDevajith       "allow-unregistered-dialect",
5702d9f4d1SDevajith       llvm::cl::desc("Allow operation with no registered dialects"),
5802d9f4d1SDevajith       llvm::cl::init(false));
5902d9f4d1SDevajith 
6002d9f4d1SDevajith   llvm::cl::HideUnrelatedOptions(mlirQueryCategory);
6102d9f4d1SDevajith 
6202d9f4d1SDevajith   llvm::InitLLVM y(argc, argv);
6302d9f4d1SDevajith 
6402d9f4d1SDevajith   llvm::cl::ParseCommandLineOptions(argc, argv, "MLIR test case query tool.\n");
6502d9f4d1SDevajith 
6602d9f4d1SDevajith   if (help) {
6702d9f4d1SDevajith     llvm::cl::PrintHelpMessage();
6802d9f4d1SDevajith     return mlir::success();
6902d9f4d1SDevajith   }
7002d9f4d1SDevajith 
7102d9f4d1SDevajith   // Set up the input file.
7202d9f4d1SDevajith   std::string errorMessage;
7302d9f4d1SDevajith   auto file = openInputFile(inputFilename, &errorMessage);
7402d9f4d1SDevajith   if (!file) {
7502d9f4d1SDevajith     llvm::errs() << errorMessage << "\n";
7602d9f4d1SDevajith     return mlir::failure();
7702d9f4d1SDevajith   }
7802d9f4d1SDevajith 
7902d9f4d1SDevajith   auto sourceMgr = llvm::SourceMgr();
8002d9f4d1SDevajith   auto bufferId = sourceMgr.AddNewSourceBuffer(std::move(file), SMLoc());
8102d9f4d1SDevajith 
8202d9f4d1SDevajith   context.allowUnregisteredDialects(allowUnregisteredDialects);
8302d9f4d1SDevajith 
8402d9f4d1SDevajith   // Parse the input MLIR file.
8502d9f4d1SDevajith   OwningOpRef<Operation *> opRef =
8602d9f4d1SDevajith       noImplicitModule ? parseSourceFile(sourceMgr, &context)
8702d9f4d1SDevajith                        : parseSourceFile<mlir::ModuleOp>(sourceMgr, &context);
8802d9f4d1SDevajith   if (!opRef)
8902d9f4d1SDevajith     return mlir::failure();
9002d9f4d1SDevajith 
9102d9f4d1SDevajith   mlir::query::QuerySession qs(opRef.get(), sourceMgr, bufferId,
9202d9f4d1SDevajith                                matcherRegistry);
9302d9f4d1SDevajith   if (!commands.empty()) {
9402d9f4d1SDevajith     for (auto &command : commands) {
9502d9f4d1SDevajith       mlir::query::QueryRef queryRef = mlir::query::parse(command, qs);
9602d9f4d1SDevajith       if (mlir::failed(queryRef->run(llvm::outs(), qs)))
9702d9f4d1SDevajith         return mlir::failure();
9802d9f4d1SDevajith     }
9902d9f4d1SDevajith   } else {
10002d9f4d1SDevajith     llvm::LineEditor le("mlir-query");
10102d9f4d1SDevajith     le.setListCompleter([&qs](llvm::StringRef line, size_t pos) {
10202d9f4d1SDevajith       return mlir::query::complete(line, pos, qs);
10302d9f4d1SDevajith     });
10402d9f4d1SDevajith     while (std::optional<std::string> line = le.readLine()) {
10502d9f4d1SDevajith       mlir::query::QueryRef queryRef = mlir::query::parse(*line, qs);
10602d9f4d1SDevajith       (void)queryRef->run(llvm::outs(), qs);
10702d9f4d1SDevajith       llvm::outs().flush();
10802d9f4d1SDevajith       if (qs.terminate)
10902d9f4d1SDevajith         break;
11002d9f4d1SDevajith     }
11102d9f4d1SDevajith   }
11202d9f4d1SDevajith 
11302d9f4d1SDevajith   return mlir::success();
11402d9f4d1SDevajith }
115