| Index: gdb/gdbtypes.c
|
| diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
|
| index 8142ab9cb3ae503cab639765de8bd330097e1b46..2470304e434d633c5f7db1d0c4fe6bc89975c837 100644
|
| --- a/gdb/gdbtypes.c
|
| +++ b/gdb/gdbtypes.c
|
| @@ -1,6 +1,6 @@
|
| /* Support routines for manipulating internal types for GDB.
|
|
|
| - Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 1992-2013 Free Software Foundation, Inc.
|
|
|
| Contributed by Cygnus Support, using pieces from other GDB modules.
|
|
|
| @@ -20,7 +20,7 @@
|
| along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
| #include "defs.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "bfd.h"
|
| #include "symtab.h"
|
| #include "symfile.h"
|
| @@ -37,6 +37,9 @@
|
| #include "gdb_assert.h"
|
| #include "hashtab.h"
|
| #include "exceptions.h"
|
| +#include "cp-support.h"
|
| +#include "bcache.h"
|
| +#include "dwarf2loc.h"
|
|
|
| /* Initialize BADNESS constants. */
|
|
|
| @@ -54,11 +57,12 @@ const struct rank INTEGER_CONVERSION_BADNESS = {2,0};
|
| const struct rank FLOAT_CONVERSION_BADNESS = {2,0};
|
| const struct rank INT_FLOAT_CONVERSION_BADNESS = {2,0};
|
| const struct rank VOID_PTR_CONVERSION_BADNESS = {2,0};
|
| -const struct rank BOOL_PTR_CONVERSION_BADNESS = {3,0};
|
| +const struct rank BOOL_CONVERSION_BADNESS = {3,0};
|
| const struct rank BASE_CONVERSION_BADNESS = {2,0};
|
| const struct rank REFERENCE_CONVERSION_BADNESS = {2,0};
|
| const struct rank NULL_POINTER_CONVERSION_BADNESS = {2,0};
|
| const struct rank NS_POINTER_CONVERSION_BADNESS = {10,0};
|
| +const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS = {3,0};
|
|
|
| /* Floatformat pairs. */
|
| const struct floatformat *floatformats_ieee_half[BFD_ENDIAN_UNKNOWN] = {
|
| @@ -106,12 +110,25 @@ const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN] = {
|
| &floatformat_vax_d
|
| };
|
| const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN] = {
|
| - &floatformat_ibm_long_double,
|
| - &floatformat_ibm_long_double
|
| + &floatformat_ibm_long_double_big,
|
| + &floatformat_ibm_long_double_little
|
| };
|
|
|
| +/* Should opaque types be resolved? */
|
| +
|
| +static int opaque_type_resolution = 1;
|
| +
|
| +/* A flag to enable printing of debugging information of C++
|
| + overloading. */
|
| +
|
| +unsigned int overload_debug = 0;
|
| +
|
| +/* A flag to enable strict type checking. */
|
| +
|
| +static int strict_type_checking = 1;
|
| +
|
| +/* A function to show whether opaque types are resolved. */
|
|
|
| -int opaque_type_resolution = 1;
|
| static void
|
| show_opaque_type_resolution (struct ui_file *file, int from_tty,
|
| struct cmd_list_element *c,
|
| @@ -122,7 +139,8 @@ show_opaque_type_resolution (struct ui_file *file, int from_tty,
|
| value);
|
| }
|
|
|
| -int overload_debug = 0;
|
| +/* A function to show whether C++ overload debugging is enabled. */
|
| +
|
| static void
|
| show_overload_debug (struct ui_file *file, int from_tty,
|
| struct cmd_list_element *c, const char *value)
|
| @@ -131,18 +149,16 @@ show_overload_debug (struct ui_file *file, int from_tty,
|
| value);
|
| }
|
|
|
| -struct extra
|
| - {
|
| - char str[128];
|
| - int len;
|
| - }; /* Maximum extension is 128! FIXME */
|
| -
|
| -static void print_bit_vector (B_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);
|
| +/* A function to show the status of strict type checking. */
|
|
|
| +static void
|
| +show_strict_type_checking (struct ui_file *file, int from_tty,
|
| + struct cmd_list_element *c, const char *value)
|
| +{
|
| + fprintf_filtered (file, _("Strict type checking is %s.\n"), value);
|
| +}
|
|
|
| +
|
| /* Allocate a new OBJFILE-associated type structure and fill it
|
| with some defaults. Space for the type structure is allocated
|
| on the objfile's objfile_obstack. */
|
| @@ -225,6 +241,20 @@ get_type_arch (const struct type *type)
|
| return TYPE_OWNER (type).gdbarch;
|
| }
|
|
|
| +/* See gdbtypes.h. */
|
| +
|
| +struct type *
|
| +get_target_type (struct type *type)
|
| +{
|
| + if (type != NULL)
|
| + {
|
| + type = TYPE_TARGET_TYPE (type);
|
| + if (type != NULL)
|
| + type = check_typedef (type);
|
| + }
|
| +
|
| + 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
|
| @@ -252,6 +282,7 @@ alloc_type_instance (struct type *oldtype)
|
|
|
| /* Clear all remnants of the previous type at TYPE, in preparation for
|
| replacing it with something else. Preserve owner information. */
|
| +
|
| static void
|
| smash_type (struct type *type)
|
| {
|
| @@ -312,8 +343,7 @@ make_pointer_type (struct type *type, struct type **typeptr)
|
| TYPE_TARGET_TYPE (ntype) = type;
|
| TYPE_POINTER_TYPE (type) = ntype;
|
|
|
| - /* FIXME! Assume the machine has only one representation for
|
| - pointers! */
|
| + /* FIXME! Assumes the machine has only one representation for pointers! */
|
|
|
| TYPE_LENGTH (ntype)
|
| = gdbarch_ptr_bit (get_type_arch (type)) / TARGET_CHAR_BIT;
|
| @@ -324,9 +354,6 @@ make_pointer_type (struct type *type, struct type **typeptr)
|
| gdbarch_address_to_pointer. */
|
| TYPE_UNSIGNED (ntype) = 1;
|
|
|
| - if (!TYPE_POINTER_TYPE (type)) /* Remember it, if don't have one. */
|
| - TYPE_POINTER_TYPE (type) = ntype;
|
| -
|
| /* Update the length of all the other variants of this type. */
|
| chain = TYPE_CHAIN (ntype);
|
| while (chain != ntype)
|
| @@ -452,7 +479,6 @@ make_function_type (struct type *type, struct type **typeptr)
|
| return ntype;
|
| }
|
|
|
| -
|
| /* Given a type TYPE, return a type of functions that return that type.
|
| May need to construct such a type if this is the first use. */
|
|
|
| @@ -501,7 +527,8 @@ lookup_function_type_with_arguments (struct type *type,
|
|
|
| /* Identify address space identifier by name --
|
| return the integer flag defined in gdbtypes.h. */
|
| -extern int
|
| +
|
| +int
|
| address_space_name_to_int (struct gdbarch *gdbarch, char *space_identifier)
|
| {
|
| int type_flags;
|
| @@ -623,6 +650,7 @@ make_type_with_address_space (struct type *type, int space_flag)
|
| in the same objfile. Otherwise, allocate fresh memory for the new
|
| type whereever TYPE lives. If TYPEPTR is non-zero, set it to the
|
| new type we construct. */
|
| +
|
| struct type *
|
| make_cv_type (int cnst, int voltl,
|
| struct type *type,
|
| @@ -666,6 +694,17 @@ make_cv_type (int cnst, int voltl,
|
| return ntype;
|
| }
|
|
|
| +/* Make a 'restrict'-qualified version of TYPE. */
|
| +
|
| +struct type *
|
| +make_restrict_type (struct type *type)
|
| +{
|
| + return make_qualified_type (type,
|
| + (TYPE_INSTANCE_FLAGS (type)
|
| + | TYPE_INSTANCE_FLAG_RESTRICT),
|
| + NULL);
|
| +}
|
| +
|
| /* 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.
|
| @@ -675,6 +714,7 @@ make_cv_type (int cnst, int voltl,
|
| smashing is ugly, and needs to be replaced with something more
|
| 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)
|
| {
|
| @@ -953,7 +993,7 @@ create_array_type (struct type *result_type,
|
|
|
| struct type *
|
| lookup_array_range_type (struct type *element_type,
|
| - int low_bound, int high_bound)
|
| + LONGEST low_bound, LONGEST high_bound)
|
| {
|
| struct gdbarch *gdbarch = get_type_arch (element_type);
|
| struct type *index_type = builtin_type (gdbarch)->builtin_int;
|
| @@ -989,7 +1029,7 @@ create_string_type (struct type *result_type,
|
|
|
| struct type *
|
| lookup_string_range_type (struct type *string_char_type,
|
| - int low_bound, int high_bound)
|
| + LONGEST low_bound, LONGEST high_bound)
|
| {
|
| struct type *result_type;
|
|
|
| @@ -1164,7 +1204,8 @@ type_name_no_tag_or_error (struct type *type)
|
| name = type_name_no_tag (saved_type);
|
| objfile = TYPE_OBJFILE (saved_type);
|
| error (_("Invalid anonymous type %s [in module %s], GCC PR debug/47510 bug?"),
|
| - name ? name : "<anonymous>", objfile ? objfile->name : "<arch>");
|
| + name ? name : "<anonymous>",
|
| + objfile ? objfile_name (objfile) : "<arch>");
|
| }
|
|
|
| /* Lookup a typedef or primitive type named NAME, visible in lexical
|
| @@ -1223,7 +1264,7 @@ lookup_signed_typename (const struct language_defn *language,
|
| visible in lexical block BLOCK. */
|
|
|
| struct type *
|
| -lookup_struct (const char *name, struct block *block)
|
| +lookup_struct (const char *name, const struct block *block)
|
| {
|
| struct symbol *sym;
|
|
|
| @@ -1245,7 +1286,7 @@ lookup_struct (const char *name, struct block *block)
|
| visible in lexical block BLOCK. */
|
|
|
| struct type *
|
| -lookup_union (const char *name, struct block *block)
|
| +lookup_union (const char *name, const struct block *block)
|
| {
|
| struct symbol *sym;
|
| struct type *t;
|
| @@ -1265,12 +1306,11 @@ lookup_union (const char *name, struct block *block)
|
| name);
|
| }
|
|
|
| -
|
| /* Lookup an enum type named "enum NAME",
|
| visible in lexical block BLOCK. */
|
|
|
| struct type *
|
| -lookup_enum (const char *name, struct block *block)
|
| +lookup_enum (const char *name, const struct block *block)
|
| {
|
| struct symbol *sym;
|
|
|
| @@ -1292,7 +1332,7 @@ lookup_enum (const char *name, struct block *block)
|
|
|
| struct type *
|
| lookup_template_type (char *name, struct type *type,
|
| - struct block *block)
|
| + const struct block *block)
|
| {
|
| struct symbol *sym;
|
| char *nam = (char *)
|
| @@ -1330,7 +1370,7 @@ lookup_template_type (char *name, struct type *type,
|
| If NAME is the name of a baseclass type, return that type. */
|
|
|
| struct type *
|
| -lookup_struct_elt_type (struct type *type, char *name, int noerr)
|
| +lookup_struct_elt_type (struct type *type, const char *name, int noerr)
|
| {
|
| int i;
|
| char *typename;
|
| @@ -1743,8 +1783,8 @@ check_stub_method (struct type *type, int method_id, int signature_id)
|
| struct gdbarch *gdbarch = get_type_arch (type);
|
| struct fn_field *f;
|
| char *mangled_name = gdb_mangle_name (type, method_id, signature_id);
|
| - char *demangled_name = cplus_demangle (mangled_name,
|
| - DMGL_PARAMS | DMGL_ANSI);
|
| + char *demangled_name = gdb_demangle (mangled_name,
|
| + DMGL_PARAMS | DMGL_ANSI);
|
| char *argtypetext, *p;
|
| int depth = 0, argcount = 1;
|
| struct field *argtypes;
|
| @@ -1917,6 +1957,7 @@ const struct gnat_aux_type gnat_aux_default =
|
| /* Set the TYPE's type-specific kind to TYPE_SPECIFIC_GNAT_STUFF,
|
| and allocate the associated gnat-specific data. The gnat-specific
|
| data is also initialized to gnat_aux_default. */
|
| +
|
| void
|
| allocate_gnat_aux_type (struct type *type)
|
| {
|
| @@ -1926,17 +1967,15 @@ allocate_gnat_aux_type (struct type *type)
|
| *(TYPE_GNAT_SPECIFIC (type)) = gnat_aux_default;
|
| }
|
|
|
| -
|
| /* Helper function to initialize the standard scalar types.
|
|
|
| - If NAME is non-NULL, then we make a copy 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). */
|
| + If NAME is non-NULL, then it is used to initialize the type name.
|
| + Note that NAME is not copied; it is required to have a lifetime at
|
| + least as long as OBJFILE. */
|
|
|
| struct type *
|
| init_type (enum type_code code, int length, int flags,
|
| - char *name, struct objfile *objfile)
|
| + const char *name, struct objfile *objfile)
|
| {
|
| struct type *type;
|
|
|
| @@ -1970,9 +2009,7 @@ init_type (enum type_code code, int length, int flags,
|
| if (flags & TYPE_FLAG_GNU_IFUNC)
|
| TYPE_GNU_IFUNC (type) = 1;
|
|
|
| - if (name)
|
| - TYPE_NAME (type) = obsavestring (name, strlen (name),
|
| - &objfile->objfile_obstack);
|
| + TYPE_NAME (type) = name;
|
|
|
| /* C++ fancies. */
|
|
|
| @@ -1995,6 +2032,8 @@ init_type (enum type_code code, int length, int flags,
|
| }
|
| return type;
|
| }
|
| +
|
| +/* Queries on types. */
|
|
|
| int
|
| can_dereference (struct type *t)
|
| @@ -2036,7 +2075,6 @@ is_scalar_type (struct type *type)
|
| case TYPE_CODE_UNION:
|
| case TYPE_CODE_SET:
|
| case TYPE_CODE_STRING:
|
| - case TYPE_CODE_BITSTRING:
|
| return 0;
|
| default:
|
| return 1;
|
| @@ -2229,6 +2267,7 @@ is_unique_ancestor (struct type *base, struct value *val)
|
| }
|
|
|
|
|
| +/* Overload resolution. */
|
|
|
| /* Return the sum of the rank of A with the rank of B. */
|
|
|
| @@ -2394,7 +2433,7 @@ integer_types_same_name_p (const char *first, const char *second)
|
| /* Compares type A to type B returns 1 if the represent the same type
|
| 0 otherwise. */
|
|
|
| -static int
|
| +int
|
| types_equal (struct type *a, struct type *b)
|
| {
|
| /* Identical type pointers. */
|
| @@ -2436,9 +2475,238 @@ types_equal (struct type *a, struct type *b)
|
| if (a == b)
|
| return 1;
|
|
|
| + /* Two function types are equal if their argument and return types
|
| + are equal. */
|
| + if (TYPE_CODE (a) == TYPE_CODE_FUNC)
|
| + {
|
| + int i;
|
| +
|
| + if (TYPE_NFIELDS (a) != TYPE_NFIELDS (b))
|
| + return 0;
|
| +
|
| + if (!types_equal (TYPE_TARGET_TYPE (a), TYPE_TARGET_TYPE (b)))
|
| + return 0;
|
| +
|
| + for (i = 0; i < TYPE_NFIELDS (a); ++i)
|
| + if (!types_equal (TYPE_FIELD_TYPE (a, i), TYPE_FIELD_TYPE (b, i)))
|
| + return 0;
|
| +
|
| + return 1;
|
| + }
|
| +
|
| return 0;
|
| }
|
| +
|
| +/* Deep comparison of types. */
|
| +
|
| +/* An entry in the type-equality bcache. */
|
| +
|
| +typedef struct type_equality_entry
|
| +{
|
| + struct type *type1, *type2;
|
| +} type_equality_entry_d;
|
| +
|
| +DEF_VEC_O (type_equality_entry_d);
|
| +
|
| +/* A helper function to compare two strings. Returns 1 if they are
|
| + the same, 0 otherwise. Handles NULLs properly. */
|
| +
|
| +static int
|
| +compare_maybe_null_strings (const char *s, const char *t)
|
| +{
|
| + if (s == NULL && t != NULL)
|
| + return 0;
|
| + else if (s != NULL && t == NULL)
|
| + return 0;
|
| + else if (s == NULL && t== NULL)
|
| + return 1;
|
| + return strcmp (s, t) == 0;
|
| +}
|
| +
|
| +/* A helper function for check_types_worklist that checks two types for
|
| + "deep" equality. Returns non-zero if the types are considered the
|
| + same, zero otherwise. */
|
| +
|
| +static int
|
| +check_types_equal (struct type *type1, struct type *type2,
|
| + VEC (type_equality_entry_d) **worklist)
|
| +{
|
| + CHECK_TYPEDEF (type1);
|
| + CHECK_TYPEDEF (type2);
|
| +
|
| + if (type1 == type2)
|
| + return 1;
|
| +
|
| + if (TYPE_CODE (type1) != TYPE_CODE (type2)
|
| + || TYPE_LENGTH (type1) != TYPE_LENGTH (type2)
|
| + || TYPE_UNSIGNED (type1) != TYPE_UNSIGNED (type2)
|
| + || TYPE_NOSIGN (type1) != TYPE_NOSIGN (type2)
|
| + || TYPE_VARARGS (type1) != TYPE_VARARGS (type2)
|
| + || TYPE_VECTOR (type1) != TYPE_VECTOR (type2)
|
| + || TYPE_NOTTEXT (type1) != TYPE_NOTTEXT (type2)
|
| + || TYPE_INSTANCE_FLAGS (type1) != TYPE_INSTANCE_FLAGS (type2)
|
| + || TYPE_NFIELDS (type1) != TYPE_NFIELDS (type2))
|
| + return 0;
|
| +
|
| + if (!compare_maybe_null_strings (TYPE_TAG_NAME (type1),
|
| + TYPE_TAG_NAME (type2)))
|
| + return 0;
|
| + if (!compare_maybe_null_strings (TYPE_NAME (type1), TYPE_NAME (type2)))
|
| + return 0;
|
| +
|
| + if (TYPE_CODE (type1) == TYPE_CODE_RANGE)
|
| + {
|
| + if (memcmp (TYPE_RANGE_DATA (type1), TYPE_RANGE_DATA (type2),
|
| + sizeof (*TYPE_RANGE_DATA (type1))) != 0)
|
| + return 0;
|
| + }
|
| + else
|
| + {
|
| + int i;
|
| +
|
| + for (i = 0; i < TYPE_NFIELDS (type1); ++i)
|
| + {
|
| + const struct field *field1 = &TYPE_FIELD (type1, i);
|
| + const struct field *field2 = &TYPE_FIELD (type2, i);
|
| + struct type_equality_entry entry;
|
| +
|
| + if (FIELD_ARTIFICIAL (*field1) != FIELD_ARTIFICIAL (*field2)
|
| + || FIELD_BITSIZE (*field1) != FIELD_BITSIZE (*field2)
|
| + || FIELD_LOC_KIND (*field1) != FIELD_LOC_KIND (*field2))
|
| + return 0;
|
| + if (!compare_maybe_null_strings (FIELD_NAME (*field1),
|
| + FIELD_NAME (*field2)))
|
| + return 0;
|
| + switch (FIELD_LOC_KIND (*field1))
|
| + {
|
| + case FIELD_LOC_KIND_BITPOS:
|
| + if (FIELD_BITPOS (*field1) != FIELD_BITPOS (*field2))
|
| + return 0;
|
| + break;
|
| + case FIELD_LOC_KIND_ENUMVAL:
|
| + if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2))
|
| + return 0;
|
| + break;
|
| + case FIELD_LOC_KIND_PHYSADDR:
|
| + if (FIELD_STATIC_PHYSADDR (*field1)
|
| + != FIELD_STATIC_PHYSADDR (*field2))
|
| + return 0;
|
| + break;
|
| + case FIELD_LOC_KIND_PHYSNAME:
|
| + if (!compare_maybe_null_strings (FIELD_STATIC_PHYSNAME (*field1),
|
| + FIELD_STATIC_PHYSNAME (*field2)))
|
| + return 0;
|
| + break;
|
| + case FIELD_LOC_KIND_DWARF_BLOCK:
|
| + {
|
| + struct dwarf2_locexpr_baton *block1, *block2;
|
| +
|
| + block1 = FIELD_DWARF_BLOCK (*field1);
|
| + block2 = FIELD_DWARF_BLOCK (*field2);
|
| + if (block1->per_cu != block2->per_cu
|
| + || block1->size != block2->size
|
| + || memcmp (block1->data, block2->data, block1->size) != 0)
|
| + return 0;
|
| + }
|
| + break;
|
| + default:
|
| + internal_error (__FILE__, __LINE__, _("Unsupported field kind "
|
| + "%d by check_types_equal"),
|
| + FIELD_LOC_KIND (*field1));
|
| + }
|
| +
|
| + entry.type1 = FIELD_TYPE (*field1);
|
| + entry.type2 = FIELD_TYPE (*field2);
|
| + VEC_safe_push (type_equality_entry_d, *worklist, &entry);
|
| + }
|
| + }
|
| +
|
| + if (TYPE_TARGET_TYPE (type1) != NULL)
|
| + {
|
| + struct type_equality_entry entry;
|
| +
|
| + if (TYPE_TARGET_TYPE (type2) == NULL)
|
| + return 0;
|
| +
|
| + entry.type1 = TYPE_TARGET_TYPE (type1);
|
| + entry.type2 = TYPE_TARGET_TYPE (type2);
|
| + VEC_safe_push (type_equality_entry_d, *worklist, &entry);
|
| + }
|
| + else if (TYPE_TARGET_TYPE (type2) != NULL)
|
| + return 0;
|
| +
|
| + return 1;
|
| +}
|
| +
|
| +/* Check types on a worklist for equality. Returns zero if any pair
|
| + is not equal, non-zero if they are all considered equal. */
|
| +
|
| +static int
|
| +check_types_worklist (VEC (type_equality_entry_d) **worklist,
|
| + struct bcache *cache)
|
| +{
|
| + while (!VEC_empty (type_equality_entry_d, *worklist))
|
| + {
|
| + struct type_equality_entry entry;
|
| + int added;
|
| +
|
| + entry = *VEC_last (type_equality_entry_d, *worklist);
|
| + VEC_pop (type_equality_entry_d, *worklist);
|
| +
|
| + /* If the type pair has already been visited, we know it is
|
| + ok. */
|
| + bcache_full (&entry, sizeof (entry), cache, &added);
|
| + if (!added)
|
| + continue;
|
| +
|
| + if (check_types_equal (entry.type1, entry.type2, worklist) == 0)
|
| + return 0;
|
| + }
|
| +
|
| + return 1;
|
| +}
|
| +
|
| +/* Return non-zero if types TYPE1 and TYPE2 are equal, as determined by a
|
| + "deep comparison". Otherwise return zero. */
|
| +
|
| +int
|
| +types_deeply_equal (struct type *type1, struct type *type2)
|
| +{
|
| + volatile struct gdb_exception except;
|
| + int result = 0;
|
| + struct bcache *cache;
|
| + VEC (type_equality_entry_d) *worklist = NULL;
|
| + struct type_equality_entry entry;
|
| +
|
| + gdb_assert (type1 != NULL && type2 != NULL);
|
| +
|
| + /* Early exit for the simple case. */
|
| + if (type1 == type2)
|
| + return 1;
|
|
|
| + cache = bcache_xmalloc (NULL, NULL);
|
| +
|
| + entry.type1 = type1;
|
| + entry.type2 = type2;
|
| + VEC_safe_push (type_equality_entry_d, worklist, &entry);
|
| +
|
| + TRY_CATCH (except, RETURN_MASK_ALL)
|
| + {
|
| + result = check_types_worklist (&worklist, cache);
|
| + }
|
| + /* check_types_worklist calls several nested helper functions,
|
| + some of which can raise a GDB Exception, so we just check
|
| + and rethrow here. If there is a GDB exception, a comparison
|
| + is not capable (or trusted), so exit. */
|
| + bcache_xfree (cache);
|
| + VEC_free (type_equality_entry_d, worklist);
|
| + /* Rethrow if there was a problem. */
|
| + if (except.reason < 0)
|
| + throw_exception (except);
|
| +
|
| + return result;
|
| +}
|
| +
|
| /* 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
|
| @@ -2509,12 +2777,20 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
|
| case TYPE_CODE_FUNC:
|
| return rank_one_type (TYPE_TARGET_TYPE (parm), arg, NULL);
|
| case TYPE_CODE_INT:
|
| - if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT
|
| - && value_as_long (value) == 0)
|
| + if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT)
|
| {
|
| - /* Null pointer conversion: allow it to be cast to a pointer.
|
| - [4.10.1 of C++ standard draft n3290] */
|
| - return NULL_POINTER_CONVERSION_BADNESS;
|
| + if (value_as_long (value) == 0)
|
| + {
|
| + /* Null pointer conversion: allow it to be cast to a pointer.
|
| + [4.10.1 of C++ standard draft n3290] */
|
| + return NULL_POINTER_CONVERSION_BADNESS;
|
| + }
|
| + else
|
| + {
|
| + /* If type checking is disabled, allow the conversion. */
|
| + if (!strict_type_checking)
|
| + return NS_INTEGER_POINTER_CONVERSION_BADNESS;
|
| + }
|
| }
|
| /* fall through */
|
| case TYPE_CODE_ENUM:
|
| @@ -2698,14 +2974,23 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
|
| case TYPE_CODE_BOOL:
|
| switch (TYPE_CODE (arg))
|
| {
|
| + /* n3290 draft, section 4.12.1 (conv.bool):
|
| +
|
| + "A prvalue of arithmetic, unscoped enumeration, pointer, or
|
| + pointer to member type can be converted to a prvalue of type
|
| + bool. A zero value, null pointer value, or null member pointer
|
| + value is converted to false; any other value is converted to
|
| + true. A prvalue of type std::nullptr_t can be converted to a
|
| + prvalue of type bool; the resulting value is false." */
|
| case TYPE_CODE_INT:
|
| case TYPE_CODE_CHAR:
|
| - case TYPE_CODE_RANGE:
|
| case TYPE_CODE_ENUM:
|
| case TYPE_CODE_FLT:
|
| - return INCOMPATIBLE_TYPE_BADNESS;
|
| + case TYPE_CODE_MEMBERPTR:
|
| case TYPE_CODE_PTR:
|
| - return BOOL_PTR_CONVERSION_BADNESS;
|
| + return BOOL_CONVERSION_BADNESS;
|
| + case TYPE_CODE_RANGE:
|
| + return INCOMPATIBLE_TYPE_BADNESS;
|
| case TYPE_CODE_BOOL:
|
| return EXACT_MATCH_BADNESS;
|
| default:
|
| @@ -2806,8 +3091,9 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
|
| } /* switch (TYPE_CODE (arg)) */
|
| }
|
|
|
| -
|
| /* End of functions for overload resolution. */
|
| +
|
| +/* Routines to pretty-print types. */
|
|
|
| static void
|
| print_bit_vector (B_TYPE *bits, int nbits)
|
| @@ -3075,9 +3361,6 @@ recursive_dump_type (struct type *type, int spaces)
|
| case TYPE_CODE_STRING:
|
| printf_filtered ("(TYPE_CODE_STRING)");
|
| break;
|
| - case TYPE_CODE_BITSTRING:
|
| - printf_filtered ("(TYPE_CODE_BITSTRING)");
|
| - break;
|
| case TYPE_CODE_ERROR:
|
| printf_filtered ("(TYPE_CODE_ERROR)");
|
| break;
|
| @@ -3167,6 +3450,10 @@ recursive_dump_type (struct type *type, int spaces)
|
| {
|
| puts_filtered (" TYPE_FLAG_ADDRESS_CLASS_2");
|
| }
|
| + if (TYPE_RESTRICT (type))
|
| + {
|
| + puts_filtered (" TYPE_FLAG_RESTRICT");
|
| + }
|
| puts_filtered ("\n");
|
|
|
| printfi_filtered (spaces, "flags");
|
| @@ -3319,7 +3606,7 @@ recursive_dump_type (struct type *type, int spaces)
|
| if (spaces == 0)
|
| obstack_free (&dont_print_type_obstack, NULL);
|
| }
|
| -
|
| +
|
| /* Trivial helpers for the libiberty hash table, for mapping one
|
| type to another. */
|
|
|
| @@ -3508,12 +3795,12 @@ copy_type (const struct type *type)
|
|
|
| return new_type;
|
| }
|
| -
|
| -
|
| +
|
| /* Helper functions to initialize architecture-specific types. */
|
|
|
| /* Allocate a type structure associated with GDBARCH and set its
|
| CODE, LENGTH, and NAME fields. */
|
| +
|
| struct type *
|
| arch_type (struct gdbarch *gdbarch,
|
| enum type_code code, int length, char *name)
|
| @@ -3533,6 +3820,7 @@ arch_type (struct gdbarch *gdbarch,
|
| /* Allocate a TYPE_CODE_INT type structure associated with GDBARCH.
|
| BIT is the type size in bits. If UNSIGNED_P is non-zero, set
|
| the type's TYPE_UNSIGNED flag. NAME is the type name. */
|
| +
|
| struct type *
|
| arch_integer_type (struct gdbarch *gdbarch,
|
| int bit, int unsigned_p, char *name)
|
| @@ -3551,6 +3839,7 @@ arch_integer_type (struct gdbarch *gdbarch,
|
| /* Allocate a TYPE_CODE_CHAR type structure associated with GDBARCH.
|
| BIT is the type size in bits. If UNSIGNED_P is non-zero, set
|
| the type's TYPE_UNSIGNED flag. NAME is the type name. */
|
| +
|
| struct type *
|
| arch_character_type (struct gdbarch *gdbarch,
|
| int bit, int unsigned_p, char *name)
|
| @@ -3567,6 +3856,7 @@ arch_character_type (struct gdbarch *gdbarch,
|
| /* Allocate a TYPE_CODE_BOOL type structure associated with GDBARCH.
|
| BIT is the type size in bits. If UNSIGNED_P is non-zero, set
|
| the type's TYPE_UNSIGNED flag. NAME is the type name. */
|
| +
|
| struct type *
|
| arch_boolean_type (struct gdbarch *gdbarch,
|
| int bit, int unsigned_p, char *name)
|
| @@ -3584,6 +3874,7 @@ arch_boolean_type (struct gdbarch *gdbarch,
|
| BIT is the type size in bits; if BIT equals -1, the size is
|
| determined by the floatformat. NAME is the type name. Set the
|
| TYPE_FLOATFORMAT from FLOATFORMATS. */
|
| +
|
| struct type *
|
| arch_float_type (struct gdbarch *gdbarch,
|
| int bit, char *name, const struct floatformat **floatformats)
|
| @@ -3605,6 +3896,7 @@ arch_float_type (struct gdbarch *gdbarch,
|
|
|
| /* Allocate a TYPE_CODE_COMPLEX type structure associated with GDBARCH.
|
| NAME is the type name. TARGET_TYPE is the component float type. */
|
| +
|
| struct type *
|
| arch_complex_type (struct gdbarch *gdbarch,
|
| char *name, struct type *target_type)
|
| @@ -3619,6 +3911,7 @@ arch_complex_type (struct gdbarch *gdbarch,
|
|
|
| /* Allocate a TYPE_CODE_FLAGS type structure associated with GDBARCH.
|
| NAME is the type name. LENGTH is the size of the flag word in bytes. */
|
| +
|
| struct type *
|
| arch_flags_type (struct gdbarch *gdbarch, char *name, int length)
|
| {
|
| @@ -3635,6 +3928,7 @@ arch_flags_type (struct gdbarch *gdbarch, char *name, int length)
|
|
|
| /* Add field to TYPE_CODE_FLAGS type TYPE to indicate the bit at
|
| position BITPOS is called NAME. */
|
| +
|
| void
|
| append_flags_type_flag (struct type *type, int bitpos, char *name)
|
| {
|
| @@ -3656,6 +3950,7 @@ append_flags_type_flag (struct type *type, int bitpos, char *name)
|
|
|
| /* Allocate a TYPE_CODE_STRUCT or TYPE_CODE_UNION type structure (as
|
| specified by CODE) associated with GDBARCH. NAME is the type name. */
|
| +
|
| struct type *
|
| arch_composite_type (struct gdbarch *gdbarch, char *name, enum type_code code)
|
| {
|
| @@ -3671,6 +3966,7 @@ arch_composite_type (struct gdbarch *gdbarch, char *name, enum type_code code)
|
| /* Add new field with name NAME and type FIELD to composite type T.
|
| Do not set the field's position or adjust the type's length;
|
| the caller should do so. Return the new field. */
|
| +
|
| struct field *
|
| append_composite_type_field_raw (struct type *t, char *name,
|
| struct type *field)
|
| @@ -3689,6 +3985,7 @@ append_composite_type_field_raw (struct type *t, char *name,
|
|
|
| /* Add new field with name NAME and type FIELD to composite type T.
|
| ALIGNMENT (if non-zero) specifies the minimum field alignment. */
|
| +
|
| void
|
| append_composite_type_field_aligned (struct type *t, char *name,
|
| struct type *field, int alignment)
|
| @@ -3728,6 +4025,7 @@ append_composite_type_field_aligned (struct type *t, char *name,
|
| }
|
|
|
| /* Add new field with name NAME and type FIELD to composite type T. */
|
| +
|
| void
|
| append_composite_type_field (struct type *t, char *name,
|
| struct type *field)
|
| @@ -3735,7 +4033,6 @@ append_composite_type_field (struct type *t, char *name,
|
| append_composite_type_field_aligned (t, name, field, 0);
|
| }
|
|
|
| -
|
| static struct gdbarch_data *gdbtypes_data;
|
|
|
| const struct builtin_type *
|
| @@ -3872,7 +4169,6 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
|
| return builtin_type;
|
| }
|
|
|
| -
|
| /* This set of objfile-based types is intended to be used by symbol
|
| readers as basic types. */
|
|
|
| @@ -4001,9 +4297,7 @@ objfile_type (struct objfile *objfile)
|
| "<thread local variable, no debug info>", objfile);
|
|
|
| /* NOTE: on some targets, addresses and pointers are not necessarily
|
| - the same --- for example, on the D10V, pointers are 16 bits long,
|
| - but addresses are 32 bits long. See doc/gdbint.texinfo,
|
| - ``Pointers Are Not Always Addresses''.
|
| + the same.
|
|
|
| The upshot is:
|
| - gdb's `struct type' always describes the target's
|
| @@ -4016,12 +4310,6 @@ objfile_type (struct objfile *objfile)
|
| can access any memory on the target, even if the processor has
|
| separate code and data address spaces.
|
|
|
| - So, for example:
|
| - - If v is a value holding a D10V code pointer, its contents are
|
| - in target form: a big-endian address left-shifted two bits.
|
| - - If p is a D10V pointer type, TYPE_LENGTH (p) == 2, just as
|
| - sizeof (void *) == 2 on the target.
|
| -
|
| In this context, objfile_type->builtin_core_addr is a bit odd:
|
| it's a target type for a value the target will never see. It's
|
| only used to hold the values of (typeless) linker symbols, which
|
| @@ -4036,22 +4324,22 @@ objfile_type (struct objfile *objfile)
|
| return objfile_type;
|
| }
|
|
|
| +extern initialize_file_ftype _initialize_gdbtypes;
|
|
|
| -extern void _initialize_gdbtypes (void);
|
| void
|
| _initialize_gdbtypes (void)
|
| {
|
| gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
|
| objfile_type_data = register_objfile_data ();
|
|
|
| - add_setshow_zinteger_cmd ("overload", no_class, &overload_debug,
|
| - _("Set debugging of C++ overloading."),
|
| - _("Show debugging of C++ overloading."),
|
| - _("When enabled, ranking of the "
|
| - "functions is displayed."),
|
| - NULL,
|
| - show_overload_debug,
|
| - &setdebuglist, &showdebuglist);
|
| + add_setshow_zuinteger_cmd ("overload", no_class, &overload_debug,
|
| + _("Set debugging of C++ overloading."),
|
| + _("Show debugging of C++ overloading."),
|
| + _("When enabled, ranking of the "
|
| + "functions is displayed."),
|
| + NULL,
|
| + show_overload_debug,
|
| + &setdebuglist, &showdebuglist);
|
|
|
| /* Add user knob for controlling resolution of opaque types. */
|
| add_setshow_boolean_cmd ("opaque-type-resolution", class_support,
|
| @@ -4063,4 +4351,13 @@ _initialize_gdbtypes (void)
|
| NULL, NULL,
|
| show_opaque_type_resolution,
|
| &setlist, &showlist);
|
| +
|
| + /* Add an option to permit non-strict type checking. */
|
| + add_setshow_boolean_cmd ("type", class_support,
|
| + &strict_type_checking,
|
| + _("Set strict type checking."),
|
| + _("Show strict type checking."),
|
| + NULL, NULL,
|
| + show_strict_type_checking,
|
| + &setchecklist, &showchecklist);
|
| }
|
|
|