[Lldb-commits] [lldb] [lldb] Return llvm::Expected from ListChannelCategories (PR #209468)
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 15 03:20:18 PDT 2026
https://github.com/DavidSpickett updated https://github.com/llvm/llvm-project/pull/209468
>From aaf1498fd49ed7b06ced48442032fdfac75fdd3c Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Mon, 29 Jun 2026 12:53:54 +0000
Subject: [PATCH] [lldb] Return llvm::Expected from ListChannelCategories
Expected<string> is equivalent to bool+stream, but harder
to misuse.
---
lldb/include/lldb/Utility/Log.h | 4 ++--
lldb/source/Commands/CommandObjectLog.cpp | 11 ++++++++---
lldb/source/Utility/Log.cpp | 17 +++++++++--------
lldb/unittests/Utility/LogTest.cpp | 21 +++++++--------------
4 files changed, 26 insertions(+), 27 deletions(-)
diff --git a/lldb/include/lldb/Utility/Log.h b/lldb/include/lldb/Utility/Log.h
index 636584dac3cce..1cd3e23381ff3 100644
--- a/lldb/include/lldb/Utility/Log.h
+++ b/lldb/include/lldb/Utility/Log.h
@@ -210,8 +210,8 @@ class Log final {
llvm::raw_ostream &output_stream,
llvm::raw_ostream &error_stream);
- static bool ListChannelCategories(llvm::StringRef channel,
- llvm::raw_ostream &stream);
+ static llvm::Expected<std::string>
+ ListChannelCategories(llvm::StringRef channel);
/// Returns the list of log channels.
static std::vector<llvm::StringRef> ListChannels();
diff --git a/lldb/source/Commands/CommandObjectLog.cpp b/lldb/source/Commands/CommandObjectLog.cpp
index 07abbbc919c7d..b2743611d3525 100644
--- a/lldb/source/Commands/CommandObjectLog.cpp
+++ b/lldb/source/Commands/CommandObjectLog.cpp
@@ -309,9 +309,14 @@ class CommandObjectLogList : public CommandObjectParsed {
result.SetStatus(eReturnStatusSuccessFinishResult);
} else {
bool success = true;
- for (const auto &entry : args.entries())
- success =
- success && Log::ListChannelCategories(entry.ref(), output_stream);
+ for (const auto &entry : args.entries()) {
+ auto err_or_list = Log::ListChannelCategories(entry.ref());
+ if (!err_or_list) {
+ success = false;
+ output_stream << toString(err_or_list.takeError());
+ } else
+ output_stream << *err_or_list;
+ }
if (success)
result.SetStatus(eReturnStatusSuccessFinishResult);
}
diff --git a/lldb/source/Utility/Log.cpp b/lldb/source/Utility/Log.cpp
index 2ed1444fbb5e6..dd813efb90f90 100644
--- a/lldb/source/Utility/Log.cpp
+++ b/lldb/source/Utility/Log.cpp
@@ -282,15 +282,16 @@ bool Log::DumpLogChannel(llvm::StringRef channel,
return true;
}
-bool Log::ListChannelCategories(llvm::StringRef channel,
- llvm::raw_ostream &stream) {
+llvm::Expected<std::string>
+Log::ListChannelCategories(llvm::StringRef channel) {
auto ch = g_channel_map->find(channel);
- if (ch == g_channel_map->end()) {
- stream << llvm::formatv("Invalid log channel '{0}'.\n", channel);
- return false;
- }
- ListCategories(stream, *ch);
- return true;
+ if (ch == g_channel_map->end())
+ return llvm::createStringErrorV("Invalid log channel '{0}'.\n", channel);
+
+ std::string categories;
+ llvm::raw_string_ostream strm(categories);
+ ListCategories(strm, *ch);
+ return categories;
}
void Log::DisableAllLogChannels() {
diff --git a/lldb/unittests/Utility/LogTest.cpp b/lldb/unittests/Utility/LogTest.cpp
index f8514930eac2b..6eaa318dfe34c 100644
--- a/lldb/unittests/Utility/LogTest.cpp
+++ b/lldb/unittests/Utility/LogTest.cpp
@@ -40,13 +40,6 @@ namespace lldb_private {
template <> Log::Channel &LogChannelFor<TestChannel>() { return test_channel; }
} // namespace lldb_private
-// Wrap list function to make it easier to test.
-static bool ListCategories(llvm::StringRef channel, std::string &result) {
- result.clear();
- llvm::raw_string_ostream result_stream(result);
- return Log::ListChannelCategories(channel, result_stream);
-}
-
namespace {
// A test fixture which provides tests with a pre-registered channel.
struct LogChannelTest : public ::testing::Test {
@@ -276,18 +269,18 @@ TEST_F(LogChannelTest, Disable) {
TEST_F(LogChannelTest, List) {
std::string list;
- EXPECT_TRUE(ListCategories("chan", list));
- std::string expected =
- R"(Logging categories for 'chan':
+ EXPECT_THAT_EXPECTED(Log::ListChannelCategories("chan"),
+ llvm::HasValue(
+ R"(Logging categories for 'chan':
all - all available logging categories
default - default set of logging categories
foo - log foo
bar - log bar
-)";
- EXPECT_EQ(expected, list);
+)"));
- EXPECT_FALSE(ListCategories("chanchan", list));
- EXPECT_EQ("Invalid log channel 'chanchan'.\n", list);
+ EXPECT_THAT_EXPECTED(
+ Log::ListChannelCategories("chanchan"),
+ llvm::FailedWithMessage("Invalid log channel 'chanchan'.\n"));
}
TEST_F(LogChannelEnabledTest, log_options) {
More information about the lldb-commits
mailing list