MLIR 22.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() &&
88 !config.isDebuggerActionHookEnabled()) {
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.
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...
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:561
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)
const FrozenRewritePatternSet GreedyRewriteConfig config
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.