MLIR 23.0.0git
CLOptionsSetup.cpp
Go to the documentation of this file.
1//===- CLOptionsSetup.cpp - Helpers to setup debug CL options ---*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "mlir/Debug/Counter.h"
16#include "mlir/IR/MLIRContext.h"
18#include "llvm/Support/CommandLine.h"
19#include "llvm/Support/ManagedStatic.h"
20#include "llvm/Support/ToolOutputFile.h"
21
22using namespace mlir;
23using namespace mlir::tracing;
24using namespace llvm;
25
26namespace {
27struct DebugConfigCLOptions : public DebugConfig {
28 DebugConfigCLOptions() {
29 static cl::opt<std::string, /*ExternalStorage=*/true> logActionsTo{
30 "log-actions-to",
31 cl::desc("Log action execution to a file, or stderr if "
32 " '-' is passed"),
33 cl::location(logActionsToFlag)};
34
35 static cl::opt<std::string, /*ExternalStorage=*/true> profileActionsTo{
36 "profile-actions-to",
37 cl::desc("Profile action execution to a file, or stderr if "
38 " '-' is passed"),
39 cl::location(profileActionsToFlag)};
40
41 static cl::list<std::string> logActionLocationFilter(
42 "log-mlir-actions-filter",
43 cl::desc(
44 "Comma separated list of locations to filter actions from logging"),
45 cl::CommaSeparated,
46 cl::cb<void, std::string>([&](const std::string &location) {
47 static bool registerOnce = [&] {
48 addLogActionLocFilter(&locBreakpointManager);
49 return true;
50 }();
51 (void)registerOnce;
52 static std::vector<std::string> locations;
53 locations.push_back(location);
54 StringRef locStr = locations.back();
55
56 // Parse the individual location filters and set the breakpoints.
57 auto diag = [](Twine msg) { llvm::errs() << msg << "\n"; };
58 auto locBreakpoint =
60 if (failed(locBreakpoint)) {
61 llvm::errs() << "Invalid location filter: " << locStr << "\n";
62 exit(1);
63 }
64 auto [file, line, col] = *locBreakpoint;
65 locBreakpointManager.addBreakpoint(file, line, col);
66 }));
67
68 static cl::opt<bool, /*ExternalStorage=*/true> enableDebuggerHook(
69 "mlir-enable-debugger-hook",
70 cl::desc("Enable Debugger hook for debugging MLIR Actions"),
71 cl::location(enableDebuggerActionHookFlag), cl::init(false));
72 }
73 tracing::FileLineColLocBreakpointManager locBreakpointManager;
74};
75
76} // namespace
77
78static ManagedStatic<DebugConfigCLOptions> clOptionsConfig;
80
82
84public:
85 Impl(MLIRContext &context, const DebugConfig &config) {
86 if (config.getLogActionsTo().empty() &&
87 config.getProfileActionsTo().empty() &&
91 return;
92 }
93 errs() << "ExecutionContext registered on the context";
95 emitError(UnknownLoc::get(&context),
96 "Debug counters are incompatible with --log-actions-to and "
97 "--mlir-enable-debugger-hook options and are disabled");
98 if (!config.getLogActionsTo().empty()) {
99 std::string errorMessage;
100 logActionsFile = openOutputFile(config.getLogActionsTo(), &errorMessage);
101 if (!logActionsFile) {
102 emitError(UnknownLoc::get(&context),
103 "Opening file for --log-actions-to failed: ")
104 << errorMessage << "\n";
105 return;
106 }
107 logActionsFile->keep();
108 raw_fd_ostream &logActionsStream = logActionsFile->os();
109 actionLogger = std::make_unique<tracing::ActionLogger>(logActionsStream);
110 for (const auto *locationBreakpoint : config.getLogActionsLocFilters())
111 actionLogger->addBreakpointManager(locationBreakpoint);
112 executionContext.registerObserver(actionLogger.get());
113 }
114
115 if (!config.getProfileActionsTo().empty()) {
116 std::string errorMessage;
117 profileActionsFile =
118 openOutputFile(config.getProfileActionsTo(), &errorMessage);
119 if (!profileActionsFile) {
120 emitError(UnknownLoc::get(&context),
121 "Opening file for --profile-actions-to failed: ")
122 << errorMessage << "\n";
123 return;
124 }
125 profileActionsFile->keep();
126 raw_fd_ostream &profileActionsStream = profileActionsFile->os();
127 actionProfiler =
128 std::make_unique<tracing::ActionProfiler>(profileActionsStream);
129 executionContext.registerObserver(actionProfiler.get());
130 }
131
132 if (config.isDebuggerActionHookEnabled()) {
133 errs() << " (with Debugger hook)";
134 setupDebuggerExecutionContextHook(executionContext);
135 }
136 errs() << "\n";
137 context.registerActionHandler(executionContext);
138 }
139
140private:
141 std::unique_ptr<ToolOutputFile> logActionsFile;
142 tracing::ExecutionContext executionContext;
143 std::unique_ptr<tracing::ActionLogger> actionLogger;
144 std::vector<std::unique_ptr<tracing::FileLineColLocBreakpoint>>
145 locationBreakpoints;
146 std::unique_ptr<ToolOutputFile> profileActionsFile;
147 std::unique_ptr<tracing::ActionProfiler> actionProfiler;
148};
149
151 const DebugConfig &config)
152 : impl(std::make_unique<Impl>(context, config)) {}
153
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.
Definition MLIRContext.h:63
void registerActionHandler(HandlerTy handler)
Register a handler for handling actions that are dispatched through this context.
ArrayRef< tracing::BreakpointManager * > getLogActionsLocFilters() const
Get the location breakpoint managers to use to filter out action logging.
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.
This class implements an action handler that attaches a counter value to debug actions and enables/di...
Definition Counter.h:29
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...
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.
Definition CallGraph.h:229
detail::InFlightRemark failed(Location loc, RemarkOpts opts)
Report an optimization remark that failed.
Definition Remarks.h:717
Include the generated interface declarations.
std::unique_ptr< llvm::ToolOutputFile > openOutputFile(llvm::StringRef outputFilename, std::string *errorMessage=nullptr)
Open the file specified by its name for writing.
void setupDebuggerExecutionContextHook(tracing::ExecutionContext &executionContext)
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.