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() <<
":"
94 llvm::raw_string_ostream os(s);
113 llvm_unreachable(
"Unknown remark kind");
119 return llvm::remarks::Type::Unknown;
121 return llvm::remarks::Type::Passed;
123 return llvm::remarks::Type::Missed;
127 return llvm::remarks::Type::Analysis;
129 llvm_unreachable(
"Unknown remark kind");
133 auto locLambda = [&]() -> llvm::remarks::RemarkLocation {
134 if (
auto flc = dyn_cast<FileLineColLoc>(
getLocation()))
135 return {flc.getFilename(), flc.getLine(), flc.getColumn()};
136 return {
"<unknown file>", 0, 0};
139 llvm::remarks::Remark r;
147 r.Args.emplace_back();
148 r.Args.back().Key = arg.key;
149 r.Args.back().Val = arg.val;
160 owner->report(std::move(*remark));
168 template <
typename RemarkT,
typename... Args>
170 static_assert(std::is_base_of_v<Remark, RemarkT>,
171 "RemarkT must derive from Remark");
173 std::make_unique<RemarkT>(std::forward<Args>(
args)...));
176 template <
typename RemarkT>
180 return (this->*isEnabled)(opts.
categoryName) ? makeRemark<RemarkT>(
loc, opts)
184 bool RemarkEngine::isMissedOptRemarkEnabled(StringRef
categoryName)
const {
188 bool RemarkEngine::isPassedOptRemarkEnabled(StringRef
categoryName)
const {
189 return passedFilter && passedFilter->match(
categoryName);
192 bool RemarkEngine::isAnalysisOptRemarkEnabled(StringRef
categoryName)
const {
193 return analysisFilter && analysisFilter->match(
categoryName);
196 bool RemarkEngine::isFailedOptRemarkEnabled(StringRef
categoryName)
const {
197 return failedFilter && failedFilter->match(
categoryName);
202 return emitIfEnabled<OptRemarkPass>(
loc, opts,
203 &RemarkEngine::isPassedOptRemarkEnabled);
208 return emitIfEnabled<OptRemarkMissed>(
209 loc, opts, &RemarkEngine::isMissedOptRemarkEnabled);
214 return emitIfEnabled<OptRemarkFailure>(
215 loc, opts, &RemarkEngine::isFailedOptRemarkEnabled);
220 return emitIfEnabled<OptRemarkAnalysis>(
221 loc, opts, &RemarkEngine::isAnalysisOptRemarkEnabled);
231 remarkStreamer->streamOptimizationRemark(remark);
234 if (printAsEmitRemarks)
235 emitRemark(remark.getLocation(), remark.getMsg());
240 remarkStreamer->finalize();
245 std::string *errMsg) {
247 remarkStreamer = std::move(streamer);
253 : printAsEmitRemarks(printAsEmitRemarks) {
255 passedFilter = llvm::Regex(cats.
passed.value());
257 missFilter = llvm::Regex(cats.
missed.value());
259 analysisFilter = llvm::Regex(cats.
analysis.value());
261 failedFilter = llvm::Regex(cats.
failed.value());
266 std::unique_ptr<remark::detail::MLIRRemarkStreamerBase> streamer,
269 std::make_unique<remark::detail::RemarkEngine>(printAsEmitRemarks, cats);
272 if (
failed(engine->initialize(std::move(streamer), &errMsg))) {
273 llvm::report_fatal_error(
274 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.