From 373d7ac0f158764e32d621b4d311771189001f1c Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Tue, 18 Feb 2020 17:30:51 -0500 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 ++++++ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.base/printcmds.exp | 2 +- gdb/valprint.c | 31 +++++++++++++++++++++------- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cc47e2d0747..9d295682e8d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-02-18 Simon Marchi + + * 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 * valprint.c (generic_val_print_enum_1): Print unknown part of diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 087714b0729..8c09052f9f5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-18 Simon Marchi + + * gdb.base/printcmds.exp (test_print_enums): Update expected + output. + 2020-02-18 Simon Marchi * gdb.base/printcmds.exp (test_print_enums): Expect hex values diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp index d6f5c75650b..bd2afc8696f 100644 --- a/gdb/testsuite/gdb.base/printcmds.exp +++ b/gdb/testsuite/gdb.base/printcmds.exp @@ -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)"] diff --git a/gdb/valprint.c b/gdb/valprint.c index 67049e74b36..ee370228eda 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -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); -- 2.30.2