fort_dyn_array: Use value constructor instead of raw-buffer manipulation.
authorKeven Boell <keven.boell@intel.com>
Tue, 26 Apr 2016 14:46:48 +0000 (16:46 +0200)
committerBernhard Heckel <bernhard.heckel@intel.com>
Tue, 26 Apr 2016 14:48:41 +0000 (16:48 +0200)
Instead of pre-computing indices into a fortran array re-use
the value_* interfaces to subscript a fortran array.
The benefit of using the new interface is that it takes care of
dynamic types and resolve them when needed.
This fixes issues when printing structures with dynamic arrays from toplevel.

Before:
(gdb) p twov
$1 = ( (( ( 6352320, 0, -66, -1, 267) ( 343476, 1, -15, 1, 0) ( 5, 0, 5, 0, 1) ...

After:
(gdb) p twov
$1 = ( (( ( 1, 1, 1, 1, 1) ( 1, 1, 321, 1, 1) ( 1, 1, 1, 1, 1) ...

2016-04-26  Sanimir Agovic  <sanimir.agovic@intel.com>
            Keven Boell  <keven.boell@intel.com>
            Bernhard Heckel  <bernhard.heckel@intel.com>

gdb/Changelog:
* f-valprint.c (f77_create_arrayprint_offset_tbl): Remove
function.
(F77_DIM_SIZE, F77_DIM_OFFSET): Remove macro.
(f77_print_array_1): Use value_subscript to subscript a
value array.
(f77_print_array): Remove call to f77_create_arrayprint_offset_tbl.
(f_val_print): Use value_field to construct a field value.

gdb/testsuite/Changelog:
* vla-type.exp: Print structure from toplevel.

gdb/ChangeLog
gdb/f-valprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/vla-type.exp

index e512251d4948a59cc3c6814fa94755408e3b1c8f..1335563fae654d626eb7a6ffd7d4c30f3da63d1f 100644 (file)
@@ -1,3 +1,15 @@
+2016-04-26  Sanimir Agovic  <sanimir.agovic@intel.com>
+           Keven Boell  <keven.boell@intel.com>
+           Bernhard Heckel  <bernhard.heckel@intel.com>
+
+       * f-valprint.c (f77_create_arrayprint_offset_tbl): Remove
+       function.
+       (F77_DIM_SIZE, F77_DIM_OFFSET): Remove macro.
+       (f77_print_array_1): Use value_subscript to subscript a
+       value array.
+       (f77_print_array): Remove call to f77_create_arrayprint_offset_tbl.
+       (f_val_print): Use value_field to construct a field value.
+
 2016-04-26  Bernhard Heckel  <bernhard.heckel@intel.com>
 
        * valarith.c (value_address): Resolve dynamic types.
index 1438fc660aff827a5c69666eb70f6c394e8d16d6..71bd2c3e2cca6a70f683ee0fe0037305b8086289 100644 (file)
@@ -36,8 +36,6 @@
 
 extern void _initialize_f_valprint (void);
 static void info_common_command (char *, int);
-static void f77_create_arrayprint_offset_tbl (struct type *,
-                                             struct ui_file *);
 static void f77_get_dynamic_length_of_aggregate (struct type *);
 
 int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
@@ -45,15 +43,6 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
 /* Array which holds offsets to be applied to get a row's elements
    for a given array.  Array also holds the size of each subarray.  */
 
-/* The following macro gives us the size of the nth dimension, Where 
-   n is 1 based.  */
-
-#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
-
-/* The following gives us the offset for row n where n is 1-based.  */
-
-#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
-
 int
 f77_get_lowerbound (struct type *type)
 {
@@ -111,47 +100,6 @@ f77_get_dynamic_length_of_aggregate (struct type *type)
     * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
 }
 
-/* Function that sets up the array offset,size table for the array 
-   type "type".  */
-
-static void
-f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
-{
-  struct type *tmp_type;
-  int eltlen;
-  int ndimen = 1;
-  int upper, lower;
-
-  tmp_type = type;
-
-  while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
-    {
-      upper = f77_get_upperbound (tmp_type);
-      lower = f77_get_lowerbound (tmp_type);
-
-      F77_DIM_SIZE (ndimen) = upper - lower + 1;
-
-      tmp_type = TYPE_TARGET_TYPE (tmp_type);
-      ndimen++;
-    }
-
-  /* Now we multiply eltlen by all the offsets, so that later we 
-     can print out array elements correctly.  Up till now we 
-     know an offset to apply to get the item but we also 
-     have to know how much to add to get to the next item.  */
-
-  ndimen--;
-  eltlen = TYPE_LENGTH (tmp_type);
-  F77_DIM_OFFSET (ndimen) = eltlen;
-  while (--ndimen > 0)
-    {
-      eltlen *= F77_DIM_SIZE (ndimen + 1);
-      F77_DIM_OFFSET (ndimen) = eltlen;
-    }
-}
-
-
-
 /* Actual function which prints out F77 arrays, Valaddr == address in 
    the superior.  Address == the address in the inferior.  */
 
@@ -164,41 +112,56 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type,
                   const struct value_print_options *options,
                   int *elts)
 {
+  struct type *range_type = TYPE_INDEX_TYPE (check_typedef (type));
+  CORE_ADDR addr = address + embedded_offset;
+  LONGEST lowerbound, upperbound;
   int i;
 
+  get_discrete_bounds (range_type, &lowerbound, &upperbound);
+
   if (nss != ndimensions)
     {
-      for (i = 0;
-          (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max);
+      size_t dim_size = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
+      size_t offs = 0;
+
+      for (i = lowerbound;
+          (i < upperbound + 1 && (*elts) < options->print_max);
           i++)
        {
+         struct value *subarray = value_from_contents_and_address
+           (TYPE_TARGET_TYPE (type), value_contents_for_printing_const (val)
+            + offs, addr + offs);
+
          fprintf_filtered (stream, "( ");
-         f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
-                            valaddr,
-                            embedded_offset + i * F77_DIM_OFFSET (nss),
-                            address,
-                            stream, recurse, val, options, elts);
+         f77_print_array_1 (nss + 1, ndimensions, value_type (subarray),
+                            value_contents_for_printing (subarray),
+                            value_embedded_offset (subarray),
+                            value_address (subarray),
+                            stream, recurse, subarray, options, elts);
+         offs += dim_size;
          fprintf_filtered (stream, ") ");
        }
-      if (*elts >= options->print_max && i < F77_DIM_SIZE (nss)) 
+      if (*elts >= options->print_max && i < upperbound)
        fprintf_filtered (stream, "...");
     }
   else
     {
-      for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
+      for (i = lowerbound; i < upperbound + 1 && (*elts) < options->print_max;
           i++, (*elts)++)
        {
-         val_print (TYPE_TARGET_TYPE (type),
-                    valaddr,
-                    embedded_offset + i * F77_DIM_OFFSET (ndimensions),
-                    address, stream, recurse,
-                    val, options, current_language);
+         struct value *elt = value_subscript ((struct value *)val, i);
+
+         val_print (value_type (elt),
+                    value_contents_for_printing (elt),
+                    value_embedded_offset (elt),
+                    value_address (elt), stream, recurse,
+                    elt, options, current_language);
 
-         if (i != (F77_DIM_SIZE (nss) - 1))
+         if (i != upperbound)
            fprintf_filtered (stream, ", ");
 
          if ((*elts == options->print_max - 1)
-             && (i != (F77_DIM_SIZE (nss) - 1)))
+             && (i != upperbound))
            fprintf_filtered (stream, "...");
        }
     }
@@ -225,12 +188,6 @@ f77_print_array (struct type *type, const gdb_byte *valaddr,
 Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
           ndimensions, MAX_FORTRAN_DIMS);
 
-  /* Since F77 arrays are stored column-major, we set up an 
-     offset table to get at the various row's elements.  The 
-     offset table contains entries for both offset and subarray size.  */
-
-  f77_create_arrayprint_offset_tbl (type, stream);
-
   f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
                     address, stream, recurse, val, options, &elts);
 }
@@ -375,12 +332,15 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
       fprintf_filtered (stream, "( ");
       for (index = 0; index < TYPE_NFIELDS (type); index++)
         {
-          int offset = TYPE_FIELD_BITPOS (type, index) / 8;
+         struct value *field = value_field
+           ((struct value *)original_value, index);
+
+          val_print (value_type (field),
+                    value_contents_for_printing (field),
+                    value_embedded_offset (field),
+                    value_address (field), stream, recurse + 1,
+                    field, options, current_language);
 
-          val_print (TYPE_FIELD_TYPE (type, index), valaddr,
-                    embedded_offset + offset,
-                    address, stream, recurse + 1,
-                    original_value, options, current_language);
           if (index != TYPE_NFIELDS (type) - 1)
             fputs_filtered (", ", stream);
         }
index 7a8f9223c88d9dba175de8a9dddc673301957946..92eb9ff3a59cfb5a37fb39970341922db551ea35 100644 (file)
@@ -1,3 +1,7 @@
+2016-04-26  Bernhard Heckel  <bernhard.heckel@intel.com>
+
+       * vla-type.exp: Print structure from toplevel.
+
 2016-04-26  Bernhard Heckel  <bernhard.heckel@intel.com>
 
        * gdb.fortran/vla-type.f90: Add test for static and dynamic arrays
index 011e27ea1525512294b05a52f96c778650ec58aa..23c287f09ebc5e3bdf38edca5c3826e582743eb7 100755 (executable)
@@ -60,6 +60,9 @@ gdb_test "ptype twov" \
                      "\\s+$int :: ivla1\\\(5,12,99\\\)" \
                      "\\s+$int :: ivla2\\\(9,12\\\)" \
                      "End Type two" ]
+gdb_test "print twov" " = \\\( \\\(\\\( \\\( 1, 1, 1, 1, 1\\\)\
+ \\\( 1, 1, 321, 1, 1\\\)\
+ \\\( 1, 1, 1, 1, 1\\\) .*"
 
 # Check type with attribute at beginn of type
 gdb_breakpoint [gdb_get_line_number "threev-filled"]