18 #include "llvm/Support/CommandLine.h"
19 #include "llvm/Support/ToolOutputFile.h"
27 DebugConfigCLOptions() {
28 static cl::opt<std::string,
true> logActionsTo{
30 cl::desc(
"Log action execution to a file, or stderr if "
32 cl::location(logActionsToFlag)};
34 static cl::opt<std::string,
true> profileActionsTo{
36 cl::desc(
"Profile action execution to a file, or stderr if "
38 cl::location(profileActionsToFlag)};
40 static cl::list<std::string> logActionLocationFilter(
41 "log-mlir-actions-filter",
43 "Comma separated list of locations to filter actions from logging"),
45 cl::cb<void, std::string>([&](
const std::string &location) {
46 static bool registerOnce = [&] {
47 addLogActionLocFilter(&locBreakpointManager);
51 static std::vector<std::string> locations;
52 locations.push_back(location);
53 StringRef locStr = locations.back();
56 auto diag = [](Twine msg) { llvm::errs() << msg <<
"\n"; };
59 if (
failed(locBreakpoint)) {
60 llvm::errs() <<
"Invalid location filter: " << locStr <<
"\n";
63 auto [file, line, col] = *locBreakpoint;
64 locBreakpointManager.addBreakpoint(file, line, col);
87 errs() <<
"ExecutionContext registered on the context";
90 "Debug counters are incompatible with --log-actions-to and "
91 "--mlir-enable-debugger-hook options and are disabled");
93 std::string errorMessage;
95 if (!logActionsFile) {
97 "Opening file for --log-actions-to failed: ")
98 << errorMessage <<
"\n";
101 logActionsFile->keep();
102 raw_fd_ostream &logActionsStream = logActionsFile->os();
103 actionLogger = std::make_unique<tracing::ActionLogger>(logActionsStream);
105 actionLogger->addBreakpointManager(locationBreakpoint);
106 executionContext.registerObserver(actionLogger.get());
110 std::string errorMessage;
113 if (!profileActionsFile) {
115 "Opening file for --profile-actions-to failed: ")
116 << errorMessage <<
"\n";
119 profileActionsFile->keep();
120 raw_fd_ostream &profileActionsStream = profileActionsFile->os();
122 std::make_unique<tracing::ActionProfiler>(profileActionsStream);
123 executionContext.registerObserver(actionProfiler.get());
127 errs() <<
" (with Debugger hook)";
135 std::unique_ptr<ToolOutputFile> logActionsFile;
137 std::unique_ptr<tracing::ActionLogger> actionLogger;
138 std::vector<std::unique_ptr<tracing::FileLineColLocBreakpoint>>
140 std::unique_ptr<ToolOutputFile> profileActionsFile;
141 std::unique_ptr<tracing::ActionProfiler> actionProfiler;
146 :
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)
Include the generated interface declarations.
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...
bool failed(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a failure value.