18 #include "llvm/Support/CommandLine.h"
19 #include "llvm/Support/ManagedStatic.h"
20 #include "llvm/Support/ToolOutputFile.h"
28 DebugConfigCLOptions() {
29 static cl::opt<std::string,
true> logActionsTo{
31 cl::desc(
"Log action execution to a file, or stderr if "
33 cl::location(logActionsToFlag)};
35 static cl::opt<std::string,
true> profileActionsTo{
37 cl::desc(
"Profile action execution to a file, or stderr if "
39 cl::location(profileActionsToFlag)};
41 static cl::list<std::string> logActionLocationFilter(
42 "log-mlir-actions-filter",
44 "Comma separated list of locations to filter actions from logging"),
46 cl::cb<void, std::string>([&](
const std::string &location) {
47 static bool registerOnce = [&] {
48 addLogActionLocFilter(&locBreakpointManager);
52 static std::vector<std::string> locations;
53 locations.push_back(location);
54 StringRef locStr = locations.back();
57 auto diag = [](Twine msg) { llvm::errs() << msg <<
"\n"; };
60 if (failed(locBreakpoint)) {
61 llvm::errs() <<
"Invalid location filter: " << locStr <<
"\n";
64 auto [file, line, col] = *locBreakpoint;
65 locBreakpointManager.addBreakpoint(file, line, col);
81 if (
config.getLogActionsTo().empty() &&
82 config.getProfileActionsTo().empty() &&
83 !
config.isDebuggerActionHookEnabled()) {
88 errs() <<
"ExecutionContext registered on the context";
91 "Debug counters are incompatible with --log-actions-to and "
92 "--mlir-enable-debugger-hook options and are disabled");
93 if (!
config.getLogActionsTo().empty()) {
94 std::string errorMessage;
96 if (!logActionsFile) {
98 "Opening file for --log-actions-to failed: ")
99 << errorMessage <<
"\n";
102 logActionsFile->keep();
103 raw_fd_ostream &logActionsStream = logActionsFile->os();
104 actionLogger = std::make_unique<tracing::ActionLogger>(logActionsStream);
105 for (
const auto *locationBreakpoint :
config.getLogActionsLocFilters())
106 actionLogger->addBreakpointManager(locationBreakpoint);
107 executionContext.registerObserver(actionLogger.get());
110 if (!
config.getProfileActionsTo().empty()) {
111 std::string errorMessage;
114 if (!profileActionsFile) {
116 "Opening file for --profile-actions-to failed: ")
117 << errorMessage <<
"\n";
120 profileActionsFile->keep();
121 raw_fd_ostream &profileActionsStream = profileActionsFile->os();
123 std::make_unique<tracing::ActionProfiler>(profileActionsStream);
124 executionContext.registerObserver(actionProfiler.get());
127 if (
config.isDebuggerActionHookEnabled()) {
128 errs() <<
" (with Debugger hook)";
136 std::unique_ptr<ToolOutputFile> logActionsFile;
138 std::unique_ptr<tracing::ActionLogger> actionLogger;
139 std::vector<std::unique_ptr<tracing::FileLineColLocBreakpoint>>
141 std::unique_ptr<ToolOutputFile> profileActionsFile;
142 std::unique_ptr<tracing::ActionProfiler> actionProfiler;
static ManagedStatic< DebugConfigCLOptions > clOptionsConfig
static std::string diag(const llvm::Value &value)
Impl(MLIRContext &context, const DebugConfig &config)
MLIRContext is the top-level object for a collection of MLIR operations.
void registerActionHandler(HandlerTy handler)
Register a handler for handling actions that are dispatched through this context.
static DebugConfig createFromCLOptions()
Create a new config with the default set from the CL options.
static void registerCLOptions()
Register the options as global LLVM command line options.
This class implements an action handler that attaches a counter value to debug actions and enables/di...
static bool isActivated()
Returns true if any of the CL options are activated.
The ExecutionContext is the main orchestration of the infrastructure, it acts as a handler in the MLI...
This breakpoint manager is responsible for matching FileLineColLocBreakpoint.
static FailureOr< std::tuple< StringRef, int64_t, int64_t > > parseFromString(StringRef str, llvm::function_ref< void(Twine)> diag=[](Twine) {})
Parse a string representation in the form of "<file>:<line>:<col>".
InstallDebugHandler(MLIRContext &context, const DebugConfig &config)
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Include the generated interface declarations.
void setupDebuggerExecutionContextHook(tracing::ExecutionContext &executionContext)
const FrozenRewritePatternSet GreedyRewriteConfig config
std::unique_ptr< llvm::ToolOutputFile > openOutputFile(llvm::StringRef outputFilename, std::string *errorMessage=nullptr)
Open the file specified by its name for writing.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...