[llvm] c569c1f - [MLIR] Migrate pattern application / dialect conversion to the LDBG logging format (#150991)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 1 05:29:01 PDT 2025
Author: Mehdi Amini
Date: 2025-08-01T14:28:58+02:00
New Revision: c569c1f15fdd1e75e7ef15503f78d53029817d79
URL: https://github.com/llvm/llvm-project/commit/c569c1f15fdd1e75e7ef15503f78d53029817d79
DIFF: https://github.com/llvm/llvm-project/commit/c569c1f15fdd1e75e7ef15503f78d53029817d79.diff
LOG: [MLIR] Migrate pattern application / dialect conversion to the LDBG logging format (#150991)
This prefix the output with the DEBUG_TYPE.
Dialect conversion is using a ScopedPrinter, we insert the
raw_ldbg_ostream to consistently prefix each new line.
Added:
Modified:
llvm/include/llvm/Support/DebugLog.h
llvm/unittests/Support/DebugLogTest.cpp
mlir/lib/Rewrite/PatternApplicator.cpp
mlir/lib/Transforms/Utils/DialectConversion.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Support/DebugLog.h b/llvm/include/llvm/Support/DebugLog.h
index 8fca2d5e2816b..a3312950da94e 100644
--- a/llvm/include/llvm/Support/DebugLog.h
+++ b/llvm/include/llvm/Support/DebugLog.h
@@ -61,8 +61,10 @@ namespace llvm {
for (bool _c = \
(::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE, LEVEL)); \
_c; _c = false) \
+ for (::llvm::impl::RAIINewLineStream NewLineStream{(STREAM)}; _c; \
+ _c = false) \
::llvm::impl::raw_ldbg_ostream{ \
- ::llvm::impl::computePrefix(TYPE, FILE, LINE, LEVEL), (STREAM)} \
+ ::llvm::impl::computePrefix(TYPE, FILE, LINE, LEVEL), NewLineStream} \
.asLvalue()
#define DEBUGLOG_WITH_STREAM_TYPE_AND_FILE(STREAM, LEVEL, TYPE, FILE) \
@@ -81,14 +83,15 @@ namespace llvm {
namespace impl {
-/// A raw_ostream that tracks `\n` and print the prefix.
+/// A raw_ostream that tracks `\n` and print the prefix after each
+/// newline.
class LLVM_ABI raw_ldbg_ostream final : public raw_ostream {
std::string Prefix;
raw_ostream &Os;
- bool HasPendingNewline = true;
+ bool HasPendingNewline;
- /// Split the line on newlines and insert the prefix before each newline.
- /// Forward everything to the underlying stream.
+ /// Split the line on newlines and insert the prefix before each
+ /// newline. Forward everything to the underlying stream.
void write_impl(const char *Ptr, size_t Size) final {
auto Str = StringRef(Ptr, Size);
// Handle the initial prefix.
@@ -109,22 +112,18 @@ class LLVM_ABI raw_ldbg_ostream final : public raw_ostream {
}
void emitPrefix() { Os.write(Prefix.c_str(), Prefix.size()); }
void writeWithPrefix(StringRef Str) {
- if (HasPendingNewline) {
- emitPrefix();
- HasPendingNewline = false;
- }
+ flushEol();
Os.write(Str.data(), Str.size());
}
public:
- explicit raw_ldbg_ostream(std::string Prefix, raw_ostream &Os)
- : Prefix(std::move(Prefix)), Os(Os) {
+ explicit raw_ldbg_ostream(std::string Prefix, raw_ostream &Os,
+ bool HasPendingNewline = true)
+ : Prefix(std::move(Prefix)), Os(Os),
+ HasPendingNewline(HasPendingNewline) {
SetUnbuffered();
}
- ~raw_ldbg_ostream() final {
- flushEol();
- Os << '\n';
- }
+ ~raw_ldbg_ostream() final { flushEol(); }
void flushEol() {
if (HasPendingNewline) {
emitPrefix();
@@ -135,10 +134,22 @@ class LLVM_ABI raw_ldbg_ostream final : public raw_ostream {
/// Forward the current_pos method to the underlying stream.
uint64_t current_pos() const final { return Os.tell(); }
- /// Some of the `<<` operators expect an lvalue, so we trick the type system.
+ /// Some of the `<<` operators expect an lvalue, so we trick the type
+ /// system.
raw_ldbg_ostream &asLvalue() { return *this; }
};
+/// A raw_ostream that prints a newline on destruction, useful for LDBG()
+class RAIINewLineStream final : public raw_ostream {
+ raw_ostream &Os;
+
+public:
+ RAIINewLineStream(raw_ostream &Os) : Os(Os) { SetUnbuffered(); }
+ ~RAIINewLineStream() { Os << '\n'; }
+ void write_impl(const char *Ptr, size_t Size) final { Os.write(Ptr, Size); }
+ uint64_t current_pos() const final { return Os.tell(); }
+};
+
/// Remove the path prefix from the file name.
static LLVM_ATTRIBUTE_UNUSED constexpr const char *
getShortFileName(const char *path) {
diff --git a/llvm/unittests/Support/DebugLogTest.cpp b/llvm/unittests/Support/DebugLogTest.cpp
index 0c464c16cf269..c24d1a5693169 100644
--- a/llvm/unittests/Support/DebugLogTest.cpp
+++ b/llvm/unittests/Support/DebugLogTest.cpp
@@ -121,7 +121,7 @@ TEST(DebugLogTest, StreamPrefix) {
EXPECT_EQ(os.str(), expected);
}
// After destructors, there was a pending newline for stream B.
- EXPECT_EQ(os.str(), expected + "\nPrefixB \n");
+ EXPECT_EQ(os.str(), expected + "PrefixB ");
}
#else
TEST(DebugLogTest, Basic) {
diff --git a/mlir/lib/Rewrite/PatternApplicator.cpp b/mlir/lib/Rewrite/PatternApplicator.cpp
index b2b372b7b1249..e13bcff2767ec 100644
--- a/mlir/lib/Rewrite/PatternApplicator.cpp
+++ b/mlir/lib/Rewrite/PatternApplicator.cpp
@@ -13,7 +13,7 @@
#include "mlir/Rewrite/PatternApplicator.h"
#include "ByteCode.h"
-#include "llvm/Support/Debug.h"
+#include "llvm/Support/DebugLog.h"
#ifndef NDEBUG
#include "llvm/ADT/ScopeExit.h"
@@ -51,9 +51,7 @@ static Operation *getDumpRootOp(Operation *op) {
return op;
}
static void logSucessfulPatternApplication(Operation *op) {
- llvm::dbgs() << "// *** IR Dump After Pattern Application ***\n";
- op->dump();
- llvm::dbgs() << "\n\n";
+ LDBG(2) << "// *** IR Dump After Pattern Application ***\n" << *op << "\n";
}
#endif
@@ -208,8 +206,8 @@ LogicalResult PatternApplicator::matchAndRewrite(
result =
bytecode->rewrite(rewriter, *pdlMatch, *mutableByteCodeState);
} else {
- LLVM_DEBUG(llvm::dbgs() << "Trying to match \""
- << bestPattern->getDebugName() << "\"\n");
+ LDBG() << "Trying to match \"" << bestPattern->getDebugName()
+ << "\"";
const auto *pattern =
static_cast<const RewritePattern *>(bestPattern);
@@ -223,9 +221,8 @@ LogicalResult PatternApplicator::matchAndRewrite(
[&] { rewriter.setListener(oldListener); });
#endif
result = pattern->matchAndRewrite(op, rewriter);
- LLVM_DEBUG(llvm::dbgs()
- << "\"" << bestPattern->getDebugName() << "\" result "
- << succeeded(result) << "\n");
+ LDBG() << " -> matchAndRewrite "
+ << (succeeded(result) ? "successful" : "failed");
}
// Process the result of the pattern application.
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index 08803e082b057..f23c6197accd5 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -20,6 +20,7 @@
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/DebugLog.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/ScopedPrinter.h"
@@ -1129,8 +1130,13 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
/// verification.
SmallPtrSet<Operation *, 1> pendingRootUpdates;
+ /// A raw output stream used to prefix the debug log.
+ llvm::impl::raw_ldbg_ostream os{(Twine("[") + DEBUG_TYPE + "] ").str(),
+ llvm::dbgs(), /*HasPendingNewline=*/false};
+
/// A logger used to emit diagnostics during the conversion process.
- llvm::ScopedPrinter logger{llvm::dbgs()};
+ llvm::ScopedPrinter logger{os};
+ std::string logPrefix;
#endif
};
} // namespace detail
More information about the llvm-commits
mailing list