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;
154 r.Args.emplace_back();
155 r.Args.back().Key = arg.key;
156 r.Args.back().Val = arg.val;
167 owner->report(std::move(*remark));
175template <
typename RemarkT>
177 static_assert(std::is_base_of_v<Remark, RemarkT>,
178 "RemarkT must derive from Remark");
179 auto remark = std::make_unique<RemarkT>(
loc, opts);
180 remark->setId(generateRemarkId());
184template <
typename RemarkT>
188 return (this->*isEnabled)(opts.
categoryName) ? makeRemark<RemarkT>(
loc, opts)
197 return passedFilter && passedFilter->match(
categoryName);
201 return analysisFilter && analysisFilter->match(
categoryName);
205 return failedFilter && failedFilter->match(
categoryName);
222 llvm_unreachable(
"Unknown remark kind");
227 return emitIfEnabled<OptRemarkPass>(
loc, opts,
233 return emitIfEnabled<OptRemarkMissed>(
239 return emitIfEnabled<OptRemarkFailure>(
245 return emitIfEnabled<OptRemarkAnalysis>(
255 if (remarkStreamer) {
256 remarkStreamer->streamOptimizationRemark(
remark);
260 if (printAsEmitRemarks)
265 if (remarkEmittingPolicy)
266 remarkEmittingPolicy->reportRemark(
remark);
270 if (remarkEmittingPolicy)
271 remarkEmittingPolicy->finalize();
274 remarkStreamer->finalize();
278 std::unique_ptr<MLIRRemarkStreamerBase> streamer,
279 std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
280 std::string *errMsg) {
281 remarkStreamer = std::move(streamer);
283 auto reportFunc = llvm::bind_front<&RemarkEngine::reportImpl>(
this);
284 remarkEmittingPolicy->initialize(
ReportFn(std::move(reportFunc)));
286 this->remarkEmittingPolicy = std::move(remarkEmittingPolicy);
293 return s.starts_with(
"^") && s.ends_with(
"$");
300 return (llvm::Twine(
"^(") + filter +
")$").str();
306static std::optional<llvm::Regex>
308 const std::optional<std::string> &specific) {
310 if (cats.
all && !cats.
all->empty())
311 parts.emplace_back(*cats.
all);
312 if (specific && !specific->empty())
313 parts.emplace_back(*specific);
318 std::string joined = llvm::join(parts,
"|");
321 llvm::Regex rx(anchored);
323 if (!rx.isValid(err))
326 return std::make_optional<llvm::Regex>(std::move(rx));
331 : printAsEmitRemarks(printAsEmitRemarks) {
343 MLIRContext &ctx, std::unique_ptr<detail::MLIRRemarkStreamerBase> streamer,
344 std::unique_ptr<detail::RemarkEmittingPolicyBase> remarkEmittingPolicy,
347 std::make_unique<detail::RemarkEngine>(printAsEmitRemarks, cats);
350 if (
failed(engine->initialize(std::move(streamer),
351 std::move(remarkEmittingPolicy), &errMsg))) {
352 llvm::report_fatal_error(
353 llvm::Twine(
"Failed to initialize remark engine. Error: ") + errMsg);
369 assert(
reportImpl &&
"reportImpl is not set");
375 for (
const auto &
remark : postponedRemarks) {
378 for (
auto relId :
remark.getRelatedRemarkIds())
379 childIds.insert(relId.getValue());
386 for (
const auto &
remark : postponedRemarks) {
387 if (
remark.getId() && childIds.count(
remark.getId().getValue()))
393 for (
auto relId :
remark.getRelatedRemarkIds()) {
394 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.