Initialize the c++ specific portion of the type structure for union types
authorFred Fish <fnf@specifix.com>
Fri, 22 Nov 1991 02:30:34 +0000 (02:30 +0000)
committerFred Fish <fnf@specifix.com>
Fri, 22 Nov 1991 02:30:34 +0000 (02:30 +0000)
as well as struct types, since gdb attempts to reference that portion for
both types.  Was getting core dumps due to NULL pointer dereferencing.

gdb/ChangeLog
gdb/dwarfread.c

index d0de7a8cd01f9466e05477484dc6fc8ee7652274..7541ac3116788fd8040df4923c9bede7a6ee1b79 100644 (file)
@@ -1,3 +1,9 @@
+Thu Nov 21 18:26:11 1991  Fred Fish  (fnf at cygnus.com)
+
+       * dwarfread.c (struct_type):  Must initialize the c++ specific
+       portion of union types as well as struct types, since gdb attempts
+       to reference the c++ specific info for both types.
+
 Thu Nov 21 10:23:52 1991  John Gilmore  (gnu at cygnus.com)
 
        * defs.h:  Incorporate param.h.  All users changed.
index 44e8ccfcc2eb136f667253c03cf03bc24eb17f20..fcc2f352ce478865322b3879106f305f7bc11721 100644 (file)
@@ -901,24 +901,28 @@ DEFUN(struct_type, (dip, thisdie, enddie),
     {
       type = alloc_utype (dip -> dieref, NULL);
     }
-  switch (dip -> dietag)
+  if (dip -> dietag == TAG_structure_type || dip -> dietag == TAG_union_type)
+    {
+      TYPE_CPLUS_SPECIFIC (type) = (struct cplus_struct_type *)
+       obstack_alloc (symbol_obstack, sizeof (struct cplus_struct_type));
+      (void) memset (TYPE_CPLUS_SPECIFIC (type), 0,
+                    sizeof (struct cplus_struct_type));
+      if (dip -> dietag == TAG_structure_type)
+       {
+         TYPE_CODE (type) = TYPE_CODE_STRUCT;
+         tpart1 = "struct ";
+       }
+      else
+       {
+         TYPE_CODE (type) = TYPE_CODE_UNION;
+         tpart1 = "union ";
+       }
+    }
+  else
     {
-    case TAG_structure_type:
-      TYPE_CODE (type) = TYPE_CODE_STRUCT;
-      TYPE_CPLUS_SPECIFIC (type)
-       = (struct cplus_struct_type *) obstack_alloc (symbol_obstack, sizeof (struct cplus_struct_type));
-      bzero (TYPE_CPLUS_SPECIFIC (type), sizeof (struct cplus_struct_type));
-      tpart1 = "struct ";
-      break;
-    case TAG_union_type:
-      TYPE_CODE (type) = TYPE_CODE_UNION;
-      tpart1 = "union ";
-      break;
-    default:
       tpart1 = "";
       SQUAWK (("missing structure or union tag"));
       TYPE_CODE (type) = TYPE_CODE_UNDEF;
-      break;
     }
   /* Some compilers try to be helpful by inventing "fake" names for anonymous
      enums, structures, and unions, like "~0fake".  Thanks, but no thanks. */