Make structs work on DECstation (sigh)

This commit is contained in:
John Gilmore 1991-11-28 00:51:48 +00:00
parent 52bd2c221f
commit 67c29f758d
3 changed files with 13 additions and 5 deletions

View 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)

View 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) {

View 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