Author: David Spickett Date: 2024-07-03T14:48:48+01:00 New Revision: 31015240d366e4bf6f114856caa6e9ce90742b7f
URL: https://github.com/llvm/llvm-project/commit/31015240d366e4bf6f114856caa6e9ce90742b7f DIFF: https://github.com/llvm/llvm-project/commit/31015240d366e4bf6f114856caa6e9ce90742b7f.diff LOG: [lldb] Print "0x0" for bitfield like enums where the value is 0 (#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. Added: Modified: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 48fc9b199a5e1..f70efe5ed57e4 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -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); @@ -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); diff --git a/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp b/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp index 767f19872f858..af6fa55bab171 100644 --- a/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp +++ b/lldb/unittests/ValueObject/DumpValueObjectOptionsTests.cpp @@ -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"}, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits