Skip to content

Commit

Permalink
[lldb] Print "0x0" for bitfield like enums where the value is 0 (llvm…
Browse files Browse the repository at this point in the history
…#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.
  • Loading branch information
DavidSpickett authored and lravenclaw committed Jul 3, 2024
1 parent 40b8d22 commit ecbf46c
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
10 changes: 9 additions & 1 deletion lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8693,6 +8693,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);
Expand All @@ -8717,7 +8724,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);

Expand Down
6 changes: 3 additions & 3 deletions lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,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}}, false),
{
{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"},
Expand Down

0 comments on commit ecbf46c

Please sign in to comment.