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>
|
2010-04-21 Stan Shebs <stan@codesourcery.com>
|
||||||
Nathan Sidwell <nathan@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);
|
_("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
|
/* Read the description of a structure (or union type) and return an object
|
||||||
describing the type.
|
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);
|
TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
|
||||||
if (nbits != 0)
|
if (nbits != 0)
|
||||||
return error_type (pp, objfile);
|
return error_type (pp, objfile);
|
||||||
|
set_length_in_type_chain (type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now read the baseclasses, if any, read the regular C struct or C++
|
/* 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. */
|
/* Now fill in the fields of the type-structure. */
|
||||||
|
|
||||||
TYPE_LENGTH (type) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
|
TYPE_LENGTH (type) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
|
||||||
|
set_length_in_type_chain (type);
|
||||||
TYPE_CODE (type) = TYPE_CODE_ENUM;
|
TYPE_CODE (type) = TYPE_CODE_ENUM;
|
||||||
TYPE_STUB (type) = 0;
|
TYPE_STUB (type) = 0;
|
||||||
if (unsigned_enum)
|
if (unsigned_enum)
|
||||||
|
|
Loading…
Add table
Reference in a new issue