aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-02-18 17:30:51 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-02-18 17:33:04 -0500
commit373d7ac0f158764e32d621b4d311771189001f1c (patch)
treeb84c51bb2cf862f65a44d85abd3d8fe8d5f5b3cd
parentb29a2df0002f541b5408ee28f1f8e88c844d2ffc (diff)
downloadgdb-373d7ac0f158764e32d621b4d311771189001f1c.zip
gdb-373d7ac0f158764e32d621b4d311771189001f1c.tar.gz
gdb-373d7ac0f158764e32d621b4d311771189001f1c.tar.bz2
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/printcmds.exp2
-rw-r--r--gdb/valprint.c31
4 files changed, 36 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index cc47e2d..9d29568 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
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
flag enum in hex.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 087714b..8c09052 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
for "unknown".
diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp
index d6f5c75..bd2afc8 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 67049e7..ee37022 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);