PR stabs/11479.

* stabsread.c (set_length_in_type_chain): New function.
	(read_struct_type): Call set_length_in_type_chain function.
	(read_enum_type): Idem.
This commit is contained in:
Pierre Muller 2010-04-22 12:30:55 +00:00
parent 105c2d85f7
commit 621791b854
2 changed files with 45 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2010-04-22 Pierre Muller <muller@ics.u-strasbg.fr>
PR stabs/11479.
* stabsread.c (set_length_in_type_chain): New function.
(read_struct_type): Call set_length_in_type_chain function.
(read_enum_type): Idem.
2010-04-21 Stan Shebs <stan@codesourcery.com>
Nathan Sidwell <nathan@codesourcery.com>

View file

@ -3393,6 +3393,42 @@ complain_about_struct_wipeout (struct type *type)
_("struct/union type gets multiply defined: %s%s"), kind, name);
}
/* Set the length for all variants of a same main_type, which are
connected in the closed chain.
This is something that needs to be done when a type is defined *after*
some cross references to this type have already been read. Consider
for instance the following scenario where we have the following two
stabs entries:
.stabs "t:p(0,21)=*(0,22)=k(0,23)=xsdummy:",160,0,28,-24
.stabs "dummy:T(0,23)=s16x:(0,1),0,3[...]"
A stubbed version of type dummy is created while processing the first
stabs entry. The length of that type is initially set to zero, since
it is unknown at this point. Also, a "constant" variation of type
"dummy" is created as well (this is the "(0,22)=k(0,23)" section of
the stabs line).
The second stabs entry allows us to replace the stubbed definition
with the real definition. However, we still need to adjust the length
of the "constant" variation of that type, as its length was left
untouched during the main type replacement... */
static void
set_length_in_type_chain (struct type * type)
{
struct type *ntype = TYPE_CHAIN (type);
while (ntype != type)
{
if (TYPE_LENGTH(ntype) == 0)
TYPE_LENGTH (ntype) = TYPE_LENGTH (type);
else
complain_about_struct_wipeout (ntype);
ntype = TYPE_CHAIN (ntype);
}
}
/* Read the description of a structure (or union type) and return an object
describing the type.
@ -3451,6 +3487,7 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
set_length_in_type_chain (type);
}
/* Now read the baseclasses, if any, read the regular C struct or C++
@ -3615,6 +3652,7 @@ read_enum_type (char **pp, struct type *type,
/* Now fill in the fields of the type-structure. */
TYPE_LENGTH (type) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
set_length_in_type_chain (type);
TYPE_CODE (type) = TYPE_CODE_ENUM;
TYPE_STUB (type) = 0;
if (unsigned_enum)