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);
47 for (
size_t i = 0; i < sorted.size(); ++i) {
48 const auto &a = sorted[i];
51 llvm::StringRef val(a.
val);
52 bool needsQuote = val.contains(
' ') || val.contains(
',') ||
53 val.contains(
'{') || val.contains(
'}');
55 os <<
'"' << val <<
'"';
59 if (i + 1 < sorted.size())
76 os <<
'[' << type <<
"] ";
84 if (
auto flc = mlir::dyn_cast<mlir::FileLineColLoc>(
getLocation())) {
85 os <<
" @" << flc.getFilename() <<
":" << flc.getLine() <<
":"
95 llvm::raw_string_ostream os(s);
114 llvm_unreachable(
"Unknown remark kind");
120 return llvm::remarks::Type::Unknown;
122 return llvm::remarks::Type::Passed;
124 return llvm::remarks::Type::Missed;
128 return llvm::remarks::Type::Analysis;
130 llvm_unreachable(
"Unknown remark kind");
134 auto locLambda = [&]() -> llvm::remarks::RemarkLocation {
135 if (
auto flc = dyn_cast<FileLineColLoc>(
getLocation()))
136 return {flc.getFilename(), flc.getLine(), flc.getColumn()};
137 return {
"<unknown file>", 0, 0};
140 llvm::remarks::Remark r;
148 r.Args.emplace_back();
149 r.Args.back().Key = arg.key;
150 r.Args.back().Val = arg.val;
161 owner->report(std::move(*remark));
169 template <
typename RemarkT,
typename... Args>
171 static_assert(std::is_base_of_v<Remark, RemarkT>,
172 "RemarkT must derive from Remark");
174 std::make_unique<RemarkT>(std::forward<Args>(
args)...));
177 template <
typename RemarkT>
181 return (this->*isEnabled)(opts.
categoryName) ? makeRemark<RemarkT>(
loc, opts)
185 bool RemarkEngine::isMissedOptRemarkEnabled(StringRef
categoryName)
const {
189 bool RemarkEngine::isPassedOptRemarkEnabled(StringRef
categoryName)
const {
190 return passedFilter && passedFilter->match(
categoryName);
193 bool RemarkEngine::isAnalysisOptRemarkEnabled(StringRef
categoryName)
const {
194 return analysisFilter && analysisFilter->match(
categoryName);
197 bool RemarkEngine::isFailedOptRemarkEnabled(StringRef
categoryName)
const {
198 return failedFilter && failedFilter->match(
categoryName);
203 return emitIfEnabled<OptRemarkPass>(
loc, opts,
204 &RemarkEngine::isPassedOptRemarkEnabled);
209 return emitIfEnabled<OptRemarkMissed>(
210 loc, opts, &RemarkEngine::isMissedOptRemarkEnabled);
215 return emitIfEnabled<OptRemarkFailure>(
216 loc, opts, &RemarkEngine::isFailedOptRemarkEnabled);
221 return emitIfEnabled<OptRemarkAnalysis>(
222 loc, opts, &RemarkEngine::isAnalysisOptRemarkEnabled);
229 void RemarkEngine::reportImpl(
const Remark &remark) {
231 if (remarkStreamer) {
232 remarkStreamer->streamOptimizationRemark(remark);
236 if (printAsEmitRemarks)
241 if (remarkEmittingPolicy)
242 remarkEmittingPolicy->reportRemark(remark);
246 if (remarkEmittingPolicy)
247 remarkEmittingPolicy->finalize();
250 remarkStreamer->finalize();
254 std::unique_ptr<MLIRRemarkStreamerBase> streamer,
255 std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
256 std::string *errMsg) {
258 remarkStreamer = std::move(streamer);
261 std::bind(&RemarkEngine::reportImpl,
this, std::placeholders::_1);
262 remarkEmittingPolicy->initialize(
ReportFn(std::move(reportFunc)));
264 this->remarkEmittingPolicy = std::move(remarkEmittingPolicy);
271 return s.starts_with(
"^") && s.ends_with(
"$");
278 return (llvm::Twine(
"^(") + filter +
")$").str();
284 static std::optional<llvm::Regex>
286 const std::optional<std::string> &specific) {
288 if (cats.
all && !cats.
all->empty())
289 parts.emplace_back(*cats.
all);
290 if (specific && !specific->empty())
291 parts.emplace_back(*specific);
296 std::string joined = llvm::join(parts,
"|");
299 llvm::Regex rx(anchored);
301 if (!rx.isValid(err))
304 return std::make_optional<llvm::Regex>(std::move(rx));
309 : printAsEmitRemarks(printAsEmitRemarks) {
321 MLIRContext &ctx, std::unique_ptr<detail::MLIRRemarkStreamerBase> streamer,
322 std::unique_ptr<detail::RemarkEmittingPolicyBase> remarkEmittingPolicy,
325 std::make_unique<detail::RemarkEngine>(printAsEmitRemarks, cats);
328 if (
failed(engine->initialize(std::move(streamer),
329 std::move(remarkEmittingPolicy), &errMsg))) {
330 llvm::report_fatal_error(
331 llvm::Twine(
"Failed to initialize remark engine. Error: ") + errMsg);
@ Failure
Op failed to vectorize.
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.