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)
192bool RemarkEngine::isMissedOptRemarkEnabled(StringRef
categoryName)
const {
196bool RemarkEngine::isPassedOptRemarkEnabled(StringRef
categoryName)
const {
197 return passedFilter && passedFilter->match(
categoryName);
200bool RemarkEngine::isAnalysisOptRemarkEnabled(StringRef
categoryName)
const {
201 return analysisFilter && analysisFilter->match(
categoryName);
204bool RemarkEngine::isFailedOptRemarkEnabled(StringRef
categoryName)
const {
205 return failedFilter && failedFilter->match(
categoryName);
210 return emitIfEnabled<OptRemarkPass>(
loc, opts,
211 &RemarkEngine::isPassedOptRemarkEnabled);
216 return emitIfEnabled<OptRemarkMissed>(
217 loc, opts, &RemarkEngine::isMissedOptRemarkEnabled);
222 return emitIfEnabled<OptRemarkFailure>(
223 loc, opts, &RemarkEngine::isFailedOptRemarkEnabled);
228 return emitIfEnabled<OptRemarkAnalysis>(
229 loc, opts, &RemarkEngine::isAnalysisOptRemarkEnabled);
238 if (remarkStreamer) {
239 remarkStreamer->streamOptimizationRemark(
remark);
243 if (printAsEmitRemarks)
248 if (remarkEmittingPolicy)
249 remarkEmittingPolicy->reportRemark(
remark);
253 if (remarkEmittingPolicy)
254 remarkEmittingPolicy->finalize();
257 remarkStreamer->finalize();
261 std::unique_ptr<MLIRRemarkStreamerBase> streamer,
262 std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
263 std::string *errMsg) {
264 remarkStreamer = std::move(streamer);
266 auto reportFunc = llvm::bind_front<&RemarkEngine::reportImpl>(
this);
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);
352 assert(
reportImpl &&
"reportImpl is not set");
358 for (
const auto &
remark : postponedRemarks) {
361 for (
auto relId :
remark.getRelatedRemarkIds())
362 childIds.insert(relId.getValue());
369 for (
const auto &
remark : postponedRemarks) {
370 if (
remark.getId() && childIds.count(
remark.getId().getValue()))
376 for (
auto relId :
remark.getRelatedRemarkIds()) {
377 if (
const auto *related = idMap.lookup(relId.getValue()))
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.