Make structs work on DECstation (sigh)
authorJohn Gilmore <gnu@cygnus>
Thu, 28 Nov 1991 00:51:48 +0000 (00:51 +0000)
committerJohn Gilmore <gnu@cygnus>
Thu, 28 Nov 1991 00:51:48 +0000 (00:51 +0000)
gdb/ChangeLog
gdb/mipsread.c
gdb/symtab.h

index 43a2678e6274a30d90b6bb2d73d30cfacf93d495..6941e92e1f6028e9cca0f3f88da523d8a597d321 100644 (file)
@@ -4,7 +4,7 @@ Wed Nov 27 01:23:41 1991  John Gilmore  (gnu at cygnus.com)
 
        * symtab.h:  target_type is not used in record types.
        Eliminate TYPE_MAIN_VARIANT and TYPE_NEXT_VARIANT.  Eliminate
-       lookup_method_type.
+       lookup_method_type.  Add TYPE_TYPE_SPECIFIC macro.
 
        * symtab.c (lookup_member_type):  Don't chain them up, just
        allocate one in symbol_obstack when we need one.
@@ -30,6 +30,8 @@ Wed Nov 27 01:23:41 1991  John Gilmore  (gnu at cygnus.com)
        * mipsread.c:  Eliminate "template" types.  Build new, real
        types whenever we need them.  Allocate cplus structures as needed.
        Bulletproof the type parsing a bit more.  Mark storage leaks.
+       (parse_type):  Copy TYPE_TYPE_SPECIFIC when copying a real type
+       on top of a partial type.
 
 Fri Nov 22 16:39:57 1991  John Gilmore  (gnu at cygnus.com)
 
index 193278dd616b7140d58daa56b3a8ee2b03c60eb7..09c81a5bd8356bbda7cc2f2f81f41c8ca3676a61 100644 (file)
@@ -1056,6 +1056,7 @@ static struct type *parse_type(ax, sh, bs)
        TIR            *t;
        struct type    *tp = 0, *tp1;
        char           *fmt;
+       int             i;
 
        /* Procedures start off by one */
        if (sh->st == stProc || sh->st == stStaticProc)
@@ -1150,11 +1151,15 @@ static struct type *parse_type(ax, sh, bs)
                         */
                        TYPE_CODE(tp1) = TYPE_CODE(tp);
                        TYPE_NAME(tp1) = obsavestring(name, strlen(name));
-                       if (TYPE_CODE(tp1) == TYPE_CODE_ENUM) {
-                               int             i;
+                       TYPE_TYPE_SPECIFIC(tp1) = TYPE_TYPE_SPECIFIC(tp);
 
+                       /* Now do cleanup based on the final type.  */
+                       switch (TYPE_CODE (tp1)) {
+                       case TYPE_CODE_ENUM:
                                for (i = 0; i < TYPE_NFIELDS(tp1); i++)
-                                       make_enum_constant(&TYPE_FIELD(tp1,i), tp1);
+                                       make_enum_constant(&TYPE_FIELD(tp1,i),
+                                                          tp1);
+                               break;
                        }
                }
                if (tp1 != tp) {
index 801bc5f12fb763c8892d83a5acc7ab45dacb56bb..2c5646e6d68eb3bdcbf784acd89f347e69ed806b 100644 (file)
@@ -195,7 +195,7 @@ struct type
   int vptr_fieldno;
 
   /* Slot to point to additional language-specific fields of this type.  */
-  union
+  union type_specific
     {
       struct type **arg_types;
       struct cplus_struct_type *cplus_stuff;
@@ -674,6 +674,7 @@ int current_source_line;
 #define TYPE_FN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fields
 #define TYPE_NFN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields
 #define TYPE_NFN_FIELDS_TOTAL(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields_total
+#define        TYPE_TYPE_SPECIFIC(thistype) (thistype)->type_specific
 #define TYPE_ARG_TYPES(thistype) (thistype)->type_specific.arg_types
 #define TYPE_CPLUS_SPECIFIC(thistype) (thistype)->type_specific.cplus_stuff
 #define TYPE_BASECLASS(thistype,index) (thistype)->fields[index].type