PR stabs/11479.
authorPierre Muller <muller@sourceware.org>
Thu, 22 Apr 2010 12:30:55 +0000 (12:30 +0000)
committerPierre Muller <muller@sourceware.org>
Thu, 22 Apr 2010 12:30:55 +0000 (12:30 +0000)
* stabsread.c (set_length_in_type_chain): New function.
(read_struct_type): Call set_length_in_type_chain function.
(read_enum_type): Idem.

gdb/ChangeLog
gdb/stabsread.c

index ff4272cab76fc7ae2249fb8852c7b0b7a492adfa..fe5eb7be83157cb962b5760d946668ab30ab876e 100644 (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>
 
index a6b8881662c085fa8542dc41e3eedd500edc2e02..17aff06a988919e7dc45fe3046ed13d18616ad86 100644 (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)