https://github.com/DavidSpickett created 
https://github.com/llvm/llvm-project/pull/97557

Enums like this one are treated as bitfield like enums: enum FlagsLike {B=2, 
C=4};

lldb recognises them as collections of flags, so you can have "B | C". If 
there's any values not covered that's printed as hex "B | C | 0x1".

What happened if the value was 0 was we would not match any of the enumerators, 
then the remainder check requires that the remainder is non-zero. So lldb would 
print nothing at all.

Which I assume is a bug because knowing that no flags are set is useful, just 
as much as knowing that some unkown bit was set to make it non-zero.

>From 292d5a5bc7db56293e5f60c11d4ee5d439c9d9a4 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spick...@linaro.org>
Date: Wed, 3 Jul 2024 10:58:57 +0000
Subject: [PATCH] [lldb] Print "0x0" for bitfield like enums where the value is
 0

Enums like this one are treated as bitfield like enums:
enum FlagsLike {B=2, C=4};

lldb recognises them as collections of flags, so you can have
"B | C". If there's any values not covered that's printed
as hex "B | C | 0x1".

What happened if the value was 0 was we would not match any
of the enumerators, then the remainder check requires that
the remainder is non-zero. So lldb would print nothing at all.

Which I assume is a bug because knowing that no flags are set
is useful, just as much as knowing that some unkown bit was set
to make it non-zero.
---
 .../Plugins/TypeSystem/Clang/TypeSystemClang.cpp       | 10 +++++++++-
 .../ValueObject/DumpValueObjectOptionsTests.cpp        |  6 +++---
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp 
b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 093d27a92d718..560b042c75bb7 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -8680,6 +8680,13 @@ static bool DumpEnumValue(const clang::QualType 
&qual_type, Stream &s,
     return true;
   }
 
+  if (!enum_uvalue) {
+    // This is a bitfield enum, but the value is 0 so we know it won't match
+    // with any of the enumerators.
+    s.Printf("0x%" PRIx64, enum_uvalue);
+    return true;
+  }
+
   uint64_t remaining_value = enum_uvalue;
   std::vector<std::pair<uint64_t, llvm::StringRef>> values;
   values.reserve(num_enumerators);
@@ -8704,7 +8711,8 @@ static bool DumpEnumValue(const clang::QualType 
&qual_type, Stream &s,
       s.PutCString(" | ");
   }
 
-  // If there is a remainder that is not covered by the value, print it as hex.
+  // If there is a remainder that is not covered by the value, print it as
+  // hex.
   if (remaining_value)
     s.Printf("0x%" PRIx64, remaining_value);
 
diff --git a/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp 
b/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp
index 6cb982d7f5980..a7ccd74721f66 100644
--- a/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp
+++ b/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp
@@ -149,12 +149,12 @@ TEST_F(ValueObjectMockProcessTest, Enum) {
 TEST_F(ValueObjectMockProcessTest, BitFieldLikeEnum) {
   // These enumerators set individual bits in the value, as if it were a flag
   // set. lldb treats this as a "bitfield like enum". This means we show values
-  // as hex, a value of 0 shows nothing, and values with no exact enumerator 
are
-  // shown as combinations of the other values.
+  // as hex, and values without exact matches are shown as a combination of
+  // enumerators and any remaining value left over.
   TestDumpValueObject(
       MakeEnumType({{"test_2", 2}, {"test_4", 4}}),
       {
-          {0, {}, "(TestEnum) test_var =\n"},
+          {0, {}, "(TestEnum) test_var = 0x0\n"},
           {1, {}, "(TestEnum) test_var = 0x1\n"},
           {2, {}, "(TestEnum) test_var = test_2\n"},
           {4, {}, "(TestEnum) test_var = test_4\n"},

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to