* 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
This commit is contained in:
Wilfried Moser 1996-01-29 08:17:22 +00:00
parent d59558827e
commit d221b17e83
3 changed files with 70 additions and 2 deletions

View 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> Sun Jan 28 15:50:42 1996 Fred Fish <fnf@cygnus.com>
* config/xm-linux.h: Move include of solib.h and #define of * config/xm-linux.h: Move include of solib.h and #define of

View 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 /* Print data of type TYPE located at VALADDR (within GDB), which came from
the inferior at address ADDRESS, onto stdio stream STREAM according to 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 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)) switch (TYPE_CODE (type))
{ {
case TYPE_CODE_ARRAY: 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 (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
{ {
if (prettyprint_arrays) if (prettyprint_arrays)

View File

@ -356,8 +356,18 @@ get_discrete_bounds (type, lowp, highp)
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
if (TYPE_NFIELDS (type) > 0) if (TYPE_NFIELDS (type) > 0)
{ {
*lowp = TYPE_FIELD_BITPOS (type, 0); /* The enums may not be sorted by value, so search all
*highp = TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1); 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 else
{ {