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 =
getLocation()->findInstanceOf<FileLineColLoc>()) {
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 {
142 if (
auto flc =
getLocation()->findInstanceOf<FileLineColLoc>())
143 return {flc.getFilename(), flc.getLine(), flc.getColumn()};
144 return {
"<unknown file>", 0, 0};
147 llvm::remarks::Remark r;
156 r.Args.emplace_back();
157 r.Args.back().Key = arg.key;
158 r.Args.back().Val = arg.val;
169 owner->report(std::move(*remark));
177template <
typename RemarkT>
179 static_assert(std::is_base_of_v<Remark, RemarkT>,
180 "RemarkT must derive from Remark");
181 auto remark = std::make_unique<RemarkT>(
loc, opts);
182 remark->setId(generateRemarkId());
186template <
typename RemarkT>
190 return (this->*isEnabled)(opts.
categoryName) ? makeRemark<RemarkT>(
loc, opts)
199 return passedFilter && passedFilter->match(
categoryName);
203 return analysisFilter && analysisFilter->match(
categoryName);
207 return failedFilter && failedFilter->match(
categoryName);
224 llvm_unreachable(
"Unknown remark kind");
229 return emitIfEnabled<OptRemarkPass>(
loc, opts,
235 return emitIfEnabled<OptRemarkMissed>(
241 return emitIfEnabled<OptRemarkFailure>(
247 return emitIfEnabled<OptRemarkAnalysis>(
257 if (remarkStreamer) {
258 remarkStreamer->streamOptimizationRemark(
remark);
262 if (printAsEmitRemarks)
267 if (remarkEmittingPolicy)
268 remarkEmittingPolicy->reportRemark(
remark);
272 if (remarkEmittingPolicy)
273 remarkEmittingPolicy->finalize();
276 remarkStreamer->finalize();
280 std::unique_ptr<MLIRRemarkStreamerBase> streamer,
281 std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
282 std::string *errMsg) {
283 remarkStreamer = std::move(streamer);
285 auto reportFunc = llvm::bind_front<&RemarkEngine::reportImpl>(
this);
286 remarkEmittingPolicy->initialize(
ReportFn(std::move(reportFunc)));
288 this->remarkEmittingPolicy = std::move(remarkEmittingPolicy);
295 return s.starts_with(
"^") && s.ends_with(
"$");
302 return (llvm::Twine(
"^(") + filter +
")$").str();
308static std::optional<llvm::Regex>
310 const std::optional<std::string> &specific) {
312 if (cats.
all && !cats.
all->empty())
313 parts.emplace_back(*cats.
all);
314 if (specific && !specific->empty())
315 parts.emplace_back(*specific);
320 std::string joined = llvm::join(parts,
"|");
323 llvm::Regex rx(anchored);
325 if (!rx.isValid(err))
328 return std::make_optional<llvm::Regex>(std::move(rx));
333 : printAsEmitRemarks(printAsEmitRemarks) {
345 MLIRContext &ctx, std::unique_ptr<detail::MLIRRemarkStreamerBase> streamer,
346 std::unique_ptr<detail::RemarkEmittingPolicyBase> remarkEmittingPolicy,
349 std::make_unique<detail::RemarkEngine>(printAsEmitRemarks, cats);
352 if (
failed(engine->initialize(std::move(streamer),
353 std::move(remarkEmittingPolicy), &errMsg))) {
354 llvm::report_fatal_error(
355 llvm::Twine(
"Failed to initialize remark engine. Error: ") + errMsg);
371 assert(
reportImpl &&
"reportImpl is not set");
377 std::vector<detail::Remark> remarks(postponedRemarks.begin(),
378 postponedRemarks.end());
379 postponedRemarks.clear();
380 llvm::sort(remarks, [](
const auto &lhs,
const auto &rhs) {
381 return lhs.getId().getValue() < rhs.getId().getValue();
388 for (
const auto &
remark : remarks) {
391 for (
auto relId :
remark.getRelatedRemarkIds())
392 childIds.insert(relId.getValue());
399 for (
const auto &
remark : remarks) {
400 if (
remark.getId() && childIds.contains(
remark.getId().getValue()))
406 for (
auto relId :
remark.getRelatedRemarkIds()) {
407 if (
const auto *related = idMap.lookup(relId.getValue()))
if(failed(verifyVectorMemoryOp(getOperation(), memrefType, getVectorType()))) return failure()
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.