[Ada] "ptype" of array where bound value uses DW_OP_push_object_address
authorJoel Brobecker <brobecker@adacore.com>
Thu, 14 Aug 2014 22:57:00 +0000 (15:57 -0700)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 18 Aug 2014 16:13:29 +0000 (18:13 +0200)
Consider an Ada array type where the DWARF debugging info for
at least one of the bounds involves an expression containing
a DW_OP_push_object_address operation. Trying to "ptype" that
type currently yields:

    (gdb) ptype foo.array_type
    type = array (Location address is not set.

This patch improves ada-typeprint by adding handling of the situation
where an array range type has dynamic bounds.  In that case, it prints
the array bounds using Ada's typical syntax for unbounded ranges "<>":

    (gdb) ptype array_type
    type = array (<>) of integer

gdb/ChangeLog:

        * ada-typeprint.c (type_is_full_subrange_of_target_type):
        Return 0 if TYPE is dynamic.
        (print_range): Add handling of dynamic ranges.

gdb/ChangeLog
gdb/ada-typeprint.c

index 1d35ac3f37450590c62c4826ec1525d9c88848ac..c14fd5c4ac8001942ff14f8ea5922482b06f83a6 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-18  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-typeprint.c (type_is_full_subrange_of_target_type):
+       Return 0 if TYPE is dynamic.
+       (print_range): Add handling of dynamic ranges.
+
 2014-08-18  Keven Boell  <keven.boell@intel.com>
            Joel Brobecker  <brobecker@adacore.com>
 
index 305e39cddde4a404d1a06a61c424aaca1d8b8c3f..57c8d930c030c84f25cca48e8389fb279cb92c75 100644 (file)
@@ -115,6 +115,9 @@ type_is_full_subrange_of_target_type (struct type *type)
   if (subtype == NULL)
     return 0;
 
+  if (is_dynamic_type (type))
+    return 0;
+
   if (ada_discrete_type_low_bound (type)
       != ada_discrete_type_low_bound (subtype))
     return 0;
@@ -156,15 +159,33 @@ print_range (struct type *type, struct ui_file *stream,
     case TYPE_CODE_ENUM:
       {
        struct type *target_type;
+       volatile struct gdb_exception e;
+       LONGEST lo, hi;
 
        target_type = TYPE_TARGET_TYPE (type);
        if (target_type == NULL)
          target_type = type;
-       ada_print_scalar (target_type, ada_discrete_type_low_bound (type),
-                         stream);
-       fprintf_filtered (stream, " .. ");
-       ada_print_scalar (target_type, ada_discrete_type_high_bound (type),
-                         stream);
+
+       TRY_CATCH (e, RETURN_MASK_ERROR)
+         {
+           lo = ada_discrete_type_low_bound (type);
+           hi = ada_discrete_type_high_bound (type);
+         }
+       if (e.reason < 0)
+         {
+           /* This can happen when the range is dynamic.  Sometimes,
+              resolving dynamic property values requires us to have
+              access to an actual object, which is not available
+              when the user is using the "ptype" command on a type.
+              Print the range as an unbounded range.  */
+           fprintf_filtered (stream, "<>");
+         }
+       else
+         {
+           ada_print_scalar (target_type, lo, stream);
+           fprintf_filtered (stream, " .. ");
+           ada_print_scalar (target_type, hi, stream);
+         }
       }
       break;
     default: