gdb: change print format of flag enums with value 0
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 18 Feb 2020 22:30:51 +0000 (17:30 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 18 Feb 2020 22:33:04 +0000 (17:33 -0500)
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
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/printcmds.exp
gdb/valprint.c

index cc47e2d07472fc98abc8252e9c3f697a02035680..9d295682e8deb0c22df34bf5722758708b224261 100644 (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
index 087714b0729627b6d81b7b1a3c48d69228e3af6b..8c09052f9f5c073ee4ebb294147d0d9171851b63 100644 (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
index d6f5c75650bfa3cc7de4a0c6d6438838fb665a66..bd2afc8696f0ee142634b5ce473ea9081e1957f2 100644 (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)"]
index 67049e74b369cfad42fc9ef05e539c0bd08d046b..ee370228eda541792b5688d6d29ebf364ec31323 100644 (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);