[llvm] [llvm][support] Add LLVM_DLOG macro. (PR #143704)
Jacques Pienaar via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 11 07:09:34 PDT 2025
https://github.com/jpienaar updated https://github.com/llvm/llvm-project/pull/143704
>From 1b1dc55622118971bfd33cfafd9dfd20b736d09a Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jpienaar at google.com>
Date: Wed, 11 Jun 2025 13:39:30 +0000
Subject: [PATCH 1/2] [llvm][support] Add LLVM_DLOG macro.
Add macro that mirror a common usage of logging to output (e.g., one I
invariably end up creating locally often). This makes it easy to have
streaming log like behavior while still using the base debug logging.
I also wanted to avoid inventing a full logging library here while
enabling others to change the sink without too much pain, so put it in
its own header (this also avoids making Debug depend on raw_ostream
beyond forward reference). The should allow a consistent dev experience
without fixing the sink too much.
---
llvm/include/llvm/Support/DebugLog.h | 69 +++++++++++++++++++++++++
llvm/unittests/Support/DebugLogTest.cpp | 39 ++++++++++++++
2 files changed, 108 insertions(+)
create mode 100644 llvm/include/llvm/Support/DebugLog.h
create mode 100644 llvm/unittests/Support/DebugLogTest.cpp
diff --git a/llvm/include/llvm/Support/DebugLog.h b/llvm/include/llvm/Support/DebugLog.h
new file mode 100644
index 0000000000000..d83c951bd23e2
--- /dev/null
+++ b/llvm/include/llvm/Support/DebugLog.h
@@ -0,0 +1,69 @@
+//===- llvm/Support/DebugLog.h - Logging like debug output ------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// This file contains macros for logging like debug output. It builds upon the
+// support in Debug.h but provides a utility function for common debug output
+// style.
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_DEBUGLOG_H
+#define LLVM_SUPPORT_DEBUGLOG_H
+
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace llvm {
+#ifndef NDEBUG
+
+// Output with given inputs and trailing newline. E.g.,
+// LLVM_DLOG() << "Bitset contains: " << Bitset;
+// is equivalent to
+// LLVM_DEBUG(dbgs() << DEBUG_TYPE << " " << __FILE__ << ":" << __LINE__
+// << "] " << "Bitset contains: " << Bitset << "\n");
+#define LLVM_DLOG(...) \
+ DEBUGLOG_WITH_STREAM_AND_TYPE(llvm::dbgs(), DEBUG_TYPE, __VA_ARGS__)
+
+#define DEBUGLOG_WITH_STREAM_AND_TYPE(STREAM, TYPE, ...) \
+ for (bool _c = (::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE)); _c; \
+ _c = false) \
+ ::llvm::impl::LogWithNewline(TYPE, __FILE__, __LINE__, (STREAM))
+
+namespace impl {
+class LogWithNewline {
+public:
+ LogWithNewline(const char *debug_type, const char *file, int line,
+ raw_ostream &os)
+ : os(os) {
+ if (debug_type)
+ os << debug_type << " ";
+ os << file << ":" << line << "] ";
+ }
+ ~LogWithNewline() { os << '\n'; }
+ template <typename T> raw_ostream &operator<<(const T &t) && {
+ return os << t;
+ }
+
+ // Prevent copying, as this class manages newline responsibility and is
+ // intended for use as a temporary.
+ LogWithNewline(const LogWithNewline &) = delete;
+ LogWithNewline &operator=(const LogWithNewline &) = delete;
+ LogWithNewline &operator=(LogWithNewline &&) = delete;
+
+private:
+ raw_ostream &os;
+};
+} // end namespace impl
+#else
+// As others in Debug, When compiling without assertions, the -debug-* options
+// and all inputs too LLVM_DLOG() are ignored.
+#define LLVM_DLOG(...) \
+ for (bool _c = false; _c; _c = false) \
+ ::llvm::nulls()
+#endif
+} // end namespace llvm
+
+#endif // LLVM_SUPPORT_DEBUGLOG_H
diff --git a/llvm/unittests/Support/DebugLogTest.cpp b/llvm/unittests/Support/DebugLogTest.cpp
new file mode 100644
index 0000000000000..84208f5dc7e40
--- /dev/null
+++ b/llvm/unittests/Support/DebugLogTest.cpp
@@ -0,0 +1,39 @@
+//===- llvm/unittest/Support/DebugLogTest.cpp ------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/DebugLog.h"
+#include "llvm/Support/raw_ostream.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include <string>
+using namespace llvm;
+using testing::HasSubstr;
+
+#ifndef NDEBUG
+TEST(DebugLogTest, Basic) {
+ std::string s1, s2;
+ raw_string_ostream os1(s1), os2(s2);
+ static const char *DT[] = {"A", "B"};
+
+ llvm::DebugFlag = true;
+ setCurrentDebugTypes(DT, 2);
+ DEBUGLOG_WITH_STREAM_AND_TYPE(os1, "A") << "A";
+ DEBUGLOG_WITH_STREAM_AND_TYPE(os1, "B") << "B";
+ EXPECT_THAT(os1.str(), AllOf(HasSubstr("A\n"), HasSubstr("B\n")));
+
+ setCurrentDebugType("A");
+ volatile int x = 0;
+ if (x == 0)
+ DEBUGLOG_WITH_STREAM_AND_TYPE(os2, "A") << "A";
+ else
+ DEBUGLOG_WITH_STREAM_AND_TYPE(os2, "A") << "B";
+ DEBUGLOG_WITH_STREAM_AND_TYPE(os2, "B") << "B";
+ EXPECT_THAT(os2.str(), AllOf(HasSubstr("A\n"), Not(HasSubstr("B\n"))));
+}
+#endif
>From 457eaf2191b4d1f205186095bc1c6d26308a3bc4 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jpienaar at google.com>
Date: Wed, 11 Jun 2025 14:09:20 +0000
Subject: [PATCH 2/2] Fix formatting
---
llvm/unittests/Support/DebugLogTest.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/unittests/Support/DebugLogTest.cpp b/llvm/unittests/Support/DebugLogTest.cpp
index 84208f5dc7e40..61f90ee2cdd21 100644
--- a/llvm/unittests/Support/DebugLogTest.cpp
+++ b/llvm/unittests/Support/DebugLogTest.cpp
@@ -1,4 +1,5 @@
-//===- llvm/unittest/Support/DebugLogTest.cpp ------------------------------===//
+//===- llvm/unittest/Support/DebugLogTest.cpp
+//------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
More information about the llvm-commits
mailing list