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:
parent
105c2d85f7
commit
621791b854
2 changed files with 45 additions and 0 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue