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);
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");
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);
106 actionLogger->addBreakpointManager(locationBreakpoint);
107 executionContext.registerObserver(actionLogger.get());
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());
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;
147 :
impl(std::make_unique<
Impl>(context, config)) {}
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.
StringRef getLogActionsTo() const
Get the filename to use for logging actions.
StringRef getProfileActionsTo() const
Get the filename to use for profiling actions.
static void registerCLOptions()
Register the options as global LLVM command line options.
bool isDebuggerActionHookEnabled() const
Return true if the debugger action hook is enabled.
ArrayRef< tracing::BreakpointManager * > getLogActionsLocFilters() const
Get the location breakpoint managers to use to filter out action logging.
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)
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...