From: Pierre Muller Date: Thu, 22 Apr 2010 12:30:55 +0000 (+0000) Subject: PR stabs/11479. X-Git-Tag: sid-snapshot-20100501~96 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=621791b854e8b14a82359ccd77f8dc436b7bfc43;p=external%2Fbinutils.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ff4272c..fe5eb7b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-04-22 Pierre Muller + + 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 Nathan Sidwell diff --git a/gdb/stabsread.c b/gdb/stabsread.c index a6b8881..17aff06 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -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)