[Lldb-commits] [lldb] [lldb] Print "0x0" for bitfield like enums where the value is 0 (PR #97557)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 3 04:22:24 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: David Spickett (DavidSpickett)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/97557.diff
2 Files Affected:
- (modified) lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp (+9-1)
- (modified) lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp (+3-3)
``````````diff
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"},
``````````
</details>
https://github.com/llvm/llvm-project/pull/97557
More information about the lldb-commits
mailing list