gdb: change print format of flag enums with value 0

If a flag enum has value 0 and the enumeration type does not have an
enumerator with value 0, we currently print:

  $1 = (unknown: 0x0)

I don't like the display of "unknown" here, since for flags, 0 is a
an expected value.  It just means that no flags are set.  This patch
makes it so that we print it as a simple 0 in this situation:

  $1 = 0

If there is an enumerator with value 0, it is still printed using that
enumerator, for example (from the test):

  $1 = FE_NONE

gdb/ChangeLog:

	* valprint.c (generic_val_print_enum_1): When printing a flag
	enum with value 0 and there is no enumerator with value 0, print
	just "0" instead of "(unknown: 0x0)".

gdb/testsuite/ChangeLog:

	* gdb.base/printcmds.exp (test_print_enums): Update expected
	output.
This commit is contained in:
Simon Marchi 2020-02-18 17:30:51 -05:00
parent b29a2df000
commit 373d7ac0f1
4 changed files with 36 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2020-02-18 Simon Marchi <simon.marchi@efficios.com>
* valprint.c (generic_val_print_enum_1): When printing a flag
enum with value 0 and there is no enumerator with value 0, print
just "0" instead of "(unknown: 0x0)".
2020-02-18 Simon Marchi <simon.marchi@efficios.com>
* valprint.c (generic_val_print_enum_1): Print unknown part of

View File

@ -1,3 +1,8 @@
2020-02-18 Simon Marchi <simon.marchi@efficios.com>
* gdb.base/printcmds.exp (test_print_enums): Update expected
output.
2020-02-18 Simon Marchi <simon.marchi@efficios.com>
* gdb.base/printcmds.exp (test_print_enums): Expect hex values

View File

@ -743,7 +743,7 @@ proc test_print_enums {} {
gdb_test "print (enum flag_enum) 0x0" [string_to_regexp " = FE_NONE"]
# Print a flag enum with value 0, where no enumerator has value 0.
gdb_test "print flag_enum_without_zero" [string_to_regexp " = (unknown: 0x0)"]
gdb_test "print flag_enum_without_zero" [string_to_regexp " = 0"]
# Print a flag enum with unknown bits set.
gdb_test "print (enum flag_enum) 0xf1" [string_to_regexp " = (FE_ONE | unknown: 0xf0)"]

View File

@ -635,7 +635,6 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
appropriate. The enum may have multiple enumerators representing
the same bit, in which case we choose to only print the first one
we find. */
fputs_filtered ("(", stream);
for (i = 0; i < len; ++i)
{
QUIT;
@ -647,24 +646,42 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
if ((val & enumval) != 0)
{
if (!first)
if (first)
{
fputs_filtered ("(", stream);
first = 0;
}
else
fputs_filtered (" | ", stream);
first = 0;
val &= ~TYPE_FIELD_ENUMVAL (type, i);
fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
}
}
if (first || val != 0)
if (val != 0)
{
if (!first)
/* There are leftover bits, print them. */
if (first)
fputs_filtered ("(", stream);
else
fputs_filtered (" | ", stream);
fputs_filtered ("unknown: 0x", stream);
print_longest (stream, 'x', 0, val);
fputs_filtered (")", stream);
}
else if (first)
{
/* Nothing has been printed and the value is 0, the enum value must
have been 0. */
fputs_filtered ("0", stream);
}
else
{
/* Something has been printed, close the parenthesis. */
fputs_filtered (")", stream);
}
fputs_filtered (")", stream);
}
else
print_longest (stream, 'd', 0, val);