15#include "llvm/ADT/StringExtras.h"
16#include "llvm/ADT/StringRef.h"
25 llvm::raw_string_ostream os(
val);
30 llvm::raw_string_ostream os(
val);
35 llvm::raw_string_ostream os(
val);
52 for (
size_t i = 0; i < sorted.size(); ++i) {
53 const auto &a = sorted[i];
56 llvm::StringRef val(a.
val);
57 bool needsQuote = val.contains(
' ') || val.contains(
',') ||
58 val.contains(
'{') || val.contains(
'}');
60 os <<
'"' << val <<
'"';
64 if (i + 1 < sorted.size())
81 os <<
'[' << type <<
"] ";
89 if (
auto flc = mlir::dyn_cast<mlir::FileLineColLoc>(
getLocation())) {
90 os <<
" @" << flc.getFilename() <<
":" << flc.getLine() <<
":"
100 llvm::raw_string_ostream os(s);
119 llvm_unreachable(
"Unknown remark kind");
125 return llvm::remarks::Type::Unknown;
127 return llvm::remarks::Type::Passed;
129 return llvm::remarks::Type::Missed;
131 return llvm::remarks::Type::Failure;
133 return llvm::remarks::Type::Analysis;
135 llvm_unreachable(
"Unknown remark kind");
139 auto locLambda = [&]() -> llvm::remarks::RemarkLocation {
140 if (
auto flc = dyn_cast<FileLineColLoc>(
getLocation()))
141 return {flc.getFilename(), flc.getLine(), flc.getColumn()};
142 return {
"<unknown file>", 0, 0};
145 llvm::remarks::Remark r;
153 r.Args.emplace_back();
154 r.Args.back().Key = arg.key;
155 r.Args.back().Val = arg.val;
166 owner->report(std::move(*remark));
174template <
typename RemarkT,
typename... Args>
176 static_assert(std::is_base_of_v<Remark, RemarkT>,
177 "RemarkT must derive from Remark");
179 std::make_unique<RemarkT>(std::forward<Args>(
args)...));
182template <
typename RemarkT>
186 return (this->*isEnabled)(opts.
categoryName) ? makeRemark<RemarkT>(
loc, opts)
190bool RemarkEngine::isMissedOptRemarkEnabled(StringRef
categoryName)
const {
194bool RemarkEngine::isPassedOptRemarkEnabled(StringRef
categoryName)
const {
195 return passedFilter && passedFilter->match(
categoryName);
198bool RemarkEngine::isAnalysisOptRemarkEnabled(StringRef
categoryName)
const {
199 return analysisFilter && analysisFilter->match(
categoryName);
202bool RemarkEngine::isFailedOptRemarkEnabled(StringRef
categoryName)
const {
203 return failedFilter && failedFilter->match(
categoryName);
208 return emitIfEnabled<OptRemarkPass>(
loc, opts,
209 &RemarkEngine::isPassedOptRemarkEnabled);
214 return emitIfEnabled<OptRemarkMissed>(
215 loc, opts, &RemarkEngine::isMissedOptRemarkEnabled);
220 return emitIfEnabled<OptRemarkFailure>(
221 loc, opts, &RemarkEngine::isFailedOptRemarkEnabled);
226 return emitIfEnabled<OptRemarkAnalysis>(
227 loc, opts, &RemarkEngine::isAnalysisOptRemarkEnabled);
236 if (remarkStreamer) {
237 remarkStreamer->streamOptimizationRemark(
remark);
241 if (printAsEmitRemarks)
246 if (remarkEmittingPolicy)
247 remarkEmittingPolicy->reportRemark(
remark);
251 if (remarkEmittingPolicy)
252 remarkEmittingPolicy->finalize();
255 remarkStreamer->finalize();
259 std::unique_ptr<MLIRRemarkStreamerBase> streamer,
260 std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
261 std::string *errMsg) {
263 remarkStreamer = std::move(streamer);
266 std::bind(&RemarkEngine::reportImpl,
this, std::placeholders::_1);
267 remarkEmittingPolicy->initialize(
ReportFn(std::move(reportFunc)));
269 this->remarkEmittingPolicy = std::move(remarkEmittingPolicy);
276 return s.starts_with(
"^") && s.ends_with(
"$");
283 return (llvm::Twine(
"^(") + filter +
")$").str();
289static std::optional<llvm::Regex>
291 const std::optional<std::string> &specific) {
293 if (cats.
all && !cats.
all->empty())
294 parts.emplace_back(*cats.
all);
295 if (specific && !specific->empty())
296 parts.emplace_back(*specific);
301 std::string joined = llvm::join(parts,
"|");
304 llvm::Regex rx(anchored);
306 if (!rx.isValid(err))
309 return std::make_optional<llvm::Regex>(std::move(rx));
314 : printAsEmitRemarks(printAsEmitRemarks) {
326 MLIRContext &ctx, std::unique_ptr<detail::MLIRRemarkStreamerBase> streamer,
327 std::unique_ptr<detail::RemarkEmittingPolicyBase> remarkEmittingPolicy,
330 std::make_unique<detail::RemarkEngine>(printAsEmitRemarks, cats);
333 if (
failed(engine->initialize(std::move(streamer),
334 std::move(remarkEmittingPolicy), &errMsg))) {
335 llvm::report_fatal_error(
336 llvm::Twine(
"Failed to initialize remark engine. Error: ") + errMsg);
Attributes are known-constant values of operations.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
void setRemarkEngine(std::unique_ptr< remark::detail::RemarkEngine > engine)
Set the remark engine for this context.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
InFlightDiagnostic emitRemark(Location loc)
Utility method to emit a remark message using this location.