* ch-valprint.c (calculate_array_length): New function to determine
authorWilfried Moser <moser@cygnus>
Mon, 29 Jan 1996 08:17:22 +0000 (08:17 +0000)
committerWilfried Moser <moser@cygnus>
Mon, 29 Jan 1996 08:17:22 +0000 (08:17 +0000)
        the length of an array type (see comment).
        (chill_val_print (case TYPE_CODE_ARRAY)): If the length of an
        array type is zero, call calculate_array_length.

        * gdbtypes.c (get_discrete_bounds (case TYPE_CODE_ENUM)): They values
        may not be sorted. Scan all entries and set the real lower and

gdb/ChangeLog
gdb/ch-valprint.c
gdb/gdbtypes.c

index bd233a122be3b71dd0fa541cf76ba201ec72d53f..363ee78323bd7d71cd65f2f46e371647a10f631a 100644 (file)
@@ -1,3 +1,14 @@
+Mon Jan 29 00:10:35 1996  Wilfried Moser (Alcatel)  <moser@rtl.cygnus.com>
+
+       * ch-valprint.c (calculate_array_length): New function to determine
+       the length of an array type (see comment).
+       (chill_val_print (case TYPE_CODE_ARRAY)): If the length of an
+       array type is zero, call calculate_array_length.
+
+       * gdbtypes.c (get_discrete_bounds (case TYPE_CODE_ENUM)): They values
+       may not be sorted. Scan all entries and set the real lower and
+       upper bound.
+
 Sun Jan 28 15:50:42 1996  Fred Fish  <fnf@cygnus.com>
 
        * config/xm-linux.h: Move include of solib.h and #define of
index 9b201370c6910e70b51cb9b0868186d0cc328665..de66d46cfebe802a47459cdda69e8c22eaec3e45 100644 (file)
@@ -176,6 +176,49 @@ chill_val_print_array_elements (type, valaddr, address, stream,
     }
 }
 
+/* In certain cases it could happen, that an array type doesn't
+   have a length (this have to do with seizing). The reason is
+   shown in the following stabs:
+
+   .stabs "m_x:Tt81=s36i:1,0,32;ar:82=ar80;0;1;83=xsm_struct:,32,256;;",128,0,25,0
+  
+   .stabs "m_struct:Tt83=s16f1:9,0,16;f2:85=*84,32,32;f3:84,64,64;;",128,0,10,0
+
+   When processing t81, the array ar80 doesn't have a length, cause
+   struct m_struct is specified extern at thse moment. Afterwards m_struct
+   gets specified and updated, but not the surrounding type.
+
+   So we walk through array's till we find a type with a length and
+   calculate the array length.
+
+   FIXME: Where may this happen too ?
+   */
+
+static void
+calculate_array_length (type)
+     struct type *type;
+{
+  struct type *target_type;
+  struct type *range_type;
+  LONGEST lower_bound, upper_bound;
+
+  if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
+    /* not an array, stop processing */
+    return;
+
+  target_type = TYPE_TARGET_TYPE (type);
+  range_type = TYPE_FIELD_TYPE (type, 0);
+  lower_bound = TYPE_FIELD_BITPOS (range_type, 0);
+  upper_bound = TYPE_FIELD_BITPOS (range_type, 1);
+
+  if (TYPE_LENGTH (target_type) == 0 &&
+      TYPE_CODE (target_type) == TYPE_CODE_ARRAY)
+    /* we've got another array */
+    calculate_array_length (target_type);
+
+  TYPE_LENGTH (type) = (upper_bound - lower_bound + 1) * TYPE_LENGTH (target_type);
+}
+
 /* Print data of type TYPE located at VALADDR (within GDB), which came from
    the inferior at address ADDRESS, onto stdio stream STREAM according to
    FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
@@ -211,6 +254,10 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_ARRAY:
+      if (TYPE_LENGTH (type) == 0)
+       /* see comment function calculate_array_length */
+       calculate_array_length (type);
+
       if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
        {
          if (prettyprint_arrays)
index a21f9598c05cc2bf09746c904ed1bb90fc2454b6..13a111f088868078193ce10ccb23be850290fae1 100644 (file)
@@ -356,8 +356,18 @@ get_discrete_bounds (type, lowp, highp)
     case TYPE_CODE_ENUM:
       if (TYPE_NFIELDS (type) > 0)
        {
-         *lowp = TYPE_FIELD_BITPOS (type, 0);
-         *highp = TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1);
+         /* The enums may not be sorted by value, so search all
+            entries */
+         int i;
+
+         *lowp = *highp = TYPE_FIELD_BITPOS (type, 0);
+         for (i = 0; i < TYPE_NFIELDS (type); i++)
+           {
+             if (TYPE_FIELD_BITPOS (type, i) < *lowp)
+               *lowp = TYPE_FIELD_BITPOS (type, i);
+             if (TYPE_FIELD_BITPOS (type, i) > *highp)
+               *highp = TYPE_FIELD_BITPOS (type, i);
+           }
        }
       else
        {