2002-02-01 Daniel Jacobowitz <drow@mvista.com>

PR gdb/280
        * gdbtypes.c (replace_type): New function.
        * gdbtypes.h (replace_type): Add prototype.
        * stabsread.c (read_type): Use replace_type.
This commit is contained in:
Daniel Jacobowitz 2002-02-03 22:57:56 +00:00
parent 88fe217c0b
commit dd6bda650a
4 changed files with 42 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2002-02-03 Daniel Jacobowitz <drow@mvista.com>
PR gdb/280
* gdbtypes.c (replace_type): New function.
* gdbtypes.h (replace_type): Add prototype.
* stabsread.c (read_type): Use replace_type.
2002-02-03 Richard Earnshaw <rearnsha@arm.com> 2002-02-03 Richard Earnshaw <rearnsha@arm.com>
* Makefile.in (memattr.o): Add missing dependencies rule. * Makefile.in (memattr.o): Add missing dependencies rule.

View file

@ -519,6 +519,32 @@ finish_cv_type (struct type *type)
} }
} }
/* Replace the contents of ntype with the type *type.
This function should not be necessary, but is due to quirks in the stabs
reader. This should go away. It does not handle the replacement type
being cv-qualified; it could be easily fixed to, but it should go away,
remember? */
void
replace_type (struct type *ntype, struct type *type)
{
struct type *cv_chain, *as_chain, *ptr, *ref;
cv_chain = TYPE_CV_TYPE (ntype);
as_chain = TYPE_AS_TYPE (ntype);
ptr = TYPE_POINTER_TYPE (ntype);
ref = TYPE_REFERENCE_TYPE (ntype);
*ntype = *type;
TYPE_POINTER_TYPE (ntype) = ptr;
TYPE_REFERENCE_TYPE (ntype) = ref;
TYPE_CV_TYPE (ntype) = cv_chain;
TYPE_AS_TYPE (ntype) = as_chain;
finish_cv_type (ntype);
}
/* Implement direct support for MEMBER_TYPE in GNU C++. /* Implement direct support for MEMBER_TYPE in GNU C++.
May need to construct such a type if this is the first use. May need to construct such a type if this is the first use.
The TYPE is the type of the member. The DOMAIN is the type The TYPE is the type of the member. The DOMAIN is the type

View file

@ -1062,6 +1062,8 @@ extern struct type *make_cv_type (int, int, struct type *, struct type **);
extern void finish_cv_type (struct type *); extern void finish_cv_type (struct type *);
extern void replace_type (struct type *, struct type *);
extern int address_space_name_to_int (char *); extern int address_space_name_to_int (char *);
extern char *address_space_int_to_name (int); extern char *address_space_int_to_name (int);

View file

@ -2531,7 +2531,13 @@ again:
} }
else if (type_size >= 0 || is_string) else if (type_size >= 0 || is_string)
{ {
*type = *xtype; /* This is the absolute wrong way to construct types. Every
other debug format has found a way around this problem and
the related problems with unnecessarily stubbed types;
someone motivated should attempt to clean up the issue
here as well. Once a type pointed to has been created it
should not be modified. */
replace_type (type, xtype);
TYPE_NAME (type) = NULL; TYPE_NAME (type) = NULL;
TYPE_TAG_NAME (type) = NULL; TYPE_TAG_NAME (type) = NULL;
} }