X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbtypes.c;h=4c24fa27a8d975b2be6c97b6401595a102cce293;hb=31687c3c2505191d73aa0036d62f2794a1f7d0d9;hp=732c92818bf1e6c9e9f867aa13386196a44e4513;hpb=4a1970e4a429204b221938e52804b9a2a5ec1001;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 732c92818b..4c24fa27a8 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1,6 +1,6 @@ /* Support routines for manipulating internal types for GDB. - Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, + 2004 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. This file is part of GDB. @@ -60,6 +60,7 @@ struct type *builtin_type_long_double; struct type *builtin_type_complex; struct type *builtin_type_double_complex; struct type *builtin_type_string; +struct type *builtin_type_int0; struct type *builtin_type_int8; struct type *builtin_type_uint8; struct type *builtin_type_int16; @@ -73,7 +74,9 @@ struct type *builtin_type_uint128; struct type *builtin_type_bool; /* 128 bit long vector types */ +struct type *builtin_type_v2_double; struct type *builtin_type_v4_float; +struct type *builtin_type_v2_int64; struct type *builtin_type_v4_int32; struct type *builtin_type_v8_int16; struct type *builtin_type_v16_int8; @@ -90,7 +93,10 @@ struct type *builtin_type_v8qi; struct type *builtin_type_v8hi; struct type *builtin_type_v4hi; struct type *builtin_type_v2si; +struct type *builtin_type_vec64; +struct type *builtin_type_vec64i; struct type *builtin_type_vec128; +struct type *builtin_type_vec128i; struct type *builtin_type_ieee_single_big; struct type *builtin_type_ieee_single_little; struct type *builtin_type_ieee_double_big; @@ -121,13 +127,8 @@ struct extra int len; }; /* maximum extension is 128! FIXME */ -static void add_name (struct extra *, char *); -static void add_mangled_type (struct extra *, struct type *); -#if 0 -static void cfront_mangle_name (struct type *, int, int); -#endif static void print_bit_vector (B_TYPE *, int); -static void print_arg_types (struct type **, int); +static void print_arg_types (struct field *, int, int); static void dump_fn_fieldlists (struct type *, int); static void print_cplus_stuff (struct type *, int); static void virtual_base_list_aux (struct type *dclass); @@ -135,38 +136,85 @@ static void virtual_base_list_aux (struct type *dclass); /* Alloc a new type structure and fill it with some defaults. If OBJFILE is non-NULL, then allocate the space for the type structure - in that objfile's type_obstack. */ + in that objfile's objfile_obstack. Otherwise allocate the new type structure + by xmalloc () (for permanent types). */ struct type * alloc_type (struct objfile *objfile) { - register struct type *type; + struct type *type; /* Alloc the structure and start off with all fields zeroed. */ if (objfile == NULL) { - type = (struct type *) xmalloc (sizeof (struct type)); + type = xmalloc (sizeof (struct type)); + memset (type, 0, sizeof (struct type)); + TYPE_MAIN_TYPE (type) = xmalloc (sizeof (struct main_type)); } else { - type = (struct type *) obstack_alloc (&objfile->type_obstack, - sizeof (struct type)); + type = obstack_alloc (&objfile->objfile_obstack, + sizeof (struct type)); + memset (type, 0, sizeof (struct type)); + TYPE_MAIN_TYPE (type) = obstack_alloc (&objfile->objfile_obstack, + sizeof (struct main_type)); OBJSTAT (objfile, n_types++); } - memset ((char *) type, 0, sizeof (struct type)); + memset (TYPE_MAIN_TYPE (type), 0, sizeof (struct main_type)); /* Initialize the fields that might not be zero. */ TYPE_CODE (type) = TYPE_CODE_UNDEF; TYPE_OBJFILE (type) = objfile; TYPE_VPTR_FIELDNO (type) = -1; - TYPE_CV_TYPE (type) = type; /* chain back to itself */ - TYPE_AS_TYPE (type) = type; /* ditto */ + TYPE_CHAIN (type) = type; /* Chain back to itself. */ + + return (type); +} + +/* Alloc a new type instance structure, fill it with some defaults, + and point it at OLDTYPE. Allocate the new type instance from the + same place as OLDTYPE. */ + +static struct type * +alloc_type_instance (struct type *oldtype) +{ + struct type *type; + + /* Allocate the structure. */ + + if (TYPE_OBJFILE (oldtype) == NULL) + { + type = xmalloc (sizeof (struct type)); + memset (type, 0, sizeof (struct type)); + } + else + { + type = obstack_alloc (&TYPE_OBJFILE (oldtype)->objfile_obstack, + sizeof (struct type)); + memset (type, 0, sizeof (struct type)); + } + TYPE_MAIN_TYPE (type) = TYPE_MAIN_TYPE (oldtype); + + TYPE_CHAIN (type) = type; /* Chain back to itself for now. */ return (type); } +/* Clear all remnants of the previous type at TYPE, in preparation for + replacing it with something else. */ +static void +smash_type (struct type *type) +{ + memset (TYPE_MAIN_TYPE (type), 0, sizeof (struct main_type)); + + /* For now, delete the rings. */ + TYPE_CHAIN (type) = type; + + /* For now, leave the pointer/reference types alone. */ +} + /* Lookup a pointer to a type TYPE. TYPEPTR, if nonzero, points to a pointer to memory where the pointer type should be stored. If *TYPEPTR is zero, update it to point to the pointer type we return. @@ -175,7 +223,7 @@ alloc_type (struct objfile *objfile) struct type * make_pointer_type (struct type *type, struct type **typeptr) { - register struct type *ntype; /* New type */ + struct type *ntype; /* New type */ struct objfile *objfile; ntype = TYPE_POINTER_TYPE (type); @@ -202,7 +250,7 @@ make_pointer_type (struct type *type, struct type **typeptr) { ntype = *typeptr; objfile = TYPE_OBJFILE (ntype); - memset ((char *) ntype, 0, sizeof (struct type)); + smash_type (ntype); TYPE_OBJFILE (ntype) = objfile; } @@ -242,7 +290,7 @@ lookup_pointer_type (struct type *type) struct type * make_reference_type (struct type *type, struct type **typeptr) { - register struct type *ntype; /* New type */ + struct type *ntype; /* New type */ struct objfile *objfile; ntype = TYPE_REFERENCE_TYPE (type); @@ -269,7 +317,7 @@ make_reference_type (struct type *type, struct type **typeptr) { ntype = *typeptr; objfile = TYPE_OBJFILE (ntype); - memset ((char *) ntype, 0, sizeof (struct type)); + smash_type (ntype); TYPE_OBJFILE (ntype) = objfile; } @@ -304,7 +352,7 @@ lookup_reference_type (struct type *type) struct type * make_function_type (struct type *type, struct type **typeptr) { - register struct type *ntype; /* New type */ + struct type *ntype; /* New type */ struct objfile *objfile; if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */ @@ -318,7 +366,7 @@ make_function_type (struct type *type, struct type **typeptr) { ntype = *typeptr; objfile = TYPE_OBJFILE (ntype); - memset ((char *) ntype, 0, sizeof (struct type)); + smash_type (ntype); TYPE_OBJFILE (ntype) = objfile; } @@ -345,11 +393,18 @@ lookup_function_type (struct type *type) extern int address_space_name_to_int (char *space_identifier) { + struct gdbarch *gdbarch = current_gdbarch; + int type_flags; /* Check for known address space delimiters. */ if (!strcmp (space_identifier, "code")) return TYPE_FLAG_CODE_SPACE; else if (!strcmp (space_identifier, "data")) return TYPE_FLAG_DATA_SPACE; + else if (gdbarch_address_class_name_to_type_flags_p (gdbarch) + && gdbarch_address_class_name_to_type_flags (gdbarch, + space_identifier, + &type_flags)) + return type_flags; else error ("Unknown address space specifier: \"%s\"", space_identifier); } @@ -357,56 +412,84 @@ address_space_name_to_int (char *space_identifier) /* Identify address space identifier by integer flag as defined in gdbtypes.h -- return the string version of the adress space name. */ -extern char * +const char * address_space_int_to_name (int space_flag) { + struct gdbarch *gdbarch = current_gdbarch; if (space_flag & TYPE_FLAG_CODE_SPACE) return "code"; else if (space_flag & TYPE_FLAG_DATA_SPACE) return "data"; + else if ((space_flag & TYPE_FLAG_ADDRESS_CLASS_ALL) + && gdbarch_address_class_type_flags_to_name_p (gdbarch)) + return gdbarch_address_class_type_flags_to_name (gdbarch, space_flag); else return NULL; } -/* Make an address-space-delimited variant of a type -- a type that - is identical to the one supplied except that it has an address - space attribute attached to it (such as "code" or "data"). +/* Create a new type with instance flags NEW_FLAGS, based on TYPE. + If STORAGE is non-NULL, create the new type instance there. */ - This is for Harvard architectures. */ - -struct type * -make_type_with_address_space (struct type *type, int space_flag) +static struct type * +make_qualified_type (struct type *type, int new_flags, + struct type *storage) { struct type *ntype; ntype = type; do { - if ((ntype->flags & space_flag) != 0) + if (TYPE_INSTANCE_FLAGS (ntype) == new_flags) return ntype; - ntype = TYPE_AS_TYPE (ntype); + ntype = TYPE_CHAIN (ntype); } while (ntype != type); - /* Create a new, duplicate type. */ - ntype = alloc_type (TYPE_OBJFILE (type)); - /* Copy original type. */ - memcpy ((char *) ntype, (char *) type, sizeof (struct type)); + /* Create a new type instance. */ + if (storage == NULL) + ntype = alloc_type_instance (type); + else + { + ntype = storage; + TYPE_MAIN_TYPE (ntype) = TYPE_MAIN_TYPE (type); + TYPE_CHAIN (ntype) = ntype; + } /* Pointers or references to the original type are not relevant to - the new type; but if the original type is a pointer, the new type - points to the same thing (so TYPE_TARGET_TYPE remains unchanged). */ + the new type. */ TYPE_POINTER_TYPE (ntype) = (struct type *) 0; TYPE_REFERENCE_TYPE (ntype) = (struct type *) 0; - TYPE_CV_TYPE (ntype) = ntype; - /* Chain the new address-space-specific type to the old type. */ - ntype->as_type = type->as_type; - type->as_type = ntype; + /* Chain the new qualified type to the old type. */ + TYPE_CHAIN (ntype) = TYPE_CHAIN (type); + TYPE_CHAIN (type) = ntype; + + /* Now set the instance flags and return the new type. */ + TYPE_INSTANCE_FLAGS (ntype) = new_flags; + + /* Set length of new type to that of the original type. */ + TYPE_LENGTH (ntype) = TYPE_LENGTH (type); - /* Now set the address-space flag, and return the new type. */ - ntype->flags |= space_flag; return ntype; } +/* Make an address-space-delimited variant of a type -- a type that + is identical to the one supplied except that it has an address + space attribute attached to it (such as "code" or "data"). + + The space attributes "code" and "data" are for Harvard architectures. + The address space attributes are for architectures which have + alternately sized pointers or pointers with alternate representations. */ + +struct type * +make_type_with_address_space (struct type *type, int space_flag) +{ + struct type *ntype; + int new_flags = ((TYPE_INSTANCE_FLAGS (type) + & ~(TYPE_FLAG_CODE_SPACE | TYPE_FLAG_DATA_SPACE + | TYPE_FLAG_ADDRESS_CLASS_ALL)) + | space_flag); + + return make_qualified_type (type, new_flags, NULL); +} /* Make a "c-v" variant of a type -- a type that is identical to the one supplied except that it may have const or volatile attributes @@ -421,146 +504,80 @@ make_type_with_address_space (struct type *type, int space_flag) struct type * make_cv_type (int cnst, int voltl, struct type *type, struct type **typeptr) { - register struct type *ntype; /* New type */ - register struct type *tmp_type = type; /* tmp type */ + struct type *ntype; /* New type */ + struct type *tmp_type = type; /* tmp type */ struct objfile *objfile; - ntype = TYPE_CV_TYPE (type); - - while (ntype != type) - { - if ((TYPE_CONST (ntype) == cnst) && - (TYPE_VOLATILE (ntype) == voltl)) - { - if (typeptr == 0) - return ntype; - else if (*typeptr == 0) - { - *typeptr = ntype; /* Tracking alloc, and we have new type. */ - return ntype; - } - } - tmp_type = ntype; - ntype = TYPE_CV_TYPE (ntype); - } - - if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */ - { - ntype = alloc_type (TYPE_OBJFILE (type)); - if (typeptr) - *typeptr = ntype; - } - else - /* We have storage, but need to reset it. */ - { - ntype = *typeptr; - objfile = TYPE_OBJFILE (ntype); - /* memset ((char *) ntype, 0, sizeof (struct type)); */ - TYPE_OBJFILE (ntype) = objfile; - } - - /* Copy original type */ - memcpy ((char *) ntype, (char *) type, sizeof (struct type)); - /* But zero out fields that shouldn't be copied */ - TYPE_POINTER_TYPE (ntype) = (struct type *) 0; /* Need new pointer kind */ - TYPE_REFERENCE_TYPE (ntype) = (struct type *) 0; /* Need new referene kind */ - TYPE_AS_TYPE (ntype) = ntype; /* Need new address-space kind. */ - /* Note: TYPE_TARGET_TYPE can be left as is */ + int new_flags = (TYPE_INSTANCE_FLAGS (type) + & ~(TYPE_FLAG_CONST | TYPE_FLAG_VOLATILE)); - /* Set flags appropriately */ if (cnst) - TYPE_FLAGS (ntype) |= TYPE_FLAG_CONST; - else - TYPE_FLAGS (ntype) &= ~TYPE_FLAG_CONST; + new_flags |= TYPE_FLAG_CONST; if (voltl) - TYPE_FLAGS (ntype) |= TYPE_FLAG_VOLATILE; - else - TYPE_FLAGS (ntype) &= ~TYPE_FLAG_VOLATILE; - - /* Fix the chain of cv variants */ - TYPE_CV_TYPE (ntype) = type; - TYPE_CV_TYPE (tmp_type) = ntype; - - return ntype; -} - -/* When reading in a class type, we may have created references to - cv-qualified versions of the type (in method arguments, for - instance). Update everything on the cv ring from the primary - type TYPE. - - The only reason we do not need to do the same thing for address - spaces is that type readers do not create address space qualified - types. */ -void -finish_cv_type (struct type *type) -{ - struct type *ntype, *cv_type, *ptr_type, *ref_type; - int cv_flags; + new_flags |= TYPE_FLAG_VOLATILE; - gdb_assert (!TYPE_CONST (type) && !TYPE_VOLATILE (type)); - - ntype = type; - while ((ntype = TYPE_CV_TYPE (ntype)) != type) + if (typeptr && *typeptr != NULL) { - /* Save cv_flags. */ - cv_flags = TYPE_FLAGS (ntype) & (TYPE_FLAG_VOLATILE | TYPE_FLAG_CONST); - - /* If any reference or pointer types were created, save them too. */ - ptr_type = TYPE_POINTER_TYPE (ntype); - ref_type = TYPE_REFERENCE_TYPE (ntype); - - /* Don't disturb the CV chain. */ - cv_type = TYPE_CV_TYPE (ntype); - - /* Verify that we haven't added any address-space qualified types, - for the future. */ - gdb_assert (ntype == TYPE_AS_TYPE (ntype)); + /* Objfile is per-core-type. This const-qualified type had best + belong to the same objfile as the type it is qualifying, unless + we are overwriting a stub type, in which case the safest thing + to do is to copy the core type into the new objfile. */ - /* Copy original type */ - memcpy ((char *) ntype, (char *) type, sizeof (struct type)); + gdb_assert (TYPE_OBJFILE (*typeptr) == TYPE_OBJFILE (type) + || TYPE_STUB (*typeptr)); + if (TYPE_OBJFILE (*typeptr) != TYPE_OBJFILE (type)) + { + TYPE_MAIN_TYPE (*typeptr) + = TYPE_ALLOC (*typeptr, sizeof (struct main_type)); + *TYPE_MAIN_TYPE (*typeptr) + = *TYPE_MAIN_TYPE (type); + } + } + + ntype = make_qualified_type (type, new_flags, typeptr ? *typeptr : NULL); - /* Restore everything. */ - TYPE_POINTER_TYPE (ntype) = ptr_type; - TYPE_REFERENCE_TYPE (ntype) = ref_type; - TYPE_CV_TYPE (ntype) = cv_type; - TYPE_FLAGS (ntype) = TYPE_FLAGS (ntype) | cv_flags; + if (typeptr != NULL) + *typeptr = ntype; - TYPE_AS_TYPE (ntype) = ntype; - } + return ntype; } -/* Replace the contents of ntype with the type *type. +/* Replace the contents of ntype with the type *type. This changes the + contents, rather than the pointer for TYPE_MAIN_TYPE (ntype); thus + the changes are propogated to all types in the TYPE_CHAIN. In order to build recursive types, it's inevitable that we'll need to update types in place --- but this sort of indiscriminate smashing is ugly, and needs to be replaced with something more - controlled. For example, Daniel Jacobowitz has suggested moving - the fields common to a set of c/v variants into their own object, - which the variants would share. - - This function does not handle the replacement type being - cv-qualified; it could be easily fixed to, but it would be better - to just change the whole approach. */ + controlled. TYPE_MAIN_TYPE is a step in this direction; it's not + clear if more steps are needed. */ void replace_type (struct type *ntype, struct type *type) { - struct type *cv_chain, *as_chain, *ptr, *ref; + struct type *chain; - cv_chain = TYPE_CV_TYPE (ntype); - as_chain = TYPE_AS_TYPE (ntype); - ptr = TYPE_POINTER_TYPE (ntype); - ref = TYPE_REFERENCE_TYPE (ntype); + *TYPE_MAIN_TYPE (ntype) = *TYPE_MAIN_TYPE (type); - *ntype = *type; + /* The type length is not a part of the main type. Update it for each + type on the variant chain. */ + chain = ntype; + do { + /* Assert that this element of the chain has no address-class bits + set in its flags. Such type variants might have type lengths + which are supposed to be different from the non-address-class + variants. This assertion shouldn't ever be triggered because + symbol readers which do construct address-class variants don't + call replace_type(). */ + gdb_assert (TYPE_ADDRESS_CLASS_ALL (chain) == 0); - TYPE_POINTER_TYPE (ntype) = ptr; - TYPE_REFERENCE_TYPE (ntype) = ref; - TYPE_CV_TYPE (ntype) = cv_chain; - TYPE_AS_TYPE (ntype) = as_chain; + TYPE_LENGTH (ntype) = TYPE_LENGTH (type); + chain = TYPE_CHAIN (chain); + } while (ntype != chain); - finish_cv_type (ntype); + /* Assert that the two types have equivalent instance qualifiers. + This should be true for at least all of our debug readers. */ + gdb_assert (TYPE_INSTANCE_FLAGS (ntype) == TYPE_INSTANCE_FLAGS (type)); } /* Implement direct support for MEMBER_TYPE in GNU C++. @@ -571,7 +588,7 @@ replace_type (struct type *ntype, struct type *type) struct type * lookup_member_type (struct type *type, struct type *domain) { - register struct type *mtype; + struct type *mtype; mtype = alloc_type (TYPE_OBJFILE (type)); smash_to_member_type (mtype, domain, type); @@ -593,7 +610,6 @@ allocate_stub_method (struct type *type) TYPE_OBJFILE (type)); TYPE_TARGET_TYPE (mtype) = type; /* _DOMAIN_TYPE (mtype) = unknown yet */ - /* _ARG_TYPES (mtype) = unknown yet */ return (mtype); } @@ -833,6 +849,64 @@ init_vector_type (struct type *elt_type, int n) return array_type; } +static struct type * +build_builtin_type_vec64 (void) +{ + /* Construct a type for the 64 bit registers. The type we're + building is this: */ +#if 0 + union __gdb_builtin_type_vec64 + { + int64_t uint64; + float v2_float[2]; + int32_t v2_int32[2]; + int16_t v4_int16[4]; + int8_t v8_int8[8]; + }; +#endif + + struct type *t; + + t = init_composite_type ("__gdb_builtin_type_vec64", TYPE_CODE_UNION); + append_composite_type_field (t, "uint64", builtin_type_int64); + append_composite_type_field (t, "v2_float", builtin_type_v2_float); + append_composite_type_field (t, "v2_int32", builtin_type_v2_int32); + append_composite_type_field (t, "v4_int16", builtin_type_v4_int16); + append_composite_type_field (t, "v8_int8", builtin_type_v8_int8); + + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec64"; + return t; +} + +static struct type * +build_builtin_type_vec64i (void) +{ + /* Construct a type for the 64 bit registers. The type we're + building is this: */ +#if 0 + union __gdb_builtin_type_vec64i + { + int64_t uint64; + int32_t v2_int32[2]; + int16_t v4_int16[4]; + int8_t v8_int8[8]; + }; +#endif + + struct type *t; + + t = init_composite_type ("__gdb_builtin_type_vec64i", TYPE_CODE_UNION); + append_composite_type_field (t, "uint64", builtin_type_int64); + append_composite_type_field (t, "v2_int32", builtin_type_v2_int32); + append_composite_type_field (t, "v4_int16", builtin_type_v4_int16); + append_composite_type_field (t, "v8_int8", builtin_type_v8_int8); + + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec64i"; + return t; +} + static struct type * build_builtin_type_vec128 (void) { @@ -858,6 +932,28 @@ build_builtin_type_vec128 (void) append_composite_type_field (t, "v8_int16", builtin_type_v8_int16); append_composite_type_field (t, "v16_int8", builtin_type_v16_int8); + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec128"; + return t; +} + +static struct type * +build_builtin_type_vec128i (void) +{ + /* 128-bit Intel SIMD registers */ + struct type *t; + + t = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION); + append_composite_type_field (t, "v4_float", builtin_type_v4_float); + append_composite_type_field (t, "v2_double", builtin_type_v2_double); + append_composite_type_field (t, "v16_int8", builtin_type_v16_int8); + append_composite_type_field (t, "v8_int16", builtin_type_v8_int16); + append_composite_type_field (t, "v4_int32", builtin_type_v4_int32); + append_composite_type_field (t, "v2_int64", builtin_type_v2_int64); + append_composite_type_field (t, "uint128", builtin_type_int128); + + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec128i"; return t; } @@ -879,7 +975,7 @@ smash_to_member_type (struct type *type, struct type *domain, objfile = TYPE_OBJFILE (type); - memset ((char *) type, 0, sizeof (struct type)); + smash_type (type); TYPE_OBJFILE (type) = objfile; TYPE_TARGET_TYPE (type) = to_type; TYPE_DOMAIN_TYPE (type) = domain; @@ -896,17 +992,21 @@ smash_to_member_type (struct type *type, struct type *domain, void smash_to_method_type (struct type *type, struct type *domain, - struct type *to_type, struct type **args) + struct type *to_type, struct field *args, + int nargs, int varargs) { struct objfile *objfile; objfile = TYPE_OBJFILE (type); - memset ((char *) type, 0, sizeof (struct type)); + smash_type (type); TYPE_OBJFILE (type) = objfile; TYPE_TARGET_TYPE (type) = to_type; TYPE_DOMAIN_TYPE (type) = domain; - TYPE_ARG_TYPES (type) = args; + TYPE_FIELDS (type) = args; + TYPE_NFIELDS (type) = nargs; + if (varargs) + TYPE_FLAGS (type) |= TYPE_FLAG_VARARGS; TYPE_LENGTH (type) = 1; /* In practice, this is never needed. */ TYPE_CODE (type) = TYPE_CODE_METHOD; } @@ -915,7 +1015,7 @@ smash_to_method_type (struct type *type, struct type *domain, "union ", or "enum ". If the type has a NULL name, return NULL. */ char * -type_name_no_tag (register const struct type *type) +type_name_no_tag (const struct type *type) { if (TYPE_TAG_NAME (type) != NULL) return TYPE_TAG_NAME (type); @@ -936,7 +1036,7 @@ lookup_primitive_typename (char *name) for (p = current_language->la_builtin_type_vector; *p != NULL; p++) { - if (STREQ ((**p)->name, name)) + if (strcmp (TYPE_NAME (**p), name) == 0) { return (**p); } @@ -951,10 +1051,10 @@ lookup_primitive_typename (char *name) struct type * lookup_typename (char *name, struct block *block, int noerr) { - register struct symbol *sym; - register struct type *tmp; + struct symbol *sym; + struct type *tmp; - sym = lookup_symbol (name, block, VAR_NAMESPACE, 0, (struct symtab **) NULL); + sym = lookup_symbol (name, block, VAR_DOMAIN, 0, (struct symtab **) NULL); if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF) { tmp = lookup_primitive_typename (name); @@ -1005,9 +1105,9 @@ lookup_signed_typename (char *name) struct type * lookup_struct (char *name, struct block *block) { - register struct symbol *sym; + struct symbol *sym; - sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, + sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0, (struct symtab **) NULL); if (sym == NULL) @@ -1027,10 +1127,10 @@ lookup_struct (char *name, struct block *block) struct type * lookup_union (char *name, struct block *block) { - register struct symbol *sym; + struct symbol *sym; struct type *t; - sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, + sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0, (struct symtab **) NULL); if (sym == NULL) @@ -1059,9 +1159,9 @@ lookup_union (char *name, struct block *block) struct type * lookup_enum (char *name, struct block *block) { - register struct symbol *sym; + struct symbol *sym; - sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, + sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0, (struct symtab **) NULL); if (sym == NULL) { @@ -1081,13 +1181,13 @@ struct type * lookup_template_type (char *name, struct type *type, struct block *block) { struct symbol *sym; - char *nam = (char *) alloca (strlen (name) + strlen (type->name) + 4); + char *nam = (char *) alloca (strlen (name) + strlen (TYPE_NAME (type)) + 4); strcpy (nam, name); strcat (nam, "<"); - strcat (nam, type->name); + strcat (nam, TYPE_NAME (type)); strcat (nam, " >"); /* FIXME, extra space still introduced in gcc? */ - sym = lookup_symbol (nam, block, VAR_NAMESPACE, 0, (struct symtab **) NULL); + sym = lookup_symbol (nam, block, VAR_DOMAIN, 0, (struct symtab **) NULL); if (sym == NULL) { @@ -1143,7 +1243,7 @@ lookup_struct_elt_type (struct type *type, char *name, int noerr) char *typename; typename = type_name_no_tag (type); - if (typename != NULL && STREQ (typename, name)) + if (typename != NULL && strcmp (typename, name) == 0) return type; } #endif @@ -1205,13 +1305,12 @@ fill_in_vptr_fieldno (struct type *type) virtual (and hence we cannot share the table pointer). */ for (i = 0; i < TYPE_N_BASECLASSES (type); i++) { - fill_in_vptr_fieldno (TYPE_BASECLASS (type, i)); - if (TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)) >= 0) + struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); + fill_in_vptr_fieldno (baseclass); + if (TYPE_VPTR_FIELDNO (baseclass) >= 0) { - TYPE_VPTR_FIELDNO (type) - = TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)); - TYPE_VPTR_BASETYPE (type) - = TYPE_VPTR_BASETYPE (TYPE_BASECLASS (type, i)); + TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (baseclass); + TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (baseclass); break; } } @@ -1257,8 +1356,11 @@ get_destructor_fn_field (struct type *t, int *method_indexp, int *field_indexp) This used to be coded as a macro, but I don't think it is called often enough to merit such treatment. */ -struct complaint stub_noname_complaint = -{"stub type has NULL name", 0, 0}; +static void +stub_noname_complaint (void) +{ + complaint (&symfile_complaints, "stub type has NULL name"); +} struct type * check_typedef (struct type *type) @@ -1280,15 +1382,15 @@ check_typedef (struct type *type) name = type_name_no_tag (type); /* FIXME: shouldn't we separately check the TYPE_NAME and the - TYPE_TAG_NAME, and look in STRUCT_NAMESPACE and/or VAR_NAMESPACE + TYPE_TAG_NAME, and look in STRUCT_DOMAIN and/or VAR_DOMAIN as appropriate? (this code was written before TYPE_NAME and TYPE_TAG_NAME were separate). */ if (name == NULL) { - complain (&stub_noname_complaint); + stub_noname_complaint (); return type; } - sym = lookup_symbol (name, 0, STRUCT_NAMESPACE, 0, + sym = lookup_symbol (name, 0, STRUCT_DOMAIN, 0, (struct symtab **) NULL); if (sym) TYPE_TARGET_TYPE (type) = SYMBOL_TYPE (sym); @@ -1312,7 +1414,7 @@ check_typedef (struct type *type) struct type *newtype; if (name == NULL) { - complain (&stub_noname_complaint); + stub_noname_complaint (); return type; } newtype = lookup_transparent_type (name); @@ -1324,16 +1426,16 @@ check_typedef (struct type *type) { char *name = type_name_no_tag (type); /* FIXME: shouldn't we separately check the TYPE_NAME and the - TYPE_TAG_NAME, and look in STRUCT_NAMESPACE and/or VAR_NAMESPACE + TYPE_TAG_NAME, and look in STRUCT_DOMAIN and/or VAR_DOMAIN as appropriate? (this code was written before TYPE_NAME and TYPE_TAG_NAME were separate). */ struct symbol *sym; if (name == NULL) { - complain (&stub_noname_complaint); + stub_noname_complaint (); return type; } - sym = lookup_symbol (name, 0, STRUCT_NAMESPACE, 0, (struct symtab **) NULL); + sym = lookup_symbol (name, 0, STRUCT_DOMAIN, 0, (struct symtab **) NULL); if (sym) make_cv_type (is_const, is_volatile, SYMBOL_TYPE (sym), &type); } @@ -1371,206 +1473,10 @@ check_typedef (struct type *type) return type; } -/* New code added to support parsing of Cfront stabs strings */ -#define INIT_EXTRA { pextras->len=0; pextras->str[0]='\0'; } -#define ADD_EXTRA(c) { pextras->str[pextras->len++]=c; } - -static void -add_name (struct extra *pextras, char *n) -{ - int nlen; - - if ((nlen = (n ? strlen (n) : 0)) == 0) - return; - sprintf (pextras->str + pextras->len, "%d%s", nlen, n); - pextras->len = strlen (pextras->str); -} - -static void -add_mangled_type (struct extra *pextras, struct type *t) -{ - enum type_code tcode; - int tlen, tflags; - char *tname; - - tcode = TYPE_CODE (t); - tlen = TYPE_LENGTH (t); - tflags = TYPE_FLAGS (t); - tname = TYPE_NAME (t); - /* args of "..." seem to get mangled as "e" */ - - switch (tcode) - { - case TYPE_CODE_INT: - if (tflags == 1) - ADD_EXTRA ('U'); - switch (tlen) - { - case 1: - ADD_EXTRA ('c'); - break; - case 2: - ADD_EXTRA ('s'); - break; - case 4: - { - char *pname; - if ((pname = strrchr (tname, 'l'), pname) && !strcmp (pname, "long")) - { - ADD_EXTRA ('l'); - } - else - { - ADD_EXTRA ('i'); - } - } - break; - default: - { - - static struct complaint msg = - {"Bad int type code length x%x\n", 0, 0}; - - complain (&msg, tlen); - - } - } - break; - case TYPE_CODE_FLT: - switch (tlen) - { - case 4: - ADD_EXTRA ('f'); - break; - case 8: - ADD_EXTRA ('d'); - break; - case 16: - ADD_EXTRA ('r'); - break; - default: - { - static struct complaint msg = - {"Bad float type code length x%x\n", 0, 0}; - complain (&msg, tlen); - } - } - break; - case TYPE_CODE_REF: - ADD_EXTRA ('R'); - /* followed by what it's a ref to */ - break; - case TYPE_CODE_PTR: - ADD_EXTRA ('P'); - /* followed by what it's a ptr to */ - break; - case TYPE_CODE_TYPEDEF: - { - static struct complaint msg = - {"Typedefs in overloaded functions not yet supported\n", 0, 0}; - complain (&msg); - } - /* followed by type bytes & name */ - break; - case TYPE_CODE_FUNC: - ADD_EXTRA ('F'); - /* followed by func's arg '_' & ret types */ - break; - case TYPE_CODE_VOID: - ADD_EXTRA ('v'); - break; - case TYPE_CODE_METHOD: - ADD_EXTRA ('M'); - /* followed by name of class and func's arg '_' & ret types */ - add_name (pextras, tname); - ADD_EXTRA ('F'); /* then mangle function */ - break; - case TYPE_CODE_STRUCT: /* C struct */ - case TYPE_CODE_UNION: /* C union */ - case TYPE_CODE_ENUM: /* Enumeration type */ - /* followed by name of type */ - add_name (pextras, tname); - break; - - /* errors possible types/not supported */ - case TYPE_CODE_CHAR: - case TYPE_CODE_ARRAY: /* Array type */ - case TYPE_CODE_MEMBER: /* Member type */ - case TYPE_CODE_BOOL: - case TYPE_CODE_COMPLEX: /* Complex float */ - case TYPE_CODE_UNDEF: - case TYPE_CODE_SET: /* Pascal sets */ - case TYPE_CODE_RANGE: - case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: - case TYPE_CODE_ERROR: - default: - { - static struct complaint msg = - {"Unknown type code x%x\n", 0, 0}; - complain (&msg, tcode); - } - } - if (t->target_type) - add_mangled_type (pextras, t->target_type); -} - -#if 0 -void -cfront_mangle_name (struct type *type, int i, int j) -{ - struct fn_field *f; - char *mangled_name = gdb_mangle_name (type, i, j); - - f = TYPE_FN_FIELDLIST1 (type, i); /* moved from below */ - - /* kludge to support cfront methods - gdb expects to find "F" for - ARM_mangled names, so when we mangle, we have to add it here */ - if (ARM_DEMANGLING) - { - int k; - char *arm_mangled_name; - struct fn_field *method = &f[j]; - char *field_name = TYPE_FN_FIELDLIST_NAME (type, i); - char *physname = TYPE_FN_FIELD_PHYSNAME (f, j); - char *newname = type_name_no_tag (type); - - struct type *ftype = TYPE_FN_FIELD_TYPE (f, j); - int nargs = TYPE_NFIELDS (ftype); /* number of args */ - struct extra extras, *pextras = &extras; - INIT_EXTRA - - if (TYPE_FN_FIELD_STATIC_P (f, j)) /* j for sublist within this list */ - ADD_EXTRA ('S') - ADD_EXTRA ('F') - /* add args here! */ - if (nargs <= 1) /* no args besides this */ - ADD_EXTRA ('v') - else - { - for (k = 1; k < nargs; k++) - { - struct type *t; - t = TYPE_FIELD_TYPE (ftype, k); - add_mangled_type (pextras, t); - } - } - ADD_EXTRA ('\0') - printf ("add_mangled_type: %s\n", extras.str); /* FIXME */ - xasprintf (&arm_mangled_name, "%s%s", mangled_name, extras.str); - xfree (mangled_name); - mangled_name = arm_mangled_name; - } -} -#endif /* 0 */ - -#undef ADD_EXTRA -/* End of new code added to support parsing of Cfront stabs strings */ - /* Parse a type expression in the string [P..P+LENGTH). If an error occurs, silently return builtin_type_void. */ -struct type * +static struct type * safe_parse_type (char *p, int length) { struct ui_file *saved_gdb_stderr; @@ -1601,7 +1507,7 @@ safe_parse_type (char *p, int length) which info used to be in the stab's but was removed to hack back the space required for them. */ -void +static void check_stub_method (struct type *type, int method_id, int signature_id) { struct fn_field *f; @@ -1610,7 +1516,7 @@ check_stub_method (struct type *type, int method_id, int signature_id) DMGL_PARAMS | DMGL_ANSI); char *argtypetext, *p; int depth = 0, argcount = 1; - struct type **argtypes; + struct field *argtypes; struct type *mtype; /* Make sure we got back a function string that we can use. */ @@ -1643,11 +1549,14 @@ check_stub_method (struct type *type, int method_id, int signature_id) p += 1; } - /* We need two more slots: one for the THIS pointer, and one for the - NULL [...] or void [end of arglist]. */ + /* If we read one argument and it was ``void'', don't count it. */ + if (strncmp (argtypetext, "(void)", 6) == 0) + argcount -= 1; - argtypes = (struct type **) - TYPE_ALLOC (type, (argcount + 2) * sizeof (struct type *)); + /* We need one extra slot, for the THIS pointer. */ + + argtypes = (struct field *) + TYPE_ALLOC (type, (argcount + 1) * sizeof (struct field)); p = argtypetext; /* Add THIS pointer for non-static methods. */ @@ -1656,7 +1565,7 @@ check_stub_method (struct type *type, int method_id, int signature_id) argcount = 0; else { - argtypes[0] = lookup_pointer_type (type); + argtypes[0].type = lookup_pointer_type (type); argcount = 1; } @@ -1667,10 +1576,12 @@ check_stub_method (struct type *type, int method_id, int signature_id) { if (depth <= 0 && (*p == ',' || *p == ')')) { - /* Avoid parsing of ellipsis, they will be handled below. */ - if (strncmp (argtypetext, "...", p - argtypetext) != 0) + /* Avoid parsing of ellipsis, they will be handled below. + Also avoid ``void'' as above. */ + if (strncmp (argtypetext, "...", p - argtypetext) != 0 + && strncmp (argtypetext, "void", p - argtypetext) != 0) { - argtypes[argcount] = + argtypes[argcount].type = safe_parse_type (argtypetext, p - argtypetext); argcount += 1; } @@ -1690,25 +1601,62 @@ check_stub_method (struct type *type, int method_id, int signature_id) } } - if (p[-2] != '.') /* Not '...' */ - { - argtypes[argcount] = builtin_type_void; /* List terminator */ - } - else - { - argtypes[argcount] = NULL; /* Ellist terminator */ - } - - xfree (demangled_name); - TYPE_FN_FIELD_PHYSNAME (f, signature_id) = mangled_name; /* Now update the old "stub" type into a real type. */ mtype = TYPE_FN_FIELD_TYPE (f, signature_id); TYPE_DOMAIN_TYPE (mtype) = type; - TYPE_ARG_TYPES (mtype) = argtypes; + TYPE_FIELDS (mtype) = argtypes; + TYPE_NFIELDS (mtype) = argcount; TYPE_FLAGS (mtype) &= ~TYPE_FLAG_STUB; TYPE_FN_FIELD_STUB (f, signature_id) = 0; + if (p[-2] == '.') + TYPE_FLAGS (mtype) |= TYPE_FLAG_VARARGS; + + xfree (demangled_name); +} + +/* This is the external interface to check_stub_method, above. This function + unstubs all of the signatures for TYPE's METHOD_ID method name. After + calling this function TYPE_FN_FIELD_STUB will be cleared for each signature + and TYPE_FN_FIELDLIST_NAME will be correct. + + This function unfortunately can not die until stabs do. */ + +void +check_stub_method_group (struct type *type, int method_id) +{ + int len = TYPE_FN_FIELDLIST_LENGTH (type, method_id); + struct fn_field *f = TYPE_FN_FIELDLIST1 (type, method_id); + int j, found_stub = 0; + + for (j = 0; j < len; j++) + if (TYPE_FN_FIELD_STUB (f, j)) + { + found_stub = 1; + check_stub_method (type, method_id, j); + } + + /* GNU v3 methods with incorrect names were corrected when we read in + type information, because it was cheaper to do it then. The only GNU v2 + methods with incorrect method names are operators and destructors; + destructors were also corrected when we read in type information. + + Therefore the only thing we need to handle here are v2 operator + names. */ + if (found_stub && strncmp (TYPE_FN_FIELD_PHYSNAME (f, 0), "_Z", 2) != 0) + { + int ret; + char dem_opname[256]; + + ret = cplus_demangle_opname (TYPE_FN_FIELDLIST_NAME (type, method_id), + dem_opname, DMGL_ANSI); + if (!ret) + ret = cplus_demangle_opname (TYPE_FN_FIELDLIST_NAME (type, method_id), + dem_opname, 0); + if (ret) + TYPE_FN_FIELDLIST_NAME (type, method_id) = xstrdup (dem_opname); + } } const struct cplus_struct_type cplus_struct_default; @@ -1727,7 +1675,7 @@ allocate_cplus_struct_type (struct type *type) /* Helper function to initialize the standard scalar types. If NAME is non-NULL and OBJFILE is non-NULL, then we make a copy - of the string pointed to by name in the type_obstack for that objfile, + of the string pointed to by name in the objfile_obstack for that objfile, and initialize the type name to that copy. There are places (mipsread.c in particular, where init_type is called with a NULL value for NAME). */ @@ -1735,7 +1683,7 @@ struct type * init_type (enum type_code code, int length, int flags, char *name, struct objfile *objfile) { - register struct type *type; + struct type *type; type = alloc_type (objfile); TYPE_CODE (type) = code; @@ -1744,7 +1692,7 @@ init_type (enum type_code code, int length, int flags, char *name, if ((name != NULL) && (objfile != NULL)) { TYPE_NAME (type) = - obsavestring (name, strlen (name), &objfile->type_obstack); + obsavestring (name, strlen (name), &objfile->objfile_obstack); } else { @@ -1753,7 +1701,11 @@ init_type (enum type_code code, int length, int flags, char *name, /* C++ fancies. */ - if (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION) + if (name && strcmp (name, "char") == 0) + TYPE_FLAGS (type) |= TYPE_FLAG_NOSIGN; + + if (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION + || code == TYPE_CODE_NAMESPACE) { INIT_CPLUS_SPECIFIC (type); } @@ -1826,8 +1778,8 @@ append_composite_type_field (struct type *t, char *name, struct type *field) struct type * lookup_fundamental_type (struct objfile *objfile, int typeid) { - register struct type **typep; - register int nbytes; + struct type **typep; + int nbytes; if (typeid < 0 || typeid >= FT_NUM_MEMBERS) { @@ -1841,7 +1793,7 @@ lookup_fundamental_type (struct objfile *objfile, int typeid) { nbytes = FT_NUM_MEMBERS * sizeof (struct type *); objfile->fundamental_types = (struct type **) - obstack_alloc (&objfile->type_obstack, nbytes); + obstack_alloc (&objfile->objfile_obstack, nbytes); memset ((char *) objfile->fundamental_types, 0, nbytes); OBJSTAT (objfile, n_types += FT_NUM_MEMBERS); } @@ -1882,22 +1834,6 @@ is_integral_type (struct type *t) || (TYPE_CODE (t) == TYPE_CODE_BOOL))); } -/* Chill varying string and arrays are represented as follows: - - struct { int __var_length; ELEMENT_TYPE[MAX_SIZE] __var_data}; - - Return true if TYPE is such a Chill varying type. */ - -int -chill_varying_type (struct type *type) -{ - if (TYPE_CODE (type) != TYPE_CODE_STRUCT - || TYPE_NFIELDS (type) != 2 - || strcmp (TYPE_FIELD_NAME (type, 0), "__var_length") != 0) - return 0; - return 1; -} - /* Check whether BASE is an ancestor or base class or DCLASS Return 1 if so, and 0 if not. Note: callers may want to check for identity of the types before @@ -1937,7 +1873,7 @@ has_vtable (struct type *dclass) /* In the HP ANSI C++ runtime model, a class has a vtable only if it has virtual functions or virtual bases. */ - register int i; + int i; if (TYPE_CODE (dclass) != TYPE_CODE_CLASS) return 0; @@ -1980,7 +1916,7 @@ primary_base_class (struct type *dclass) is the first directly inherited, non-virtual base class that requires a virtual table */ - register int i; + int i; if (TYPE_CODE (dclass) != TYPE_CODE_CLASS) return NULL; @@ -2009,7 +1945,7 @@ static void virtual_base_list_aux (struct type *dclass) { struct vbase *tmp_vbase; - register int i; + int i; if (TYPE_CODE (dclass) != TYPE_CODE_CLASS) return; @@ -2066,9 +2002,9 @@ virtual_base_list_aux (struct type *dclass) struct type ** virtual_base_list (struct type *dclass) { - register struct vbase *tmp_vbase; - register struct vbase *tmp_vbase_2; - register int i; + struct vbase *tmp_vbase; + struct vbase *tmp_vbase_2; + int i; int count; struct type **vbase_array; @@ -2103,8 +2039,8 @@ virtual_base_list (struct type *dclass) int virtual_base_list_length (struct type *dclass) { - register int i; - register struct vbase *tmp_vbase; + int i; + struct vbase *tmp_vbase; current_vbase_list = NULL; virtual_base_list_aux (dclass); @@ -2121,8 +2057,8 @@ virtual_base_list_length (struct type *dclass) int virtual_base_list_length_skip_primaries (struct type *dclass) { - register int i; - register struct vbase *tmp_vbase; + int i; + struct vbase *tmp_vbase; struct type *primary; primary = TYPE_RUNTIME_PTR (dclass) ? TYPE_PRIMARY_BASE (dclass) : NULL; @@ -2150,8 +2086,8 @@ virtual_base_list_length_skip_primaries (struct type *dclass) int virtual_base_index (struct type *base, struct type *dclass) { - register struct type *vbase; - register int i; + struct type *vbase; + int i; if ((TYPE_CODE (dclass) != TYPE_CODE_CLASS) || (TYPE_CODE (base) != TYPE_CODE_CLASS)) @@ -2180,8 +2116,8 @@ virtual_base_index (struct type *base, struct type *dclass) int virtual_base_index_skip_primaries (struct type *base, struct type *dclass) { - register struct type *vbase; - register int i, j; + struct type *vbase; + int i, j; struct type *primary; if ((TYPE_CODE (dclass) != TYPE_CODE_CLASS) || @@ -2336,6 +2272,43 @@ rank_function (struct type **parms, int nparms, struct type **args, int nargs) return bv; } +/* Compare the names of two integer types, assuming that any sign + qualifiers have been checked already. We do it this way because + there may be an "int" in the name of one of the types. */ + +static int +integer_types_same_name_p (const char *first, const char *second) +{ + int first_p, second_p; + + /* If both are shorts, return 1; if neither is a short, keep checking. */ + first_p = (strstr (first, "short") != NULL); + second_p = (strstr (second, "short") != NULL); + if (first_p && second_p) + return 1; + if (first_p || second_p) + return 0; + + /* Likewise for long. */ + first_p = (strstr (first, "long") != NULL); + second_p = (strstr (second, "long") != NULL); + if (first_p && second_p) + return 1; + if (first_p || second_p) + return 0; + + /* Likewise for char. */ + first_p = (strstr (first, "char") != NULL); + second_p = (strstr (second, "char") != NULL); + if (first_p && second_p) + return 1; + if (first_p || second_p) + return 0; + + /* They must both be ints. */ + return 1; +} + /* Compare one type (PARM) for compatibility with another (ARG). * PARM is intended to be the parameter type of a function; and * ARG is the supplied argument's type. This function tests if @@ -2446,43 +2419,47 @@ rank_one_type (struct type *parm, struct type *arg) if (TYPE_NOSIGN (arg)) /* plain char -> plain char */ return 0; else - return INTEGER_COERCION_BADNESS; /* signed/unsigned char -> plain char */ + return INTEGER_CONVERSION_BADNESS; /* signed/unsigned char -> plain char */ } else if (TYPE_UNSIGNED (parm)) { if (TYPE_UNSIGNED (arg)) { - if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg))) - return 0; /* unsigned int -> unsigned int, or unsigned long -> unsigned long */ - else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long")) + /* unsigned int -> unsigned int, or unsigned long -> unsigned long */ + if (integer_types_same_name_p (TYPE_NAME (parm), TYPE_NAME (arg))) + return 0; + else if (integer_types_same_name_p (TYPE_NAME (arg), "int") + && integer_types_same_name_p (TYPE_NAME (parm), "long")) return INTEGER_PROMOTION_BADNESS; /* unsigned int -> unsigned long */ else - return INTEGER_COERCION_BADNESS; /* unsigned long -> unsigned int */ + return INTEGER_CONVERSION_BADNESS; /* unsigned long -> unsigned int */ } else { - if (!strcmp_iw (TYPE_NAME (arg), "long") && !strcmp_iw (TYPE_NAME (parm), "int")) - return INTEGER_COERCION_BADNESS; /* signed long -> unsigned int */ + if (integer_types_same_name_p (TYPE_NAME (arg), "long") + && integer_types_same_name_p (TYPE_NAME (parm), "int")) + return INTEGER_CONVERSION_BADNESS; /* signed long -> unsigned int */ else return INTEGER_CONVERSION_BADNESS; /* signed int/long -> unsigned int/long */ } } else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg)) { - if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg))) + if (integer_types_same_name_p (TYPE_NAME (parm), TYPE_NAME (arg))) return 0; - else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long")) + else if (integer_types_same_name_p (TYPE_NAME (arg), "int") + && integer_types_same_name_p (TYPE_NAME (parm), "long")) return INTEGER_PROMOTION_BADNESS; else - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; } else - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; } else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm)) return INTEGER_PROMOTION_BADNESS; else - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; case TYPE_CODE_ENUM: case TYPE_CODE_CHAR: case TYPE_CODE_RANGE: @@ -2504,7 +2481,7 @@ rank_one_type (struct type *parm, struct type *arg) case TYPE_CODE_RANGE: case TYPE_CODE_BOOL: case TYPE_CODE_ENUM: - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; case TYPE_CODE_FLT: return INT_FLOAT_CONVERSION_BADNESS; default: @@ -2517,12 +2494,12 @@ rank_one_type (struct type *parm, struct type *arg) case TYPE_CODE_RANGE: case TYPE_CODE_BOOL: case TYPE_CODE_ENUM: - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; case TYPE_CODE_FLT: return INT_FLOAT_CONVERSION_BADNESS; case TYPE_CODE_INT: if (TYPE_LENGTH (arg) > TYPE_LENGTH (parm)) - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm)) return INTEGER_PROMOTION_BADNESS; /* >>> !! else fall through !! <<< */ @@ -2534,7 +2511,7 @@ rank_one_type (struct type *parm, struct type *arg) if (TYPE_NOSIGN (arg)) return 0; else - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; } else if (TYPE_UNSIGNED (parm)) { @@ -2546,7 +2523,7 @@ rank_one_type (struct type *parm, struct type *arg) else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg)) return 0; else - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; default: return INCOMPATIBLE_TYPE_BADNESS; } @@ -2559,7 +2536,7 @@ rank_one_type (struct type *parm, struct type *arg) case TYPE_CODE_RANGE: case TYPE_CODE_BOOL: case TYPE_CODE_ENUM: - return INTEGER_COERCION_BADNESS; + return INTEGER_CONVERSION_BADNESS; case TYPE_CODE_FLT: return INT_FLOAT_CONVERSION_BADNESS; default: @@ -2699,25 +2676,18 @@ print_bit_vector (B_TYPE *bits, int nbits) } } -/* The args list is a strange beast. It is either terminated by a NULL - pointer for varargs functions, or by a pointer to a TYPE_CODE_VOID - type for normal fixed argcount functions. (FIXME someday) - Also note the first arg should be the "this" pointer, we may not want to - include it since we may get into a infinitely recursive situation. */ +/* Note the first arg should be the "this" pointer, we may not want to + include it since we may get into a infinitely recursive situation. */ static void -print_arg_types (struct type **args, int spaces) +print_arg_types (struct field *args, int nargs, int spaces) { if (args != NULL) { - while (*args != NULL) - { - recursive_dump_type (*args, spaces + 2); - if ((*args++)->code == TYPE_CODE_VOID) - { - break; - } - } + int i; + + for (i = 0; i < nargs; i++) + recursive_dump_type (args[i].type, spaces + 2); } } @@ -2762,7 +2732,9 @@ dump_fn_fieldlists (struct type *type, int spaces) gdb_print_host_address (TYPE_FN_FIELD_ARGS (f, overload_idx), gdb_stdout); printf_filtered ("\n"); - print_arg_types (TYPE_FN_FIELD_ARGS (f, overload_idx), spaces); + print_arg_types (TYPE_FN_FIELD_ARGS (f, overload_idx), + TYPE_NFIELDS (TYPE_FN_FIELD_TYPE (f, overload_idx)), + spaces); printfi_filtered (spaces + 8, "fcontext "); gdb_print_host_address (TYPE_FN_FIELD_FCONTEXT (f, overload_idx), gdb_stdout); @@ -2981,6 +2953,9 @@ recursive_dump_type (struct type *type, int spaces) case TYPE_CODE_TEMPLATE_ARG: printf_filtered ("(TYPE_CODE_TEMPLATE_ARG)"); break; + case TYPE_CODE_NAMESPACE: + printf_filtered ("(TYPE_CODE_NAMESPACE)"); + break; default: printf_filtered ("(UNKNOWN TYPE CODE)"); break; @@ -3011,12 +2986,35 @@ recursive_dump_type (struct type *type, int spaces) printfi_filtered (spaces, "reference_type "); gdb_print_host_address (TYPE_REFERENCE_TYPE (type), gdb_stdout); printf_filtered ("\n"); - printfi_filtered (spaces, "cv_type "); - gdb_print_host_address (TYPE_CV_TYPE (type), gdb_stdout); - printf_filtered ("\n"); - printfi_filtered (spaces, "as_type "); - gdb_print_host_address (TYPE_AS_TYPE (type), gdb_stdout); + printfi_filtered (spaces, "type_chain "); + gdb_print_host_address (TYPE_CHAIN (type), gdb_stdout); printf_filtered ("\n"); + printfi_filtered (spaces, "instance_flags 0x%x", TYPE_INSTANCE_FLAGS (type)); + if (TYPE_CONST (type)) + { + puts_filtered (" TYPE_FLAG_CONST"); + } + if (TYPE_VOLATILE (type)) + { + puts_filtered (" TYPE_FLAG_VOLATILE"); + } + if (TYPE_CODE_SPACE (type)) + { + puts_filtered (" TYPE_FLAG_CODE_SPACE"); + } + if (TYPE_DATA_SPACE (type)) + { + puts_filtered (" TYPE_FLAG_DATA_SPACE"); + } + if (TYPE_ADDRESS_CLASS_1 (type)) + { + puts_filtered (" TYPE_FLAG_ADDRESS_CLASS_1"); + } + if (TYPE_ADDRESS_CLASS_2 (type)) + { + puts_filtered (" TYPE_FLAG_ADDRESS_CLASS_2"); + } + puts_filtered ("\n"); printfi_filtered (spaces, "flags 0x%x", TYPE_FLAGS (type)); if (TYPE_UNSIGNED (type)) { @@ -3038,14 +3036,6 @@ recursive_dump_type (struct type *type, int spaces) { puts_filtered (" TYPE_FLAG_STATIC"); } - if (TYPE_CONST (type)) - { - puts_filtered (" TYPE_FLAG_CONST"); - } - if (TYPE_VOLATILE (type)) - { - puts_filtered (" TYPE_FLAG_VOLATILE"); - } if (TYPE_PROTOTYPED (type)) { puts_filtered (" TYPE_FLAG_PROTOTYPED"); @@ -3054,14 +3044,6 @@ recursive_dump_type (struct type *type, int spaces) { puts_filtered (" TYPE_FLAG_INCOMPLETE"); } - if (TYPE_CODE_SPACE (type)) - { - puts_filtered (" TYPE_FLAG_CODE_SPACE"); - } - if (TYPE_DATA_SPACE (type)) - { - puts_filtered (" TYPE_FLAG_DATA_SPACE"); - } if (TYPE_VARARGS (type)) { puts_filtered (" TYPE_FLAG_VARARGS"); @@ -3105,14 +3087,6 @@ recursive_dump_type (struct type *type, int spaces) printfi_filtered (spaces, "vptr_fieldno %d\n", TYPE_VPTR_FIELDNO (type)); switch (TYPE_CODE (type)) { - case TYPE_CODE_METHOD: - case TYPE_CODE_FUNC: - printfi_filtered (spaces, "arg_types "); - gdb_print_host_address (TYPE_ARG_TYPES (type), gdb_stdout); - puts_filtered ("\n"); - print_arg_types (TYPE_ARG_TYPES (type), spaces); - break; - case TYPE_CODE_STRUCT: printfi_filtered (spaces, "cplus_stuff "); gdb_print_host_address (TYPE_CPLUS_SPECIFIC (type), gdb_stdout); @@ -3248,6 +3222,10 @@ build_gdbtypes (void) init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 0, "string", (struct objfile *) NULL); + builtin_type_int0 = + init_type (TYPE_CODE_INT, 0 / 8, + 0, + "int0_t", (struct objfile *) NULL); builtin_type_int8 = init_type (TYPE_CODE_INT, 8 / 8, 0, @@ -3318,7 +3296,9 @@ build_gdbtypes (void) = init_simd_type ("__builtin_v2si", builtin_type_int32, "f", 2); /* 128 bit vectors. */ + builtin_type_v2_double = init_vector_type (builtin_type_double, 2); builtin_type_v4_float = init_vector_type (builtin_type_float, 4); + builtin_type_v2_int64 = init_vector_type (builtin_type_int64, 2); builtin_type_v4_int32 = init_vector_type (builtin_type_int32, 4); builtin_type_v8_int16 = init_vector_type (builtin_type_int16, 8); builtin_type_v16_int8 = init_vector_type (builtin_type_int8, 16); @@ -3328,8 +3308,11 @@ build_gdbtypes (void) builtin_type_v4_int16 = init_vector_type (builtin_type_int16, 4); builtin_type_v8_int8 = init_vector_type (builtin_type_int8, 8); - /* Vector types. */ + /* Vector types. */ + builtin_type_vec64 = build_builtin_type_vec64 (); + builtin_type_vec64i = build_builtin_type_vec64i (); builtin_type_vec128 = build_builtin_type_vec128 (); + builtin_type_vec128i = build_builtin_type_vec128i (); /* Pointer/Address types. */ @@ -3372,7 +3355,6 @@ build_gdbtypes (void) "__bfd_vma", (struct objfile *) NULL); } - extern void _initialize_gdbtypes (void); void _initialize_gdbtypes (void) @@ -3418,7 +3400,9 @@ _initialize_gdbtypes (void) register_gdbarch_swap (&builtin_type_v8hi, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v4hi, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v2si, sizeof (struct type *), NULL); + register_gdbarch_swap (&builtin_type_v2_double, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v4_float, sizeof (struct type *), NULL); + register_gdbarch_swap (&builtin_type_v2_int64, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v4_int32, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v8_int16, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v16_int8, sizeof (struct type *), NULL); @@ -3427,6 +3411,7 @@ _initialize_gdbtypes (void) register_gdbarch_swap (&builtin_type_v8_int8, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v4_int16, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_vec128, sizeof (struct type *), NULL); + register_gdbarch_swap (&builtin_type_vec128i, sizeof (struct type *), NULL); REGISTER_GDBARCH_SWAP (builtin_type_void_data_ptr); REGISTER_GDBARCH_SWAP (builtin_type_void_func_ptr); REGISTER_GDBARCH_SWAP (builtin_type_CORE_ADDR);