[Ada] Resolve dynamic type before trying to print it.
authorJoel Brobecker <brobecker@adacore.com>
Wed, 1 Apr 2015 22:46:54 +0000 (15:46 -0700)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 5 May 2015 17:46:12 +0000 (10:46 -0700)
This is another required step towards trying to print the value of
an array of variant records. For instance:

   A1 : Array_Type := (1 => (I => 0, S => <>),
                       2 => (I => 1, S => "A"),
                       3 => (I => 2, S => "AB"));

... where Array_Type is an array of records whose size is variable:

   subtype Small_Type is Integer range 0 .. 10;
   type Record_Type (I : Small_Type := 0) is record
      S : String (1 .. I);
   end record;
   type Array_Type is array (Integer range <>) of Record_Type;

What happens is that the ada-valprint modules gets passed an array
whose element type is not resolved yet (since each element of the
array needs to be resolved separately). the module then recurses,
and eventually gets called with the first element of the array.
But because the element hasn't been resolved yet, we end up having
trouble printing its value soon after.

This patch fixes the issue by calling resolve_dynamic_type before
trying to print it.

With this patch, GDB is finally able to print the complete value
for variable "A1":

     (gdb) p a1
     $1 = ((i => 0, s => ""), (i => 1, s => "A"), (i => 2, s => "AB"))

gdb/ChangeLog:

        * ada-valprint.c (ada_val_print_1): Resolve TYPE before trying
        to print it.

gdb/ChangeLog
gdb/ada-valprint.c

index 5233c6d297c798c8246296627dc8c1aa5a198a4c..5b52c373767408e05695227597c08e400c0881ee 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-05  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-valprint.c (ada_val_print_1): Resolve TYPE before trying
+       to print it.
+
 2015-05-05  Joel Brobecker  <brobecker@adacore.com>
 
        * dwarf2loc.h (struct property_addr_info): Add "valaddr" field.
index 34539de3cab4e24b55d390b10cde3f43f178067f..720854e2cad30d39532219bce9991a4620f0330a 100644 (file)
@@ -1095,6 +1095,8 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
 
   offset_aligned = offset + ada_aligned_value_addr (type, valaddr) - valaddr;
   type = printable_val_type (type, valaddr + offset_aligned);
+  type = resolve_dynamic_type (type, valaddr + offset_aligned,
+                              address + offset_aligned);
 
   switch (TYPE_CODE (type))
     {