13 #ifndef MLIR_IR_REMARKS_H
14 #define MLIR_IR_REMARKS_H
16 #include "llvm/ADT/StringExtras.h"
17 #include "llvm/IR/DiagnosticInfo.h"
18 #include "llvm/Remarks/Remark.h"
19 #include "llvm/Support/FormatVariadic.h"
20 #include "llvm/Support/Regex.h"
70 return {remarkName, v, subCategoryName, functionName};
74 return {remarkName, categoryName, v, functionName};
78 return {remarkName, categoryName, subCategoryName, v};
108 Arg(llvm::StringRef k, llvm::StringRef v) :
key(k),
val(v) {}
109 Arg(llvm::StringRef k, std::string v) :
key(k),
val(std::move(v)) {}
110 Arg(llvm::StringRef k,
const char *v) :
Arg(k,
llvm::StringRef(v)) {}
112 Arg(llvm::StringRef k,
Type t);
113 Arg(llvm::StringRef k,
bool b) :
key(k),
val(b ?
"true" :
"false") {}
116 template <
typename T,
typename = std::enable_if_t<std::is_arithmetic_v<T> &&
117 !std::is_same_v<T,
bool>>>
119 if constexpr (std::is_floating_point_v<T>) {
120 llvm::raw_string_ostream os(
val);
122 }
else if constexpr (std::is_signed_v<T>) {
123 val = llvm::itostr(
static_cast<long long>(v));
125 val = llvm::utostr(
static_cast<unsigned long long>(v));
130 void insert(llvm::StringRef s);
133 void print(llvm::raw_ostream &os,
bool printLocation =
false)
const;
142 return "<unknown function>";
159 return "<unknown remark name>";
163 std::string
getMsg()
const;
200 return llvm::DiagnosticSeverity::DS_Note;
202 return llvm::DiagnosticSeverity::DS_Warning;
204 return llvm::DiagnosticSeverity::DS_Error;
206 return llvm::DiagnosticSeverity::DS_Remark;
208 llvm_unreachable(
"Unknown diagnostic severity");
214 return llvm::DiagnosticKind::DK_Generic;
216 return llvm::DiagnosticKind::DK_OptimizationRemark;
218 return llvm::DiagnosticKind::DK_OptimizationRemarkMissed;
220 return llvm::DiagnosticKind::DK_OptimizationFailure;
222 return llvm::DiagnosticKind::DK_OptimizationRemarkAnalysis;
224 llvm_unreachable(
"Unknown diagnostic kind");
245 template <RemarkKind K, DiagnosticSeverity S>
284 : remark(std::move(
diag)) {}
287 : owner(&eng), remark(std::move(
diag)) {}
298 template <
typename T,
typename = std::enable_if_t<
302 *remark << std::forward<T>(arg);
306 explicit operator bool()
const {
return remark !=
nullptr; }
317 std::unique_ptr<Remark> remark;
349 std::optional<llvm::Regex> missFilter;
351 std::optional<llvm::Regex> passedFilter;
353 std::optional<llvm::Regex> analysisFilter;
355 std::optional<llvm::Regex> failedFilter;
357 std::unique_ptr<MLIRRemarkStreamerBase> remarkStreamer;
359 bool printAsEmitRemarks =
false;
363 bool isMissedOptRemarkEnabled(StringRef categoryName)
const;
367 bool isPassedOptRemarkEnabled(StringRef categoryName)
const;
371 bool isAnalysisOptRemarkEnabled(StringRef categoryName)
const;
375 bool isFailedOptRemarkEnabled(StringRef categoryName)
const;
378 bool isAnyRemarkEnabled(StringRef categoryName)
const {
379 return isMissedOptRemarkEnabled(categoryName) ||
380 isPassedOptRemarkEnabled(categoryName) ||
381 isFailedOptRemarkEnabled(categoryName) ||
382 isAnalysisOptRemarkEnabled(categoryName);
388 template <
typename RemarkT,
typename... Args>
391 template <
typename RemarkT>
410 LogicalResult
initialize(std::unique_ptr<MLIRRemarkStreamerBase> streamer,
411 std::string *errMsg);
433 template <
typename Fn,
typename... Args>
439 if (LLVM_UNLIKELY(enginePtr))
440 return (enginePtr->*fn)(loc, std::forward<Args>(args)...);
450 template <
class... Ts>
452 return {
"Reason", [=] {
return llvm::formatv(fmt, ts...).str(); }};
456 template <
class... Ts>
458 return {
"Suggestion", [=] {
return llvm::formatv(fmt, ts...).str(); }};
462 template <
class... Ts>
464 return {
"Remark", [=] {
return llvm::formatv(fmt, ts...).str(); }};
469 using DV = std::decay_t<V>;
470 return {key, [key, vv = DV(std::forward<V>(v))]()
mutable {
515 std::unique_ptr<remark::detail::MLIRRemarkStreamerBase> streamer,
static std::string diag(const llvm::Value &value)
MLIRContext * getContext() const
Return the context this attribute belongs to.
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.
remark::detail::RemarkEngine * getRemarkEngine()
Returns the remark engine for this context, or nullptr if none has been set.
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...
The OpAsmOpInterface, see OpAsmInterface.td for more details.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.