gdb-gdb.py.in: Fix error when printing range type
authorJoel Brobecker <brobecker@adacore.com>
Tue, 26 Mar 2019 22:30:21 +0000 (17:30 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 26 Mar 2019 22:30:21 +0000 (18:30 -0400)
I noticed that trying to print the contents of a struct main_type
would fail when the type was a TYPE_CODE_RANGE:

    (gdb) p *type.main_type
    $1 = Python Exception <class 'gdb.error'> There is no member named low_undefined.:

And indeed, Python is right, fields "low_undefined" has been removed
from struct range_bounds back in ... 2014! It was done when we introduced
dynamic bounds handling. This patch fixes gdb-gdb.py.in according to
the new structure.

gdb/ChangeLog:

* gdb-gdb.py.in (StructMainTypePrettyPrinter.bound_img): New method.
(StructMainTypePrettyPrinter.bounds_img): Use new "bound_img"
method to compute the bounds of range types. Also print "[evaluated]"
if the bounds' values come from a dynamic evaluation.

gdb/ChangeLog
gdb/gdb-gdb.py.in

index a31cf7041f294f4ad54ff5558124ac47e658c405..4ef8a5c9780ba218f814324f0870b91fd68ec6aa 100644 (file)
@@ -1,3 +1,10 @@
+2019-03-26  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb-gdb.py.in (StructMainTypePrettyPrinter.bound_img): New method.
+       (StructMainTypePrettyPrinter.bounds_img): Use new "bound_img"
+       method to compute the bounds of range types. Also print "[evaluated]"
+       if the bounds' values come from a dynamic evaluation.
+
 2019-03-26  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * cp-valprint.c (cp_print_value_fields): Don't print trailing
index 4b8296420e970331f1dc7184500f9aa72daefc1d..8700689f3dd866d29b884c12e8e91d5a58fadbf8 100644 (file)
@@ -181,17 +181,31 @@ class StructMainTypePrettyPrinter:
         fields.append(self.struct_field_location_img(f))
         return label + "\n" + "  {" + ",\n   ".join(fields) + "}"
 
+    def bound_img(self, bound_name):
+        """Return an image of the given main_type's bound."""
+        b = self.val['flds_bnds']['bounds'].dereference()[bound_name]
+        bnd_kind = str(b['kind'])
+        if bnd_kind == 'PROP_CONST':
+            return str(b['data']['const_val'])
+        elif bnd_kind == 'PROP_UNDEFINED':
+            return '(undefined)'
+        else:
+            info = [bnd_kind]
+            if bound_name == 'high' and b['flag_upper_bound_is_count']:
+                info.append('upper_bound_is_count')
+            return '{} ({})'.format(str(b['data']['baton']), ','.join(info))
+
     def bounds_img(self):
         """Return an image of the main_type bounds.
         """
         b = self.val['flds_bnds']['bounds'].dereference()
-        low = str(b['low'])
-        if b['low_undefined'] != 0:
-            low += " (undefined)"
-        high = str(b['high'])
-        if b['high_undefined'] != 0:
-            high += " (undefined)"
-        return "flds_bnds.bounds = {%s, %s}" % (low, high)
+        low = self.bound_img('low')
+        high = self.bound_img('high')
+
+        img = "flds_bnds.bounds = {%s, %s}" % (low, high)
+        if b['flag_bound_evaluated']:
+            img += ' [evaluated]'
+        return img
 
     def type_specific_img(self):
         """Return a string image of the main_type type_specific union.