24
24
#include " mlir/IR/MLIRContext.h"
25
25
#include " mlir/IR/Value.h"
26
26
27
- #include < functional>
28
-
29
27
namespace mlir ::remark {
30
28
31
29
// / Define an the set of categories to accept. By default none are, the provided
@@ -146,7 +144,7 @@ class Remark {
146
144
147
145
llvm::StringRef getCategoryName () const { return categoryName; }
148
146
149
- llvm::StringRef getCombinedCategoryName () const {
147
+ llvm::StringRef getFullCategoryName () const {
150
148
if (categoryName.empty () && subCategoryName.empty ())
151
149
return {};
152
150
if (subCategoryName.empty ())
@@ -320,7 +318,7 @@ class InFlightRemark {
320
318
};
321
319
322
320
// ===----------------------------------------------------------------------===//
323
- // Pluggable Remark Utilities
321
+ // MLIR Remark Streamer
324
322
// ===----------------------------------------------------------------------===//
325
323
326
324
// / Base class for MLIR remark streamers that is used to stream
@@ -340,26 +338,6 @@ class MLIRRemarkStreamerBase {
340
338
virtual void finalize () {} // optional
341
339
};
342
340
343
- using ReportFn = llvm::unique_function<void (const Remark &)>;
344
-
345
- // / Base class for MLIR remark emitting policies that is used to emit
346
- // / optimization remarks to the underlying remark streamer. The derived classes
347
- // / should implement the `reportRemark` method to provide the actual emitting
348
- // / implementation.
349
- class RemarkEmittingPolicyBase {
350
- protected:
351
- ReportFn reportImpl;
352
-
353
- public:
354
- RemarkEmittingPolicyBase () = default ;
355
- virtual ~RemarkEmittingPolicyBase () = default ;
356
-
357
- void initialize (ReportFn fn) { reportImpl = std::move (fn); }
358
-
359
- virtual void reportRemark (const Remark &remark) = 0;
360
- virtual void finalize () = 0;
361
- };
362
-
363
341
// ===----------------------------------------------------------------------===//
364
342
// Remark Engine (MLIR Context will own this class)
365
343
// ===----------------------------------------------------------------------===//
@@ -377,8 +355,6 @@ class RemarkEngine {
377
355
std::optional<llvm::Regex> failedFilter;
378
356
// / The MLIR remark streamer that will be used to emit the remarks.
379
357
std::unique_ptr<MLIRRemarkStreamerBase> remarkStreamer;
380
- // / The MLIR remark policy that will be used to emit the remarks.
381
- std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy;
382
358
// / When is enabled, engine also prints remarks as mlir::emitRemarks.
383
359
bool printAsEmitRemarks = false ;
384
360
@@ -416,8 +392,6 @@ class RemarkEngine {
416
392
InFlightRemark emitIfEnabled (Location loc, RemarkOpts opts,
417
393
bool (RemarkEngine::*isEnabled)(StringRef)
418
394
const );
419
- // / Report a remark.
420
- void reportImpl (const Remark &remark);
421
395
422
396
public:
423
397
// / Default constructor is deleted, use the other constructor.
@@ -433,10 +407,8 @@ class RemarkEngine {
433
407
~RemarkEngine ();
434
408
435
409
// / Setup the remark engine with the given output path and format.
436
- LogicalResult
437
- initialize (std::unique_ptr<MLIRRemarkStreamerBase> streamer,
438
- std::unique_ptr<RemarkEmittingPolicyBase> remarkEmittingPolicy,
439
- std::string *errMsg);
410
+ LogicalResult initialize (std::unique_ptr<MLIRRemarkStreamerBase> streamer,
411
+ std::string *errMsg);
440
412
441
413
// / Report a remark.
442
414
void report (const Remark &&remark);
@@ -474,54 +446,6 @@ inline InFlightRemark withEngine(Fn fn, Location loc, Args &&...args) {
474
446
475
447
namespace mlir ::remark {
476
448
477
- // ===----------------------------------------------------------------------===//
478
- // Remark Emitting Policies
479
- // ===----------------------------------------------------------------------===//
480
-
481
- // / Policy that emits all remarks.
482
- class RemarkEmittingPolicyAll : public detail ::RemarkEmittingPolicyBase {
483
- public:
484
- RemarkEmittingPolicyAll ();
485
-
486
- void reportRemark (const detail::Remark &remark) override {
487
- reportImpl (remark);
488
- }
489
- void finalize () override {}
490
- };
491
-
492
- // / Policy that emits final remarks.
493
- class RemarkEmittingPolicyFinal : public detail ::RemarkEmittingPolicyBase {
494
- private:
495
- // / user can intercept them for custom processing via a registered callback,
496
- // / otherwise they will be reported on engine destruction.
497
- llvm::DenseSet<detail::Remark> postponedRemarks;
498
- // / Optional user callback for intercepting postponed remarks.
499
- std::function<void (const detail::Remark &)> postponedRemarkCallback;
500
-
501
- public:
502
- RemarkEmittingPolicyFinal ();
503
-
504
- // / Register a callback to intercept postponed remarks before they are
505
- // / reported. The callback will be invoked for each postponed remark in
506
- // / finalize().
507
- void
508
- setPostponedRemarkCallback (std::function<void (const detail::Remark &)> cb) {
509
- postponedRemarkCallback = std::move (cb);
510
- }
511
-
512
- void reportRemark (const detail::Remark &remark) override {
513
- postponedRemarks.erase (remark);
514
- postponedRemarks.insert (remark);
515
- }
516
- void finalize () override {
517
- for (auto &remark : postponedRemarks) {
518
- if (postponedRemarkCallback)
519
- postponedRemarkCallback (remark);
520
- reportImpl (remark);
521
- }
522
- }
523
- };
524
-
525
449
// / Create a Reason with llvm::formatv formatting.
526
450
template <class ... Ts>
527
451
inline detail::LazyTextBuild reason (const char *fmt, Ts &&...ts) {
@@ -581,72 +505,16 @@ inline detail::InFlightRemark analysis(Location loc, RemarkOpts opts) {
581
505
582
506
// / Setup remarks for the context. This function will enable the remark engine
583
507
// / and set the streamer to be used for optimization remarks. The remark
584
- // / categories are used to filter the remarks that will be emitted by the
585
- // / remark engine. If a category is not specified, it will not be emitted. If
508
+ // / categories are used to filter the remarks that will be emitted by the remark
509
+ // / engine. If a category is not specified, it will not be emitted. If
586
510
// / `printAsEmitRemarks` is true, the remarks will be printed as
587
511
// / mlir::emitRemarks. 'streamer' must inherit from MLIRRemarkStreamerBase and
588
512
// / will be used to stream the remarks.
589
513
LogicalResult enableOptimizationRemarks (
590
514
MLIRContext &ctx,
591
515
std::unique_ptr<remark::detail::MLIRRemarkStreamerBase> streamer,
592
- std::unique_ptr<remark::detail::RemarkEmittingPolicyBase>
593
- remarkEmittingPolicy,
594
516
const remark::RemarkCategories &cats, bool printAsEmitRemarks = false );
595
517
596
518
} // namespace mlir::remark
597
519
598
- // DenseMapInfo specialization for Remark
599
- namespace llvm {
600
- template <>
601
- struct DenseMapInfo <mlir::remark::detail::Remark> {
602
- static constexpr StringRef kEmptyKey = " <EMPTY_KEY>" ;
603
- static constexpr StringRef kTombstoneKey = " <TOMBSTONE_KEY>" ;
604
-
605
- // / Helper to provide a static dummy context for sentinel keys.
606
- static mlir::MLIRContext *getStaticDummyContext () {
607
- static mlir::MLIRContext dummyContext;
608
- return &dummyContext;
609
- }
610
-
611
- // / Create an empty remark
612
- static inline mlir::remark::detail::Remark getEmptyKey () {
613
- return mlir::remark::detail::Remark (
614
- mlir::remark::RemarkKind::RemarkUnknown, mlir::DiagnosticSeverity::Note,
615
- mlir::UnknownLoc::get (getStaticDummyContext ()),
616
- mlir::remark::RemarkOpts::name (kEmptyKey ));
617
- }
618
-
619
- // / Create a dead remark
620
- static inline mlir::remark::detail::Remark getTombstoneKey () {
621
- return mlir::remark::detail::Remark (
622
- mlir::remark::RemarkKind::RemarkUnknown, mlir::DiagnosticSeverity::Note,
623
- mlir::UnknownLoc::get (getStaticDummyContext ()),
624
- mlir::remark::RemarkOpts::name (kTombstoneKey ));
625
- }
626
-
627
- // / Compute the hash value of the remark
628
- static unsigned getHashValue (const mlir::remark::detail::Remark &remark) {
629
- return llvm::hash_combine (
630
- remark.getLocation ().getAsOpaquePointer (),
631
- llvm::hash_value (remark.getRemarkName ()),
632
- llvm::hash_value (remark.getCombinedCategoryName ()));
633
- }
634
-
635
- static bool isEqual (const mlir::remark::detail::Remark &lhs,
636
- const mlir::remark::detail::Remark &rhs) {
637
- // Check for empty/tombstone keys first
638
- if (lhs.getRemarkName () == kEmptyKey ||
639
- lhs.getRemarkName () == kTombstoneKey ||
640
- rhs.getRemarkName () == kEmptyKey ||
641
- rhs.getRemarkName () == kTombstoneKey ) {
642
- return lhs.getRemarkName () == rhs.getRemarkName ();
643
- }
644
-
645
- // For regular remarks, compare key identifying fields
646
- return lhs.getLocation () == rhs.getLocation () &&
647
- lhs.getRemarkName () == rhs.getRemarkName () &&
648
- lhs.getCombinedCategoryName () == rhs.getCombinedCategoryName ();
649
- }
650
- };
651
- } // namespace llvm
652
520
#endif // MLIR_IR_REMARKS_H
0 commit comments