]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: make get_discrete_bounds return bool
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 9 Dec 2020 18:51:57 +0000 (13:51 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Wed, 9 Dec 2020 20:23:56 +0000 (15:23 -0500)
get_discrete_bounds currently has three possible return values (see its
current doc for details).  It appears that for all callers, it would be
sufficient to have a boolean "worked" / "didn't work" return value.

Change the return type of get_discrete_bounds to bool and adjust all
callers.  Doing so simplifies the following patch.

gdb/ChangeLog:

* gdbtypes.h (get_discrete_bounds): Return bool, adjust all
callers.
* gdbtypes.c (get_discrete_bounds): Return bool.

Change-Id: Ie51feee23c75f0cd7939742604282d745db59172

12 files changed:
gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-valprint.c
gdb/c-lang.c
gdb/eval.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/m2-typeprint.c
gdb/m2-valprint.c
gdb/p-valprint.c
gdb/valarith.c
gdb/valops.c

index f4e26d9fe5a7871d698baa606676b25efdae5c5a..1350023a5239e870d2aa396e412c3f387200844c 100644 (file)
@@ -1,3 +1,9 @@
+2020-12-09  Simon Marchi  <simon.marchi@efficios.com>
+
+       * gdbtypes.h (get_discrete_bounds): Return bool, adjust all
+       callers.
+       * gdbtypes.c (get_discrete_bounds): Return bool.
+
 2020-12-09  Simon Marchi  <simon.marchi@efficios.com>
 
        * ada-lang.c (ada_value_slice_from_ptr): Adjust.
index 50ec5987c4b0be671feafefbb8bf05da1512f006..e1d6c73c09964a7f6a70e274b3d99af9a8415dfe 100644 (file)
@@ -2097,7 +2097,7 @@ constrained_packed_array_type (struct type *type, long *elt_bits)
 
   if ((check_typedef (index_type)->code () == TYPE_CODE_RANGE
        && is_dynamic_type (check_typedef (index_type)))
-      || get_discrete_bounds (index_type, &low_bound, &high_bound) < 0)
+      || !get_discrete_bounds (index_type, &low_bound, &high_bound))
     low_bound = high_bound = 0;
   if (high_bound < low_bound)
     *elt_bits = TYPE_LENGTH (new_type) = 0;
@@ -2243,7 +2243,7 @@ value_subscript_packed (struct value *arr, int arity, struct value **ind)
           LONGEST lowerbound, upperbound;
           LONGEST idx;
 
-          if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0)
+          if (!get_discrete_bounds (range_type, &lowerbound, &upperbound))
             {
               lim_warning (_("don't know bounds of array"));
               lowerbound = upperbound = 0;
index 6a5b7d3f37aac30d7e3fed5a3def0b818bee8763..c2cb9920dd1b03431cc8d0e5394a9c9b39ee043d 100644 (file)
@@ -136,7 +136,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
   {
     LONGEST high;
 
-    if (get_discrete_bounds (index_type, &low, &high) < 0)
+    if (!get_discrete_bounds (index_type, &low, &high))
       len = 1;
     else if (low > high)
       {
index f29f2cef610458974ccc5f83342d6efaaf8ce624..feb5ecacc15725be045e41c15cc3e5ce6d5437c3 100644 (file)
@@ -698,8 +698,8 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
                LONGEST low_bound, high_bound;
                int element_size = TYPE_LENGTH (type);
 
-               if (get_discrete_bounds (expect_type->index_type (),
-                                        &low_bound, &high_bound) < 0)
+               if (!get_discrete_bounds (expect_type->index_type (),
+                                         &low_bound, &high_bound))
                  {
                    low_bound = 0;
                    high_bound = (TYPE_LENGTH (expect_type) / element_size) - 1;
index 51b51865f43e0ecfa42287cb5e9751da44bb2414..c0eb0822b91e6be9a7bfc52eea312a473fd7daee 100644 (file)
@@ -1464,7 +1464,7 @@ evaluate_subexp_standard (struct type *expect_type,
          int element_size = TYPE_LENGTH (check_typedef (element_type));
          LONGEST low_bound, high_bound, index;
 
-         if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
+         if (!get_discrete_bounds (range_type, &low_bound, &high_bound))
            {
              low_bound = 0;
              high_bound = (TYPE_LENGTH (type) / element_size) - 1;
@@ -1517,7 +1517,7 @@ evaluate_subexp_standard (struct type *expect_type,
                 || check_type->code () == TYPE_CODE_TYPEDEF)
            check_type = TYPE_TARGET_TYPE (check_type);
 
-         if (get_discrete_bounds (element_type, &low_bound, &high_bound) < 0)
+         if (!get_discrete_bounds (element_type, &low_bound, &high_bound))
            error (_("(power)set type with unknown size"));
          memset (valaddr, '\0', TYPE_LENGTH (type));
          for (tem = 0; tem < nargs; tem++)
index 1d044b755c85c7f79e9d27d108bc165e627ce20c..274fc2562f9e36d8ba57974f7cfd24f465ac7cf9 100644 (file)
@@ -1024,15 +1024,9 @@ has_static_range (const struct range_bounds *bounds)
          && bounds->stride.kind () == PROP_CONST);
 }
 
+/* See gdbtypes.h.  */
 
-/* Set *LOWP and *HIGHP to the lower and upper bounds of discrete type
-   TYPE.
-
-   Return 1 if type is a range type with two defined, constant bounds.
-   Else, return 0 if it is discrete (and bounds will fit in LONGEST).
-   Else, return -1.  */
-
-int
+bool
 get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
 {
   type = check_typedef (type);
@@ -1043,7 +1037,7 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
          constant bounds.  */
       if (type->bounds ()->low.kind () != PROP_CONST
          || type->bounds ()->high.kind () != PROP_CONST)
-       return -1;
+       return false;
 
       *lowp = type->bounds ()->low.const_val ();
       *highp = type->bounds ()->high.const_val ();
@@ -1053,20 +1047,17 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
          gdb::optional<LONGEST> low_pos
            = discrete_position (TYPE_TARGET_TYPE (type), *lowp);
 
-         if (!low_pos.has_value ())
-           return 0;
-
-         *lowp = *low_pos;
+         if (low_pos.has_value ())
+           *lowp = *low_pos;
 
          gdb::optional<LONGEST> high_pos
            = discrete_position (TYPE_TARGET_TYPE (type), *highp);
 
-         if (!high_pos.has_value ())
-           return 0;
-
-         *highp = *high_pos;
+         if (high_pos.has_value ())
+           *highp = *high_pos;
        }
-      return 1;
+      return true;
+
     case TYPE_CODE_ENUM:
       if (type->num_fields () > 0)
        {
@@ -1094,19 +1085,22 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
          *lowp = 0;
          *highp = -1;
        }
-      return 0;
+      return true;
+
     case TYPE_CODE_BOOL:
       *lowp = 0;
       *highp = 1;
-      return 0;
+      return true;
+
     case TYPE_CODE_INT:
       if (TYPE_LENGTH (type) > sizeof (LONGEST))       /* Too big */
-       return -1;
+       return false;
+
       if (!TYPE_UNSIGNED (type))
        {
          *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
          *highp = -*lowp - 1;
-         return 0;
+         return true;
        }
       /* fall through */
     case TYPE_CODE_CHAR:
@@ -1116,9 +1110,10 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
          if TYPE_LENGTH (type) == sizeof (LONGEST).  */
       *highp = 1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1);
       *highp = (*highp - 1) | *highp;
-      return 0;
+      return true;
+
     default:
-      return -1;
+      return false;
     }
 }
 
@@ -1135,13 +1130,11 @@ get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound)
   struct type *index = type->index_type ();
   LONGEST low = 0;
   LONGEST high = 0;
-  int res;
 
   if (index == NULL)
     return 0;
 
-  res = get_discrete_bounds (index, &low, &high);
-  if (res == -1)
+  if (!get_discrete_bounds (index, &low, &high))
     return 0;
 
   if (low_bound)
@@ -1217,8 +1210,9 @@ update_static_array_size (struct type *type)
       if (stride == 0)
        stride = range_type->bit_stride ();
 
-      if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
+      if (!get_discrete_bounds (range_type, &low_bound, &high_bound))
        low_bound = high_bound = 0;
+
       element_type = check_typedef (TYPE_TARGET_TYPE (type));
       /* Be careful when setting the array length.  Ada arrays can be
         empty arrays with the high_bound being smaller than the low_bound.
@@ -1400,8 +1394,9 @@ create_set_type (struct type *result_type, struct type *domain_type)
     {
       LONGEST low_bound, high_bound, bit_length;
 
-      if (get_discrete_bounds (domain_type, &low_bound, &high_bound) < 0)
+      if (!get_discrete_bounds (domain_type, &low_bound, &high_bound))
        low_bound = high_bound = 0;
+
       bit_length = high_bound - low_bound + 1;
       TYPE_LENGTH (result_type)
        = (bit_length + TARGET_CHAR_BIT - 1) / TARGET_CHAR_BIT;
index d0ce48b05dd35bcfb02cd8cedeabc7c3cccf6307..a659532f635c611adf2d65c9e6c639346dd07300 100644 (file)
@@ -2262,7 +2262,13 @@ extern struct type *lookup_template_type (const char *, struct type *,
 
 extern int get_vptr_fieldno (struct type *, struct type **);
 
-extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *);
+/* Set *LOWP and *HIGHP to the lower and upper bounds of discrete type
+   TYPE.
+
+   Return true if the two bounds are available, false otherwise.  */
+
+extern bool get_discrete_bounds (struct type *type, LONGEST *lowp,
+                                LONGEST *highp);
 
 extern int get_array_bounds (struct type *type, LONGEST *low_bound,
                             LONGEST *high_bound);
index 521d9260322ad8cb806e389966ea2c45450a9ab4..184d2e366d970add0a683839debdd1132c30933c 100644 (file)
@@ -372,7 +372,7 @@ m2_is_long_set (struct type *type)
                             This should be integrated into gdbtypes.c
                             inside get_discrete_bounds.  */
 
-static int
+static bool
 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
 {
   type = check_typedef (type);
@@ -419,7 +419,7 @@ m2_is_long_set_of_type (struct type *type, struct type **of_type)
       l1 = type->field (i).type ()->bounds ()->low.const_val ();
       h1 = type->field (len - 1).type ()->bounds ()->high.const_val ();
       *of_type = target;
-      if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
+      if (m2_get_discrete_bounds (target, &l2, &h2))
        return (l1 == l2 && h1 == h2);
       error (_("long_set failed to find discrete bounds for its subtype"));
       return 0;
index b0a3ce3ec3e072af7acf2db2632640c743e365d6..a798a902717d902eba56895c00c070aa3e36dc71 100644 (file)
@@ -97,7 +97,7 @@ m2_print_long_set (struct type *type, const gdb_byte *valaddr,
 
   target = TYPE_TARGET_TYPE (range);
 
-  if (get_discrete_bounds (range, &field_low, &field_high) >= 0)
+  if (get_discrete_bounds (range, &field_low, &field_high))
     {
       for (i = low_bound; i <= high_bound; i++)
        {
@@ -137,7 +137,7 @@ m2_print_long_set (struct type *type, const gdb_byte *valaddr,
              if (field == len)
                break;
              range = type->field (field).type ()->index_type ();
-             if (get_discrete_bounds (range, &field_low, &field_high) < 0)
+             if (!get_discrete_bounds (range, &field_low, &field_high))
                break;
              target = TYPE_TARGET_TYPE (range);
            }
@@ -398,7 +398,7 @@ m2_value_print_inner (struct value *val, struct ui_file *stream, int recurse,
 
          fputs_filtered ("{", stream);
 
-         i = get_discrete_bounds (range, &low_bound, &high_bound);
+         i = get_discrete_bounds (range, &low_bound, &high_bound) ? 0 : -1;
        maybe_bad_bstring:
          if (i < 0)
            {
index c98f3c5bf735bcf2a2567a3f0013bb0902c36368..d3d9ca1c6d5cb79053935cc081eec8774be0f246 100644 (file)
@@ -343,7 +343,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
          fputs_filtered ("[", stream);
 
-         int bound_info = get_discrete_bounds (range, &low_bound, &high_bound);
+         int bound_info = (get_discrete_bounds (range, &low_bound, &high_bound)
+                           ? 0 : -1);
          if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
            {
              /* If we know the size of the set type, we can figure out the
index 0221bc6e939e6e18ef485deec27719a8257910c4..e6393a20e7b2dc36fb6e0b135c2fcae9c6496bdd 100644 (file)
@@ -1873,7 +1873,7 @@ value_bit_index (struct type *type, const gdb_byte *valaddr, int index)
   unsigned rel_index;
   struct type *range = type->index_type ();
 
-  if (get_discrete_bounds (range, &low_bound, &high_bound) < 0)
+  if (!get_discrete_bounds (range, &low_bound, &high_bound))
     return -2;
   if (index < low_bound || index > high_bound)
     return -1;
index 0eb2b0962114665e322c6e6a79d6cf99d6d152d2..c53a96406fbdbf758657bc026dd77141b7f8ca55 100644 (file)
@@ -394,7 +394,7 @@ value_cast (struct type *type, struct value *arg2)
          int val_length = TYPE_LENGTH (type2);
          LONGEST low_bound, high_bound, new_length;
 
-         if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
+         if (!get_discrete_bounds (range_type, &low_bound, &high_bound))
            low_bound = 0, high_bound = 0;
          new_length = val_length / element_length;
          if (val_length % element_length != 0)
@@ -3773,7 +3773,7 @@ value_slice (struct value *array, int lowbound, int length)
     error (_("array not associated"));
 
   range_type = array_type->index_type ();
-  if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0)
+  if (!get_discrete_bounds (range_type, &lowerbound, &upperbound))
     error (_("slice from bad array or bitstring"));
 
   if (lowbound < lowerbound || length < 0