gdb/gdbtypes.c - gdb
Global variables defined
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "bfd.h"
- #include "symtab.h"
- #include "symfile.h"
- #include "objfiles.h"
- #include "gdbtypes.h"
- #include "expression.h"
- #include "language.h"
- #include "target.h"
- #include "value.h"
- #include "demangle.h"
- #include "complaints.h"
- #include "gdbcmd.h"
- #include "cp-abi.h"
- #include "hashtab.h"
- #include "cp-support.h"
- #include "bcache.h"
- #include "dwarf2loc.h"
- #include "gdbcore.h"
- const struct rank LENGTH_MISMATCH_BADNESS = {100,0};
- const struct rank TOO_FEW_PARAMS_BADNESS = {100,0};
- const struct rank INCOMPATIBLE_TYPE_BADNESS = {100,0};
- const struct rank EXACT_MATCH_BADNESS = {0,0};
- const struct rank INTEGER_PROMOTION_BADNESS = {1,0};
- const struct rank FLOAT_PROMOTION_BADNESS = {1,0};
- const struct rank BASE_PTR_CONVERSION_BADNESS = {1,0};
- 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_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};
- const struct floatformat *floatformats_ieee_half[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ieee_half_big,
- &floatformat_ieee_half_little
- };
- const struct floatformat *floatformats_ieee_single[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ieee_single_big,
- &floatformat_ieee_single_little
- };
- const struct floatformat *floatformats_ieee_double[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ieee_double_big,
- &floatformat_ieee_double_little
- };
- const struct floatformat *floatformats_ieee_double_littlebyte_bigword[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ieee_double_big,
- &floatformat_ieee_double_littlebyte_bigword
- };
- const struct floatformat *floatformats_i387_ext[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_i387_ext,
- &floatformat_i387_ext
- };
- const struct floatformat *floatformats_m68881_ext[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_m68881_ext,
- &floatformat_m68881_ext
- };
- const struct floatformat *floatformats_arm_ext[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_arm_ext_big,
- &floatformat_arm_ext_littlebyte_bigword
- };
- const struct floatformat *floatformats_ia64_spill[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ia64_spill_big,
- &floatformat_ia64_spill_little
- };
- const struct floatformat *floatformats_ia64_quad[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ia64_quad_big,
- &floatformat_ia64_quad_little
- };
- const struct floatformat *floatformats_vax_f[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_vax_f,
- &floatformat_vax_f
- };
- const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_vax_d,
- &floatformat_vax_d
- };
- const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN] = {
- &floatformat_ibm_long_double_big,
- &floatformat_ibm_long_double_little
- };
- static int opaque_type_resolution = 1;
- unsigned int overload_debug = 0;
- static int strict_type_checking = 1;
- static void
- show_opaque_type_resolution (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- fprintf_filtered (file, _("Resolution of opaque struct/class/union types "
- "(if set before loading symbols) is %s.\n"),
- value);
- }
- static void
- show_overload_debug (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("Debugging of C++ overloading is %s.\n"),
- value);
- }
- 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);
- }
- struct type *
- alloc_type (struct objfile *objfile)
- {
- struct type *type;
- gdb_assert (objfile != NULL);
-
- type = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct type);
- TYPE_MAIN_TYPE (type) = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct main_type);
- OBJSTAT (objfile, n_types++);
- TYPE_OBJFILE_OWNED (type) = 1;
- TYPE_OWNER (type).objfile = objfile;
-
- TYPE_CODE (type) = TYPE_CODE_UNDEF;
- TYPE_VPTR_FIELDNO (type) = -1;
- TYPE_CHAIN (type) = type;
- return type;
- }
- struct type *
- alloc_type_arch (struct gdbarch *gdbarch)
- {
- struct type *type;
- gdb_assert (gdbarch != NULL);
-
- type = XCNEW (struct type);
- TYPE_MAIN_TYPE (type) = XCNEW (struct main_type);
- TYPE_OBJFILE_OWNED (type) = 0;
- TYPE_OWNER (type).gdbarch = gdbarch;
-
- TYPE_CODE (type) = TYPE_CODE_UNDEF;
- TYPE_VPTR_FIELDNO (type) = -1;
- TYPE_CHAIN (type) = type;
- return type;
- }
- struct type *
- alloc_type_copy (const struct type *type)
- {
- if (TYPE_OBJFILE_OWNED (type))
- return alloc_type (TYPE_OWNER (type).objfile);
- else
- return alloc_type_arch (TYPE_OWNER (type).gdbarch);
- }
- struct gdbarch *
- get_type_arch (const struct type *type)
- {
- if (TYPE_OBJFILE_OWNED (type))
- return get_objfile_arch (TYPE_OWNER (type).objfile);
- else
- return TYPE_OWNER (type).gdbarch;
- }
- 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;
- }
- static struct type *
- alloc_type_instance (struct type *oldtype)
- {
- struct type *type;
-
- if (! TYPE_OBJFILE_OWNED (oldtype))
- type = XCNEW (struct type);
- else
- type = OBSTACK_ZALLOC (&TYPE_OBJFILE (oldtype)->objfile_obstack,
- struct type);
- TYPE_MAIN_TYPE (type) = TYPE_MAIN_TYPE (oldtype);
- TYPE_CHAIN (type) = type;
- return type;
- }
- static void
- smash_type (struct type *type)
- {
- int objfile_owned = TYPE_OBJFILE_OWNED (type);
- union type_owner owner = TYPE_OWNER (type);
- memset (TYPE_MAIN_TYPE (type), 0, sizeof (struct main_type));
-
- TYPE_OBJFILE_OWNED (type) = objfile_owned;
- TYPE_OWNER (type) = owner;
-
- TYPE_CHAIN (type) = type;
-
- }
- struct type *
- make_pointer_type (struct type *type, struct type **typeptr)
- {
- struct type *ntype;
- struct type *chain;
- ntype = TYPE_POINTER_TYPE (type);
- if (ntype)
- {
- if (typeptr == 0)
- return ntype;
- else if (*typeptr == 0)
- {
- *typeptr = ntype;
- return ntype;
- }
- }
- if (typeptr == 0 || *typeptr == 0)
- {
- ntype = alloc_type_copy (type);
- if (typeptr)
- *typeptr = ntype;
- }
- else
- {
- ntype = *typeptr;
- chain = TYPE_CHAIN (ntype);
- smash_type (ntype);
- TYPE_CHAIN (ntype) = chain;
- }
- TYPE_TARGET_TYPE (ntype) = type;
- TYPE_POINTER_TYPE (type) = ntype;
- FIXME
- TYPE_LENGTH (ntype)
- = gdbarch_ptr_bit (get_type_arch (type)) / TARGET_CHAR_BIT;
- TYPE_CODE (ntype) = TYPE_CODE_PTR;
-
- TYPE_UNSIGNED (ntype) = 1;
-
- chain = TYPE_CHAIN (ntype);
- while (chain != ntype)
- {
- TYPE_LENGTH (chain) = TYPE_LENGTH (ntype);
- chain = TYPE_CHAIN (chain);
- }
- return ntype;
- }
- struct type *
- lookup_pointer_type (struct type *type)
- {
- return make_pointer_type (type, (struct type **) 0);
- }
- struct type *
- make_reference_type (struct type *type, struct type **typeptr)
- {
- struct type *ntype;
- struct type *chain;
- ntype = TYPE_REFERENCE_TYPE (type);
- if (ntype)
- {
- if (typeptr == 0)
- return ntype;
- else if (*typeptr == 0)
- {
- *typeptr = ntype;
- return ntype;
- }
- }
- if (typeptr == 0 || *typeptr == 0)
- {
- ntype = alloc_type_copy (type);
- if (typeptr)
- *typeptr = ntype;
- }
- else
- {
- ntype = *typeptr;
- chain = TYPE_CHAIN (ntype);
- smash_type (ntype);
- TYPE_CHAIN (ntype) = chain;
- }
- TYPE_TARGET_TYPE (ntype) = type;
- TYPE_REFERENCE_TYPE (type) = ntype;
- FIXME
- TYPE_LENGTH (ntype) =
- gdbarch_ptr_bit (get_type_arch (type)) / TARGET_CHAR_BIT;
- TYPE_CODE (ntype) = TYPE_CODE_REF;
- if (!TYPE_REFERENCE_TYPE (type))
- TYPE_REFERENCE_TYPE (type) = ntype;
-
- chain = TYPE_CHAIN (ntype);
- while (chain != ntype)
- {
- TYPE_LENGTH (chain) = TYPE_LENGTH (ntype);
- chain = TYPE_CHAIN (chain);
- }
- return ntype;
- }
- struct type *
- lookup_reference_type (struct type *type)
- {
- return make_reference_type (type, (struct type **) 0);
- }
- struct type *
- make_function_type (struct type *type, struct type **typeptr)
- {
- struct type *ntype;
- if (typeptr == 0 || *typeptr == 0)
- {
- ntype = alloc_type_copy (type);
- if (typeptr)
- *typeptr = ntype;
- }
- else
- {
- ntype = *typeptr;
- smash_type (ntype);
- }
- TYPE_TARGET_TYPE (ntype) = type;
- TYPE_LENGTH (ntype) = 1;
- TYPE_CODE (ntype) = TYPE_CODE_FUNC;
- INIT_FUNC_SPECIFIC (ntype);
- return ntype;
- }
- struct type *
- lookup_function_type (struct type *type)
- {
- return make_function_type (type, (struct type **) 0);
- }
- struct type *
- lookup_function_type_with_arguments (struct type *type,
- int nparams,
- struct type **param_types)
- {
- struct type *fn = make_function_type (type, (struct type **) 0);
- int i;
- if (nparams > 0)
- {
- if (param_types[nparams - 1] == NULL)
- {
- --nparams;
- TYPE_VARARGS (fn) = 1;
- }
- else if (TYPE_CODE (check_typedef (param_types[nparams - 1]))
- == TYPE_CODE_VOID)
- {
- --nparams;
-
- gdb_assert (nparams == 0);
- TYPE_PROTOTYPED (fn) = 1;
- }
- }
- TYPE_NFIELDS (fn) = nparams;
- TYPE_FIELDS (fn) = TYPE_ZALLOC (fn, nparams * sizeof (struct field));
- for (i = 0; i < nparams; ++i)
- TYPE_FIELD_TYPE (fn, i) = param_types[i];
- return fn;
- }
- int
- address_space_name_to_int (struct gdbarch *gdbarch, char *space_identifier)
- {
- int type_flags;
-
- if (!strcmp (space_identifier, "code"))
- return TYPE_INSTANCE_FLAG_CODE_SPACE;
- else if (!strcmp (space_identifier, "data"))
- return TYPE_INSTANCE_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);
- }
- const char *
- address_space_int_to_name (struct gdbarch *gdbarch, int space_flag)
- {
- if (space_flag & TYPE_INSTANCE_FLAG_CODE_SPACE)
- return "code";
- else if (space_flag & TYPE_INSTANCE_FLAG_DATA_SPACE)
- return "data";
- else if ((space_flag & TYPE_INSTANCE_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;
- }
- static struct type *
- make_qualified_type (struct type *type, int new_flags,
- struct type *storage)
- {
- struct type *ntype;
- ntype = type;
- do
- {
- if (TYPE_INSTANCE_FLAGS (ntype) == new_flags)
- return ntype;
- ntype = TYPE_CHAIN (ntype);
- }
- while (ntype != type);
-
- if (storage == NULL)
- ntype = alloc_type_instance (type);
- else
- {
-
- gdb_assert (TYPE_OBJFILE (type) == TYPE_OBJFILE (storage));
- ntype = storage;
- TYPE_MAIN_TYPE (ntype) = TYPE_MAIN_TYPE (type);
- TYPE_CHAIN (ntype) = ntype;
- }
-
- TYPE_POINTER_TYPE (ntype) = (struct type *) 0;
- TYPE_REFERENCE_TYPE (ntype) = (struct type *) 0;
-
- TYPE_CHAIN (ntype) = TYPE_CHAIN (type);
- TYPE_CHAIN (type) = ntype;
-
- TYPE_INSTANCE_FLAGS (ntype) = new_flags;
-
- TYPE_LENGTH (ntype) = TYPE_LENGTH (type);
- return ntype;
- }
- struct type *
- make_type_with_address_space (struct type *type, int space_flag)
- {
- int new_flags = ((TYPE_INSTANCE_FLAGS (type)
- & ~(TYPE_INSTANCE_FLAG_CODE_SPACE
- | TYPE_INSTANCE_FLAG_DATA_SPACE
- | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL))
- | space_flag);
- return make_qualified_type (type, new_flags, NULL);
- }
- struct type *
- make_cv_type (int cnst, int voltl,
- struct type *type,
- struct type **typeptr)
- {
- struct type *ntype;
- int new_flags = (TYPE_INSTANCE_FLAGS (type)
- & ~(TYPE_INSTANCE_FLAG_CONST
- | TYPE_INSTANCE_FLAG_VOLATILE));
- if (cnst)
- new_flags |= TYPE_INSTANCE_FLAG_CONST;
- if (voltl)
- new_flags |= TYPE_INSTANCE_FLAG_VOLATILE;
- if (typeptr && *typeptr != NULL)
- {
-
- gdb_assert (TYPE_OBJFILE (*typeptr) == TYPE_OBJFILE (type));
- }
- ntype = make_qualified_type (type, new_flags,
- typeptr ? *typeptr : NULL);
- if (typeptr != NULL)
- *typeptr = ntype;
- return ntype;
- }
- struct type *
- make_restrict_type (struct type *type)
- {
- return make_qualified_type (type,
- (TYPE_INSTANCE_FLAGS (type)
- | TYPE_INSTANCE_FLAG_RESTRICT),
- NULL);
- }
- struct type *
- make_unqualified_type (struct type *type)
- {
- return make_qualified_type (type,
- (TYPE_INSTANCE_FLAGS (type)
- & ~(TYPE_INSTANCE_FLAG_CONST
- | TYPE_INSTANCE_FLAG_VOLATILE
- | TYPE_INSTANCE_FLAG_RESTRICT)),
- NULL);
- }
- void
- replace_type (struct type *ntype, struct type *type)
- {
- struct type *chain;
-
- gdb_assert (TYPE_OBJFILE (ntype) == TYPE_OBJFILE (ntype));
- *TYPE_MAIN_TYPE (ntype) = *TYPE_MAIN_TYPE (type);
-
- chain = ntype;
- do
- {
-
- gdb_assert (TYPE_ADDRESS_CLASS_ALL (chain) == 0);
- TYPE_LENGTH (chain) = TYPE_LENGTH (type);
- chain = TYPE_CHAIN (chain);
- }
- while (ntype != chain);
-
- gdb_assert (TYPE_INSTANCE_FLAGS (ntype) == TYPE_INSTANCE_FLAGS (type));
- }
- struct type *
- lookup_memberptr_type (struct type *type, struct type *domain)
- {
- struct type *mtype;
- mtype = alloc_type_copy (type);
- smash_to_memberptr_type (mtype, domain, type);
- return mtype;
- }
- struct type *
- lookup_methodptr_type (struct type *to_type)
- {
- struct type *mtype;
- mtype = alloc_type_copy (to_type);
- smash_to_methodptr_type (mtype, to_type);
- return mtype;
- }
- struct type *
- allocate_stub_method (struct type *type)
- {
- struct type *mtype;
- mtype = alloc_type_copy (type);
- TYPE_CODE (mtype) = TYPE_CODE_METHOD;
- TYPE_LENGTH (mtype) = 1;
- TYPE_STUB (mtype) = 1;
- TYPE_TARGET_TYPE (mtype) = type;
-
- return mtype;
- }
- struct type *
- create_range_type (struct type *result_type, struct type *index_type,
- const struct dynamic_prop *low_bound,
- const struct dynamic_prop *high_bound)
- {
- if (result_type == NULL)
- result_type = alloc_type_copy (index_type);
- TYPE_CODE (result_type) = TYPE_CODE_RANGE;
- TYPE_TARGET_TYPE (result_type) = index_type;
- if (TYPE_STUB (index_type))
- TYPE_TARGET_STUB (result_type) = 1;
- else
- TYPE_LENGTH (result_type) = TYPE_LENGTH (check_typedef (index_type));
- TYPE_RANGE_DATA (result_type) = (struct range_bounds *)
- TYPE_ZALLOC (result_type, sizeof (struct range_bounds));
- TYPE_RANGE_DATA (result_type)->low = *low_bound;
- TYPE_RANGE_DATA (result_type)->high = *high_bound;
- if (low_bound->kind == PROP_CONST && low_bound->data.const_val >= 0)
- TYPE_UNSIGNED (result_type) = 1;
-
- if (high_bound->kind == PROP_CONST && high_bound->data.const_val < 0)
- TYPE_UNSIGNED (result_type) = 0;
- return result_type;
- }
- FIXME
- struct type *
- create_static_range_type (struct type *result_type, struct type *index_type,
- LONGEST low_bound, LONGEST high_bound)
- {
- struct dynamic_prop low, high;
- low.kind = PROP_CONST;
- low.data.const_val = low_bound;
- high.kind = PROP_CONST;
- high.data.const_val = high_bound;
- result_type = create_range_type (result_type, index_type, &low, &high);
- return result_type;
- }
- static int
- has_static_range (const struct range_bounds *bounds)
- {
- return (bounds->low.kind == PROP_CONST
- && bounds->high.kind == PROP_CONST);
- }
- int
- get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
- {
- CHECK_TYPEDEF (type);
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_RANGE:
- *lowp = TYPE_LOW_BOUND (type);
- *highp = TYPE_HIGH_BOUND (type);
- return 1;
- case TYPE_CODE_ENUM:
- if (TYPE_NFIELDS (type) > 0)
- {
-
- int i;
- *lowp = *highp = TYPE_FIELD_ENUMVAL (type, 0);
- for (i = 0; i < TYPE_NFIELDS (type); i++)
- {
- if (TYPE_FIELD_ENUMVAL (type, i) < *lowp)
- *lowp = TYPE_FIELD_ENUMVAL (type, i);
- if (TYPE_FIELD_ENUMVAL (type, i) > *highp)
- *highp = TYPE_FIELD_ENUMVAL (type, i);
- }
-
- if (*lowp >= 0)
- {
- TYPE_UNSIGNED (type) = 1;
- }
- }
- else
- {
- *lowp = 0;
- *highp = -1;
- }
- return 0;
- case TYPE_CODE_BOOL:
- *lowp = 0;
- *highp = 1;
- return 0;
- case TYPE_CODE_INT:
- if (TYPE_LENGTH (type) > sizeof (LONGEST))
- return -1;
- if (!TYPE_UNSIGNED (type))
- {
- *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
- *highp = -*lowp - 1;
- return 0;
- }
-
- case TYPE_CODE_CHAR:
- *lowp = 0;
-
- *highp = 1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1);
- *highp = (*highp - 1) | *highp;
- return 0;
- default:
- return -1;
- }
- }
- int
- get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound)
- {
- struct type *index = TYPE_INDEX_TYPE (type);
- LONGEST low = 0;
- LONGEST high = 0;
- int res;
- if (index == NULL)
- return 0;
- res = get_discrete_bounds (index, &low, &high);
- if (res == -1)
- return 0;
-
- if (res == 1
- && ((low_bound && TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
- || (high_bound && TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))))
- return 0;
- if (low_bound)
- *low_bound = low;
- if (high_bound)
- *high_bound = high;
- return 1;
- }
- FIXME
- struct type *
- create_array_type_with_stride (struct type *result_type,
- struct type *element_type,
- struct type *range_type,
- unsigned int bit_stride)
- {
- if (result_type == NULL)
- result_type = alloc_type_copy (range_type);
- TYPE_CODE (result_type) = TYPE_CODE_ARRAY;
- TYPE_TARGET_TYPE (result_type) = element_type;
- if (has_static_range (TYPE_RANGE_DATA (range_type)))
- {
- LONGEST low_bound, high_bound;
- if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
- low_bound = high_bound = 0;
- CHECK_TYPEDEF (element_type);
-
- if (high_bound < low_bound)
- TYPE_LENGTH (result_type) = 0;
- else if (bit_stride > 0)
- TYPE_LENGTH (result_type) =
- (bit_stride * (high_bound - low_bound + 1) + 7) / 8;
- else
- TYPE_LENGTH (result_type) =
- TYPE_LENGTH (element_type) * (high_bound - low_bound + 1);
- }
- else
- {
-
- TYPE_LENGTH (result_type) = 0;
- }
- TYPE_NFIELDS (result_type) = 1;
- TYPE_FIELDS (result_type) =
- (struct field *) TYPE_ZALLOC (result_type, sizeof (struct field));
- TYPE_INDEX_TYPE (result_type) = range_type;
- TYPE_VPTR_FIELDNO (result_type) = -1;
- if (bit_stride > 0)
- TYPE_FIELD_BITSIZE (result_type, 0) = bit_stride;
-
- if (TYPE_LENGTH (result_type) == 0)
- TYPE_TARGET_STUB (result_type) = 1;
- return result_type;
- }
- struct type *
- create_array_type (struct type *result_type,
- struct type *element_type,
- struct type *range_type)
- {
- return create_array_type_with_stride (result_type, element_type,
- range_type, 0);
- }
- struct type *
- lookup_array_range_type (struct type *element_type,
- LONGEST low_bound, LONGEST high_bound)
- {
- struct gdbarch *gdbarch = get_type_arch (element_type);
- struct type *index_type = builtin_type (gdbarch)->builtin_int;
- struct type *range_type
- = create_static_range_type (NULL, index_type, low_bound, high_bound);
- return create_array_type (NULL, element_type, range_type);
- }
- FIXME
- struct type *
- create_string_type (struct type *result_type,
- struct type *string_char_type,
- struct type *range_type)
- {
- result_type = create_array_type (result_type,
- string_char_type,
- range_type);
- TYPE_CODE (result_type) = TYPE_CODE_STRING;
- return result_type;
- }
- struct type *
- lookup_string_range_type (struct type *string_char_type,
- LONGEST low_bound, LONGEST high_bound)
- {
- struct type *result_type;
- result_type = lookup_array_range_type (string_char_type,
- low_bound, high_bound);
- TYPE_CODE (result_type) = TYPE_CODE_STRING;
- return result_type;
- }
- struct type *
- create_set_type (struct type *result_type, struct type *domain_type)
- {
- if (result_type == NULL)
- result_type = alloc_type_copy (domain_type);
- TYPE_CODE (result_type) = TYPE_CODE_SET;
- TYPE_NFIELDS (result_type) = 1;
- TYPE_FIELDS (result_type) = TYPE_ZALLOC (result_type, sizeof (struct field));
- if (!TYPE_STUB (domain_type))
- {
- LONGEST low_bound, high_bound, bit_length;
- if (get_discrete_bounds (domain_type, &low_bound, &high_bound) < 0)
- low_bound = high_bound = 0;
- bit_length = high_bound - low_bound + 1;
- TYPE_LENGTH (result_type)
- = (bit_length + TARGET_CHAR_BIT - 1) / TARGET_CHAR_BIT;
- if (low_bound >= 0)
- TYPE_UNSIGNED (result_type) = 1;
- }
- TYPE_FIELD_TYPE (result_type, 0) = domain_type;
- return result_type;
- }
- void
- make_vector_type (struct type *array_type)
- {
- struct type *inner_array, *elt_type;
- int flags;
-
- inner_array = array_type;
- while (TYPE_CODE (TYPE_TARGET_TYPE (inner_array)) == TYPE_CODE_ARRAY)
- inner_array = TYPE_TARGET_TYPE (inner_array);
- elt_type = TYPE_TARGET_TYPE (inner_array);
- if (TYPE_CODE (elt_type) == TYPE_CODE_INT)
- {
- flags = TYPE_INSTANCE_FLAGS (elt_type) | TYPE_INSTANCE_FLAG_NOTTEXT;
- elt_type = make_qualified_type (elt_type, flags, NULL);
- TYPE_TARGET_TYPE (inner_array) = elt_type;
- }
- TYPE_VECTOR (array_type) = 1;
- }
- struct type *
- init_vector_type (struct type *elt_type, int n)
- {
- struct type *array_type;
- array_type = lookup_array_range_type (elt_type, 0, n - 1);
- make_vector_type (array_type);
- return array_type;
- }
- void
- smash_to_memberptr_type (struct type *type, struct type *domain,
- struct type *to_type)
- {
- smash_type (type);
- TYPE_TARGET_TYPE (type) = to_type;
- TYPE_DOMAIN_TYPE (type) = domain;
-
- TYPE_LENGTH (type)
- = gdbarch_ptr_bit (get_type_arch (to_type)) / TARGET_CHAR_BIT;
- TYPE_CODE (type) = TYPE_CODE_MEMBERPTR;
- }
- void
- smash_to_methodptr_type (struct type *type, struct type *to_type)
- {
- smash_type (type);
- TYPE_TARGET_TYPE (type) = to_type;
- TYPE_DOMAIN_TYPE (type) = TYPE_DOMAIN_TYPE (to_type);
- TYPE_LENGTH (type) = cplus_method_ptr_size (to_type);
- TYPE_CODE (type) = TYPE_CODE_METHODPTR;
- }
- void
- smash_to_method_type (struct type *type, struct type *domain,
- struct type *to_type, struct field *args,
- int nargs, int varargs)
- {
- smash_type (type);
- TYPE_TARGET_TYPE (type) = to_type;
- TYPE_DOMAIN_TYPE (type) = domain;
- TYPE_FIELDS (type) = args;
- TYPE_NFIELDS (type) = nargs;
- if (varargs)
- TYPE_VARARGS (type) = 1;
- TYPE_LENGTH (type) = 1;
- TYPE_CODE (type) = TYPE_CODE_METHOD;
- }
- const char *
- type_name_no_tag (const struct type *type)
- {
- if (TYPE_TAG_NAME (type) != NULL)
- return TYPE_TAG_NAME (type);
-
- return TYPE_NAME (type);
- }
- const char *
- type_name_no_tag_or_error (struct type *type)
- {
- struct type *saved_type = type;
- const char *name;
- struct objfile *objfile;
- CHECK_TYPEDEF (type);
- name = type_name_no_tag (type);
- if (name != NULL)
- return name;
- 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 (objfile) : "<arch>");
- }
- struct type *
- lookup_typename (const struct language_defn *language,
- struct gdbarch *gdbarch, const char *name,
- const struct block *block, int noerr)
- {
- struct symbol *sym;
- struct type *type;
- sym = lookup_symbol_in_language (name, block, VAR_DOMAIN,
- language->la_language, NULL);
- if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
- return SYMBOL_TYPE (sym);
- if (noerr)
- return NULL;
- error (_("No type named %s."), name);
- }
- struct type *
- lookup_unsigned_typename (const struct language_defn *language,
- struct gdbarch *gdbarch, const char *name)
- {
- char *uns = alloca (strlen (name) + 10);
- strcpy (uns, "unsigned ");
- strcpy (uns + 9, name);
- return lookup_typename (language, gdbarch, uns, (struct block *) NULL, 0);
- }
- struct type *
- lookup_signed_typename (const struct language_defn *language,
- struct gdbarch *gdbarch, const char *name)
- {
- struct type *t;
- char *uns = alloca (strlen (name) + 8);
- strcpy (uns, "signed ");
- strcpy (uns + 7, name);
- t = lookup_typename (language, gdbarch, uns, (struct block *) NULL, 1);
-
- if (t != NULL)
- return t;
- return lookup_typename (language, gdbarch, name, (struct block *) NULL, 0);
- }
- struct type *
- lookup_struct (const char *name, const struct block *block)
- {
- struct symbol *sym;
- sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0);
- if (sym == NULL)
- {
- error (_("No struct type named %s."), name);
- }
- if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT)
- {
- error (_("This context has class, union or enum %s, not a struct."),
- name);
- }
- return (SYMBOL_TYPE (sym));
- }
- struct type *
- lookup_union (const char *name, const struct block *block)
- {
- struct symbol *sym;
- struct type *t;
- sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0);
- if (sym == NULL)
- error (_("No union type named %s."), name);
- t = SYMBOL_TYPE (sym);
- if (TYPE_CODE (t) == TYPE_CODE_UNION)
- return t;
-
- error (_("This context has class, struct or enum %s, not a union."),
- name);
- }
- struct type *
- lookup_enum (const char *name, const struct block *block)
- {
- struct symbol *sym;
- sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0);
- if (sym == NULL)
- {
- error (_("No enum type named %s."), name);
- }
- if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_ENUM)
- {
- error (_("This context has class, struct or union %s, not an enum."),
- name);
- }
- return (SYMBOL_TYPE (sym));
- }
- struct type *
- lookup_template_type (char *name, struct type *type,
- const struct block *block)
- {
- struct symbol *sym;
- char *nam = (char *)
- alloca (strlen (name) + strlen (TYPE_NAME (type)) + 4);
- strcpy (nam, name);
- strcat (nam, "<");
- strcat (nam, TYPE_NAME (type));
- strcat (nam, " >"); FIXME
- sym = lookup_symbol (nam, block, VAR_DOMAIN, 0);
- if (sym == NULL)
- {
- error (_("No template type named %s."), name);
- }
- if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT)
- {
- error (_("This context has class, union or enum %s, not a struct."),
- name);
- }
- return (SYMBOL_TYPE (sym));
- }
- struct type *
- lookup_struct_elt_type (struct type *type, const char *name, int noerr)
- {
- int i;
- char *typename;
- for (;;)
- {
- CHECK_TYPEDEF (type);
- if (TYPE_CODE (type) != TYPE_CODE_PTR
- && TYPE_CODE (type) != TYPE_CODE_REF)
- break;
- type = TYPE_TARGET_TYPE (type);
- }
- if (TYPE_CODE (type) != TYPE_CODE_STRUCT
- && TYPE_CODE (type) != TYPE_CODE_UNION)
- {
- typename = type_to_string (type);
- make_cleanup (xfree, typename);
- error (_("Type %s is not a structure or union type."), typename);
- }
- #if 0
- #endif
- for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--)
- {
- const char *t_field_name = TYPE_FIELD_NAME (type, i);
- if (t_field_name && (strcmp_iw (t_field_name, name) == 0))
- {
- return TYPE_FIELD_TYPE (type, i);
- }
- else if (!t_field_name || *t_field_name == '\0')
- {
- struct type *subtype
- = lookup_struct_elt_type (TYPE_FIELD_TYPE (type, i), name, 1);
- if (subtype != NULL)
- return subtype;
- }
- }
-
- for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--)
- {
- struct type *t;
- t = lookup_struct_elt_type (TYPE_BASECLASS (type, i), name, 1);
- if (t != NULL)
- {
- return t;
- }
- }
- if (noerr)
- {
- return NULL;
- }
- typename = type_to_string (type);
- make_cleanup (xfree, typename);
- error (_("Type %s has no component named %s."), typename, name);
- }
- void
- get_unsigned_type_max (struct type *type, ULONGEST *max)
- {
- unsigned int n;
- CHECK_TYPEDEF (type);
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_INT && TYPE_UNSIGNED (type));
- gdb_assert (TYPE_LENGTH (type) <= sizeof (ULONGEST));
-
- n = TYPE_LENGTH (type) * TARGET_CHAR_BIT;
- *max = ((((ULONGEST) 1 << (n - 1)) - 1) << 1) | 1;
- }
- void
- get_signed_type_minmax (struct type *type, LONGEST *min, LONGEST *max)
- {
- unsigned int n;
- CHECK_TYPEDEF (type);
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_INT && !TYPE_UNSIGNED (type));
- gdb_assert (TYPE_LENGTH (type) <= sizeof (LONGEST));
- n = TYPE_LENGTH (type) * TARGET_CHAR_BIT;
- *min = -((ULONGEST) 1 << (n - 1));
- *max = ((ULONGEST) 1 << (n - 1)) - 1;
- }
- int
- get_vptr_fieldno (struct type *type, struct type **basetypep)
- {
- CHECK_TYPEDEF (type);
- if (TYPE_VPTR_FIELDNO (type) < 0)
- {
- int i;
-
- for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
- {
- struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
- int fieldno;
- struct type *basetype;
- fieldno = get_vptr_fieldno (baseclass, &basetype);
- if (fieldno >= 0)
- {
-
- if (TYPE_OBJFILE (type) == TYPE_OBJFILE (basetype))
- {
- TYPE_VPTR_FIELDNO (type) = fieldno;
- TYPE_VPTR_BASETYPE (type) = basetype;
- }
- if (basetypep)
- *basetypep = basetype;
- return fieldno;
- }
- }
-
- return -1;
- }
- else
- {
- if (basetypep)
- *basetypep = TYPE_VPTR_BASETYPE (type);
- return TYPE_VPTR_FIELDNO (type);
- }
- }
- static void
- stub_noname_complaint (void)
- {
- complaint (&symfile_complaints, _("stub type has NULL name"));
- }
- static int
- is_dynamic_type_internal (struct type *type, int top_level)
- {
- type = check_typedef (type);
-
- if (top_level && TYPE_CODE (type) == TYPE_CODE_REF)
- type = check_typedef (TYPE_TARGET_TYPE (type));
-
- if (TYPE_DATA_LOCATION (type) != NULL
- && (TYPE_DATA_LOCATION_KIND (type) == PROP_LOCEXPR
- || TYPE_DATA_LOCATION_KIND (type) == PROP_LOCLIST))
- return 1;
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_RANGE:
- return !has_static_range (TYPE_RANGE_DATA (type));
- case TYPE_CODE_ARRAY:
- {
- gdb_assert (TYPE_NFIELDS (type) == 1);
-
- if (is_dynamic_type_internal (TYPE_INDEX_TYPE (type), 0))
- return 1;
- return is_dynamic_type_internal (TYPE_TARGET_TYPE (type), 0);
- }
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- {
- int i;
- for (i = 0; i < TYPE_NFIELDS (type); ++i)
- if (!field_is_static (&TYPE_FIELD (type, i))
- && is_dynamic_type_internal (TYPE_FIELD_TYPE (type, i), 0))
- return 1;
- }
- break;
- }
- return 0;
- }
- int
- is_dynamic_type (struct type *type)
- {
- return is_dynamic_type_internal (type, 1);
- }
- static struct type *resolve_dynamic_type_internal (struct type *type,
- CORE_ADDR addr,
- int top_level);
- static struct type *
- resolve_dynamic_range (struct type *dyn_range_type, CORE_ADDR addr)
- {
- CORE_ADDR value;
- struct type *static_range_type;
- const struct dynamic_prop *prop;
- const struct dwarf2_locexpr_baton *baton;
- struct dynamic_prop low_bound, high_bound;
- gdb_assert (TYPE_CODE (dyn_range_type) == TYPE_CODE_RANGE);
- prop = &TYPE_RANGE_DATA (dyn_range_type)->low;
- if (dwarf2_evaluate_property (prop, addr, &value))
- {
- low_bound.kind = PROP_CONST;
- low_bound.data.const_val = value;
- }
- else
- {
- low_bound.kind = PROP_UNDEFINED;
- low_bound.data.const_val = 0;
- }
- prop = &TYPE_RANGE_DATA (dyn_range_type)->high;
- if (dwarf2_evaluate_property (prop, addr, &value))
- {
- high_bound.kind = PROP_CONST;
- high_bound.data.const_val = value;
- if (TYPE_RANGE_DATA (dyn_range_type)->flag_upper_bound_is_count)
- high_bound.data.const_val
- = low_bound.data.const_val + high_bound.data.const_val - 1;
- }
- else
- {
- high_bound.kind = PROP_UNDEFINED;
- high_bound.data.const_val = 0;
- }
- static_range_type = create_range_type (copy_type (dyn_range_type),
- TYPE_TARGET_TYPE (dyn_range_type),
- &low_bound, &high_bound);
- TYPE_RANGE_DATA (static_range_type)->flag_bound_evaluated = 1;
- return static_range_type;
- }
- static struct type *
- resolve_dynamic_array (struct type *type, CORE_ADDR addr)
- {
- CORE_ADDR value;
- struct type *elt_type;
- struct type *range_type;
- struct type *ary_dim;
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_ARRAY);
- elt_type = type;
- range_type = check_typedef (TYPE_INDEX_TYPE (elt_type));
- range_type = resolve_dynamic_range (range_type, addr);
- ary_dim = check_typedef (TYPE_TARGET_TYPE (elt_type));
- if (ary_dim != NULL && TYPE_CODE (ary_dim) == TYPE_CODE_ARRAY)
- elt_type = resolve_dynamic_array (TYPE_TARGET_TYPE (type), addr);
- else
- elt_type = TYPE_TARGET_TYPE (type);
- return create_array_type (copy_type (type),
- elt_type,
- range_type);
- }
- static struct type *
- resolve_dynamic_union (struct type *type, CORE_ADDR addr)
- {
- struct type *resolved_type;
- int i;
- unsigned int max_len = 0;
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_UNION);
- resolved_type = copy_type (type);
- TYPE_FIELDS (resolved_type)
- = TYPE_ALLOC (resolved_type,
- TYPE_NFIELDS (resolved_type) * sizeof (struct field));
- memcpy (TYPE_FIELDS (resolved_type),
- TYPE_FIELDS (type),
- TYPE_NFIELDS (resolved_type) * sizeof (struct field));
- for (i = 0; i < TYPE_NFIELDS (resolved_type); ++i)
- {
- struct type *t;
- if (field_is_static (&TYPE_FIELD (type, i)))
- continue;
- t = resolve_dynamic_type_internal (TYPE_FIELD_TYPE (resolved_type, i),
- addr, 0);
- TYPE_FIELD_TYPE (resolved_type, i) = t;
- if (TYPE_LENGTH (t) > max_len)
- max_len = TYPE_LENGTH (t);
- }
- TYPE_LENGTH (resolved_type) = max_len;
- return resolved_type;
- }
- static struct type *
- resolve_dynamic_struct (struct type *type, CORE_ADDR addr)
- {
- struct type *resolved_type;
- int i;
- unsigned resolved_type_bit_length = 0;
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT);
- gdb_assert (TYPE_NFIELDS (type) > 0);
- resolved_type = copy_type (type);
- TYPE_FIELDS (resolved_type)
- = TYPE_ALLOC (resolved_type,
- TYPE_NFIELDS (resolved_type) * sizeof (struct field));
- memcpy (TYPE_FIELDS (resolved_type),
- TYPE_FIELDS (type),
- TYPE_NFIELDS (resolved_type) * sizeof (struct field));
- for (i = 0; i < TYPE_NFIELDS (resolved_type); ++i)
- {
- unsigned new_bit_length;
- if (field_is_static (&TYPE_FIELD (type, i)))
- continue;
- TYPE_FIELD_TYPE (resolved_type, i)
- = resolve_dynamic_type_internal (TYPE_FIELD_TYPE (resolved_type, i),
- addr, 0);
-
- if (TYPE_FIELD_LOC_KIND (resolved_type, i) != FIELD_LOC_KIND_BITPOS)
- error (_("Cannot determine struct field location"
- " (invalid location kind)"));
- new_bit_length = TYPE_FIELD_BITPOS (resolved_type, i);
- if (TYPE_FIELD_BITSIZE (resolved_type, i) != 0)
- new_bit_length += TYPE_FIELD_BITSIZE (resolved_type, i);
- else
- new_bit_length += (TYPE_LENGTH (TYPE_FIELD_TYPE (resolved_type, i))
- * TARGET_CHAR_BIT);
-
- if (new_bit_length > resolved_type_bit_length)
- resolved_type_bit_length = new_bit_length;
- }
- TYPE_LENGTH (resolved_type)
- = (resolved_type_bit_length + TARGET_CHAR_BIT - 1) / TARGET_CHAR_BIT;
- return resolved_type;
- }
- static struct type *
- resolve_dynamic_type_internal (struct type *type, CORE_ADDR addr,
- int top_level)
- {
- struct type *real_type = check_typedef (type);
- struct type *resolved_type = type;
- const struct dynamic_prop *prop;
- CORE_ADDR value;
- if (!is_dynamic_type_internal (real_type, top_level))
- return type;
- if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
- {
- resolved_type = copy_type (type);
- TYPE_TARGET_TYPE (resolved_type)
- = resolve_dynamic_type_internal (TYPE_TARGET_TYPE (type), addr,
- top_level);
- }
- else
- {
-
- type = real_type;
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_REF:
- {
- CORE_ADDR target_addr = read_memory_typed_address (addr, type);
- resolved_type = copy_type (type);
- TYPE_TARGET_TYPE (resolved_type)
- = resolve_dynamic_type_internal (TYPE_TARGET_TYPE (type),
- target_addr, top_level);
- break;
- }
- case TYPE_CODE_ARRAY:
- resolved_type = resolve_dynamic_array (type, addr);
- break;
- case TYPE_CODE_RANGE:
- resolved_type = resolve_dynamic_range (type, addr);
- break;
- case TYPE_CODE_UNION:
- resolved_type = resolve_dynamic_union (type, addr);
- break;
- case TYPE_CODE_STRUCT:
- resolved_type = resolve_dynamic_struct (type, addr);
- break;
- }
- }
-
- prop = TYPE_DATA_LOCATION (resolved_type);
- if (dwarf2_evaluate_property (prop, addr, &value))
- {
- TYPE_DATA_LOCATION_ADDR (resolved_type) = value;
- TYPE_DATA_LOCATION_KIND (resolved_type) = PROP_CONST;
- }
- else
- TYPE_DATA_LOCATION (resolved_type) = NULL;
- return resolved_type;
- }
- struct type *
- resolve_dynamic_type (struct type *type, CORE_ADDR addr)
- {
- return resolve_dynamic_type_internal (type, addr, 1);
- }
- struct type *
- check_typedef (struct type *type)
- {
- struct type *orig_type = type;
-
- int instance_flags = TYPE_INSTANCE_FLAGS (type);
- gdb_assert (type);
- while (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
- {
- if (!TYPE_TARGET_TYPE (type))
- {
- const char *name;
- struct symbol *sym;
-
- if (currently_reading_symtab)
- return make_qualified_type (type, instance_flags, NULL);
- name = type_name_no_tag (type);
- FIXME
- if (name == NULL)
- {
- stub_noname_complaint ();
- return make_qualified_type (type, instance_flags, NULL);
- }
- sym = lookup_symbol (name, 0, STRUCT_DOMAIN, 0);
- if (sym)
- TYPE_TARGET_TYPE (type) = SYMBOL_TYPE (sym);
- else
- TYPE_TARGET_TYPE (type) = alloc_type_arch (get_type_arch (type));
- }
- type = TYPE_TARGET_TYPE (type);
-
- {
- const int ALL_SPACES = (TYPE_INSTANCE_FLAG_CODE_SPACE
- | TYPE_INSTANCE_FLAG_DATA_SPACE);
- const int ALL_CLASSES = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL;
- int new_instance_flags = TYPE_INSTANCE_FLAGS (type);
-
- if ((instance_flags & ALL_SPACES) != 0)
- new_instance_flags &= ~ALL_SPACES;
- if ((instance_flags & ALL_CLASSES) != 0)
- new_instance_flags &= ~ALL_CLASSES;
- instance_flags |= new_instance_flags;
- }
- }
-
- if (TYPE_IS_OPAQUE (type)
- && opaque_type_resolution
- && !currently_reading_symtab)
- {
- const char *name = type_name_no_tag (type);
- struct type *newtype;
- if (name == NULL)
- {
- stub_noname_complaint ();
- return make_qualified_type (type, instance_flags, NULL);
- }
- newtype = lookup_transparent_type (name);
- if (newtype)
- {
-
- if (TYPE_OBJFILE (newtype) == TYPE_OBJFILE (type))
- type = make_qualified_type (newtype,
- TYPE_INSTANCE_FLAGS (type),
- type);
- else
- type = newtype;
- }
- }
-
- else if (TYPE_STUB (type) && !currently_reading_symtab)
- {
- const char *name = type_name_no_tag (type);
- FIXME
- struct symbol *sym;
- if (name == NULL)
- {
- stub_noname_complaint ();
- return make_qualified_type (type, instance_flags, NULL);
- }
- sym = lookup_symbol (name, 0, STRUCT_DOMAIN, 0);
- if (sym)
- {
-
- if (TYPE_OBJFILE (SYMBOL_TYPE(sym)) == TYPE_OBJFILE (type))
- type = make_qualified_type (SYMBOL_TYPE (sym),
- TYPE_INSTANCE_FLAGS (type),
- type);
- else
- type = SYMBOL_TYPE (sym);
- }
- }
- if (TYPE_TARGET_STUB (type))
- {
- struct type *range_type;
- struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
- if (TYPE_STUB (target_type) || TYPE_TARGET_STUB (target_type))
- {
-
- }
- else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
- {
- TYPE_LENGTH (type) = TYPE_LENGTH (target_type);
- TYPE_TARGET_STUB (type) = 0;
- }
- }
- type = make_qualified_type (type, instance_flags, NULL);
-
- TYPE_LENGTH (orig_type) = TYPE_LENGTH (type);
- return type;
- }
- static struct type *
- safe_parse_type (struct gdbarch *gdbarch, char *p, int length)
- {
- struct ui_file *saved_gdb_stderr;
- struct type *type = NULL;
- volatile struct gdb_exception except;
-
- saved_gdb_stderr = gdb_stderr;
- gdb_stderr = ui_file_new ();
-
- TRY_CATCH (except, RETURN_MASK_ERROR)
- {
- type = parse_and_eval_type (p, length);
- }
- if (except.reason < 0)
- type = builtin_type (gdbarch)->builtin_void;
-
- ui_file_delete (gdb_stderr);
- gdb_stderr = saved_gdb_stderr;
- return type;
- }
- static void
- 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 = gdb_demangle (mangled_name,
- DMGL_PARAMS | DMGL_ANSI);
- char *argtypetext, *p;
- int depth = 0, argcount = 1;
- struct field *argtypes;
- struct type *mtype;
-
- if (demangled_name)
- p = strchr (demangled_name, '(');
- else
- p = NULL;
- if (demangled_name == NULL || p == NULL)
- error (_("Internal: Cannot demangle mangled name `%s'."),
- mangled_name);
-
- p += 1;
- argtypetext = p;
- while (*p)
- {
- if (*p == '(' || *p == '<')
- {
- depth += 1;
- }
- else if (*p == ')' || *p == '>')
- {
- depth -= 1;
- }
- else if (*p == ',' && depth == 0)
- {
- argcount += 1;
- }
- p += 1;
- }
-
- if (strncmp (argtypetext, "(void)", 6) == 0)
- argcount -= 1;
-
- argtypes = (struct field *)
- TYPE_ALLOC (type, (argcount + 1) * sizeof (struct field));
- p = argtypetext;
-
- f = TYPE_FN_FIELDLIST1 (type, method_id);
- if (TYPE_FN_FIELD_STATIC_P (f, signature_id))
- argcount = 0;
- else
- {
- argtypes[0].type = lookup_pointer_type (type);
- argcount = 1;
- }
- if (*p != ')')
- {
- depth = 0;
- while (*p)
- {
- if (depth <= 0 && (*p == ',' || *p == ')'))
- {
-
- if (strncmp (argtypetext, "...", p - argtypetext) != 0
- && strncmp (argtypetext, "void", p - argtypetext) != 0)
- {
- argtypes[argcount].type =
- safe_parse_type (gdbarch, argtypetext, p - argtypetext);
- argcount += 1;
- }
- argtypetext = p + 1;
- }
- if (*p == '(' || *p == '<')
- {
- depth += 1;
- }
- else if (*p == ')' || *p == '>')
- {
- depth -= 1;
- }
- p += 1;
- }
- }
- TYPE_FN_FIELD_PHYSNAME (f, signature_id) = mangled_name;
-
- mtype = TYPE_FN_FIELD_TYPE (f, signature_id);
- TYPE_DOMAIN_TYPE (mtype) = type;
- TYPE_FIELDS (mtype) = argtypes;
- TYPE_NFIELDS (mtype) = argcount;
- TYPE_STUB (mtype) = 0;
- TYPE_FN_FIELD_STUB (f, signature_id) = 0;
- if (p[-2] == '.')
- TYPE_VARARGS (mtype) = 1;
- xfree (demangled_name);
- }
- 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);
- }
-
- 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 = { };
- void
- allocate_cplus_struct_type (struct type *type)
- {
- if (HAVE_CPLUS_STRUCT (type))
-
- return;
- TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_CPLUS_STUFF;
- TYPE_RAW_CPLUS_SPECIFIC (type) = (struct cplus_struct_type *)
- TYPE_ALLOC (type, sizeof (struct cplus_struct_type));
- *(TYPE_RAW_CPLUS_SPECIFIC (type)) = cplus_struct_default;
- }
- const struct gnat_aux_type gnat_aux_default =
- { NULL };
- void
- allocate_gnat_aux_type (struct type *type)
- {
- TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_GNAT_STUFF;
- TYPE_GNAT_SPECIFIC (type) = (struct gnat_aux_type *)
- TYPE_ALLOC (type, sizeof (struct gnat_aux_type));
- *(TYPE_GNAT_SPECIFIC (type)) = gnat_aux_default;
- }
- struct type *
- init_type (enum type_code code, int length, int flags,
- const char *name, struct objfile *objfile)
- {
- struct type *type;
- type = alloc_type (objfile);
- TYPE_CODE (type) = code;
- TYPE_LENGTH (type) = length;
- gdb_assert (!(flags & (TYPE_FLAG_MIN - 1)));
- if (flags & TYPE_FLAG_UNSIGNED)
- TYPE_UNSIGNED (type) = 1;
- if (flags & TYPE_FLAG_NOSIGN)
- TYPE_NOSIGN (type) = 1;
- if (flags & TYPE_FLAG_STUB)
- TYPE_STUB (type) = 1;
- if (flags & TYPE_FLAG_TARGET_STUB)
- TYPE_TARGET_STUB (type) = 1;
- if (flags & TYPE_FLAG_STATIC)
- TYPE_STATIC (type) = 1;
- if (flags & TYPE_FLAG_PROTOTYPED)
- TYPE_PROTOTYPED (type) = 1;
- if (flags & TYPE_FLAG_INCOMPLETE)
- TYPE_INCOMPLETE (type) = 1;
- if (flags & TYPE_FLAG_VARARGS)
- TYPE_VARARGS (type) = 1;
- if (flags & TYPE_FLAG_VECTOR)
- TYPE_VECTOR (type) = 1;
- if (flags & TYPE_FLAG_STUB_SUPPORTED)
- TYPE_STUB_SUPPORTED (type) = 1;
- if (flags & TYPE_FLAG_FIXED_INSTANCE)
- TYPE_FIXED_INSTANCE (type) = 1;
- if (flags & TYPE_FLAG_GNU_IFUNC)
- TYPE_GNU_IFUNC (type) = 1;
- TYPE_NAME (type) = name;
-
- if (name && strcmp (name, "char") == 0)
- TYPE_NOSIGN (type) = 1;
- switch (code)
- {
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- case TYPE_CODE_NAMESPACE:
- INIT_CPLUS_SPECIFIC (type);
- break;
- case TYPE_CODE_FLT:
- TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FLOATFORMAT;
- break;
- case TYPE_CODE_FUNC:
- INIT_FUNC_SPECIFIC (type);
- break;
- }
- return type;
- }
- int
- can_dereference (struct type *t)
- {
- FIXME
- CHECK_TYPEDEF (t);
- return
- (t != NULL
- && TYPE_CODE (t) == TYPE_CODE_PTR
- && TYPE_CODE (TYPE_TARGET_TYPE (t)) != TYPE_CODE_VOID);
- }
- int
- is_integral_type (struct type *t)
- {
- CHECK_TYPEDEF (t);
- return
- ((t != NULL)
- && ((TYPE_CODE (t) == TYPE_CODE_INT)
- || (TYPE_CODE (t) == TYPE_CODE_ENUM)
- || (TYPE_CODE (t) == TYPE_CODE_FLAGS)
- || (TYPE_CODE (t) == TYPE_CODE_CHAR)
- || (TYPE_CODE (t) == TYPE_CODE_RANGE)
- || (TYPE_CODE (t) == TYPE_CODE_BOOL)));
- }
- static int
- is_scalar_type (struct type *type)
- {
- CHECK_TYPEDEF (type);
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- case TYPE_CODE_SET:
- case TYPE_CODE_STRING:
- return 0;
- default:
- return 1;
- }
- }
- int
- is_scalar_type_recursive (struct type *t)
- {
- CHECK_TYPEDEF (t);
- if (is_scalar_type (t))
- return 1;
-
- else if ((TYPE_CODE (t) == TYPE_CODE_ARRAY
- || TYPE_CODE (t) == TYPE_CODE_STRING) && TYPE_NFIELDS (t) == 1
- && TYPE_CODE (TYPE_INDEX_TYPE (t)) == TYPE_CODE_RANGE)
- {
- LONGEST low_bound, high_bound;
- struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (t));
- get_discrete_bounds (TYPE_INDEX_TYPE (t), &low_bound, &high_bound);
- return high_bound == low_bound && is_scalar_type_recursive (elt_type);
- }
-
- else if (TYPE_CODE (t) == TYPE_CODE_STRUCT && TYPE_NFIELDS (t) == 1)
- return is_scalar_type_recursive (TYPE_FIELD_TYPE (t, 0));
- else if (TYPE_CODE (t) == TYPE_CODE_UNION)
- {
- int i, n = TYPE_NFIELDS (t);
-
- for (i = 0; i < n; i++)
- if (!is_scalar_type_recursive (TYPE_FIELD_TYPE (t, i)))
- return 0;
- return 1;
- }
- return 0;
- }
- int
- class_or_union_p (const struct type *t)
- {
- return (TYPE_CODE (t) == TYPE_CODE_STRUCT
- || TYPE_CODE (t) == TYPE_CODE_UNION);
- }
- int
- class_types_same_p (const struct type *a, const struct type *b)
- {
- return (TYPE_MAIN_TYPE (a) == TYPE_MAIN_TYPE (b)
- || (TYPE_NAME (a) && TYPE_NAME (b)
- && !strcmp (TYPE_NAME (a), TYPE_NAME (b))));
- }
- static int
- distance_to_ancestor (struct type *base, struct type *dclass, int public)
- {
- int i;
- int d;
- CHECK_TYPEDEF (base);
- CHECK_TYPEDEF (dclass);
- if (class_types_same_p (base, dclass))
- return 0;
- for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++)
- {
- if (public && ! BASETYPE_VIA_PUBLIC (dclass, i))
- continue;
- d = distance_to_ancestor (base, TYPE_BASECLASS (dclass, i), public);
- if (d >= 0)
- return 1 + d;
- }
- return -1;
- }
- int
- is_ancestor (struct type *base, struct type *dclass)
- {
- return distance_to_ancestor (base, dclass, 0) >= 0;
- }
- int
- is_public_ancestor (struct type *base, struct type *dclass)
- {
- return distance_to_ancestor (base, dclass, 1) >= 0;
- }
- static int
- is_unique_ancestor_worker (struct type *base, struct type *dclass,
- int *offset,
- const gdb_byte *valaddr, int embedded_offset,
- CORE_ADDR address, struct value *val)
- {
- int i, count = 0;
- CHECK_TYPEDEF (base);
- CHECK_TYPEDEF (dclass);
- for (i = 0; i < TYPE_N_BASECLASSES (dclass) && count < 2; ++i)
- {
- struct type *iter;
- int this_offset;
- iter = check_typedef (TYPE_BASECLASS (dclass, i));
- this_offset = baseclass_offset (dclass, i, valaddr, embedded_offset,
- address, val);
- if (class_types_same_p (base, iter))
- {
-
- if (*offset == -1)
- {
- *offset = this_offset;
- count = 1;
- }
- else if (this_offset == *offset)
- {
-
- }
- else
- ++count;
- }
- else
- count += is_unique_ancestor_worker (base, iter, offset,
- valaddr,
- embedded_offset + this_offset,
- address, val);
- }
- return count;
- }
- int
- is_unique_ancestor (struct type *base, struct value *val)
- {
- int offset = -1;
- return is_unique_ancestor_worker (base, value_type (val), &offset,
- value_contents_for_printing (val),
- value_embedded_offset (val),
- value_address (val), val) == 1;
- }
- struct rank
- sum_ranks (struct rank a, struct rank b)
- {
- struct rank c;
- c.rank = a.rank + b.rank;
- c.subrank = a.subrank + b.subrank;
- return c;
- }
- int
- compare_ranks (struct rank a, struct rank b)
- {
- if (a.rank == b.rank)
- {
- if (a.subrank == b.subrank)
- return 0;
- if (a.subrank < b.subrank)
- return 1;
- if (a.subrank > b.subrank)
- return -1;
- }
- if (a.rank < b.rank)
- return 1;
-
- return -1;
- }
- int
- compare_badness (struct badness_vector *a, struct badness_vector *b)
- {
- int i;
- int tmp;
- short found_pos = 0;
- short found_neg = 0;
-
- if (a->length != b->length)
- return 1;
-
- for (i = 0; i < a->length; i++)
- {
- tmp = compare_ranks (b->rank[i], a->rank[i]);
- if (tmp > 0)
- found_pos = 1;
- else if (tmp < 0)
- found_neg = 1;
- }
- if (found_pos)
- {
- if (found_neg)
- return 1;
- else
- return 3;
- }
- else
-
- {
- if (found_neg)
- return 2;
- else
- return 0;
- }
- }
- struct badness_vector *
- rank_function (struct type **parms, int nparms,
- struct value **args, int nargs)
- {
- int i;
- struct badness_vector *bv;
- int min_len = nparms < nargs ? nparms : nargs;
- bv = xmalloc (sizeof (struct badness_vector));
- bv->length = nargs + 1;
- bv->rank = XNEWVEC (struct rank, nargs + 1);
-
- FIXME
- LENGTH_MATCH (bv) = (nargs != nparms)
- ? LENGTH_MISMATCH_BADNESS
- : EXACT_MATCH_BADNESS;
-
- for (i = 1; i <= min_len; i++)
- bv->rank[i] = rank_one_type (parms[i - 1], value_type (args[i - 1]),
- args[i - 1]);
-
- for (i = min_len + 1; i <= nargs; i++)
- bv->rank[i] = TOO_FEW_PARAMS_BADNESS;
- return bv;
- }
- static int
- integer_types_same_name_p (const char *first, const char *second)
- {
- int first_p, second_p;
-
- 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;
-
- 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;
-
- 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;
-
- return 1;
- }
- int
- types_equal (struct type *a, struct type *b)
- {
-
-
- if (a == b)
- return 1;
-
- if (TYPE_CODE (a) == TYPE_CODE_TYPEDEF)
- a = check_typedef (a);
- if (TYPE_CODE (b) == TYPE_CODE_TYPEDEF)
- b = check_typedef (b);
-
- if (TYPE_CODE (a) != TYPE_CODE (b))
- return 0;
-
- if (TYPE_CODE (a) == TYPE_CODE_PTR
- || TYPE_CODE (a) == TYPE_CODE_REF)
- return types_equal (TYPE_TARGET_TYPE (a),
- TYPE_TARGET_TYPE (b));
-
- if (TYPE_NAME (a) && TYPE_NAME (b)
- && strcmp (TYPE_NAME (a), TYPE_NAME (b)) == 0)
- return 1;
-
- if (a == b)
- return 1;
-
- 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;
- }
- typedef struct type_equality_entry
- {
- struct type *type1, *type2;
- } type_equality_entry_d;
- DEF_VEC_O (type_equality_entry_d);
- 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;
- }
- 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;
- }
- 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);
-
- bcache_full (&entry, sizeof (entry), cache, &added);
- if (!added)
- continue;
- if (check_types_equal (entry.type1, entry.type2, worklist) == 0)
- return 0;
- }
- return 1;
- }
- 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);
-
- 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);
- }
-
- bcache_xfree (cache);
- VEC_free (type_equality_entry_d, worklist);
-
- if (except.reason < 0)
- throw_exception (except);
- return result;
- }
- struct rank
- rank_one_type (struct type *parm, struct type *arg, struct value *value)
- {
- struct rank rank = {0,0};
- if (types_equal (parm, arg))
- return EXACT_MATCH_BADNESS;
-
- if (TYPE_CODE (parm) == TYPE_CODE_TYPEDEF)
- parm = check_typedef (parm);
- if (TYPE_CODE (arg) == TYPE_CODE_TYPEDEF)
- arg = check_typedef (arg);
-
- if (TYPE_CODE (arg) == TYPE_CODE_REF)
- return (sum_ranks (rank_one_type (parm, TYPE_TARGET_TYPE (arg), NULL),
- REFERENCE_CONVERSION_BADNESS));
- if (TYPE_CODE (parm) == TYPE_CODE_REF)
- return (sum_ranks (rank_one_type (TYPE_TARGET_TYPE (parm), arg, NULL),
- REFERENCE_CONVERSION_BADNESS));
- if (overload_debug)
-
- fprintf_filtered (gdb_stderr,
- "------ Arg is %s [%d], parm is %s [%d]\n",
- TYPE_NAME (arg), TYPE_CODE (arg),
- TYPE_NAME (parm), TYPE_CODE (parm));
-
- switch (TYPE_CODE (parm))
- {
- case TYPE_CODE_PTR:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_PTR:
-
- if (TYPE_CODE (TYPE_TARGET_TYPE (parm)) == TYPE_CODE_VOID)
- return VOID_PTR_CONVERSION_BADNESS;
-
- rank.subrank = distance_to_ancestor (TYPE_TARGET_TYPE (parm),
- TYPE_TARGET_TYPE (arg),
- 0);
- if (rank.subrank >= 0)
- return sum_ranks (BASE_PTR_CONVERSION_BADNESS, rank);
- return INCOMPATIBLE_TYPE_BADNESS;
- case TYPE_CODE_ARRAY:
- if (types_equal (TYPE_TARGET_TYPE (parm),
- TYPE_TARGET_TYPE (arg)))
- return EXACT_MATCH_BADNESS;
- return INCOMPATIBLE_TYPE_BADNESS;
- 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)
- {
- if (value_as_long (value) == 0)
- {
-
- return NULL_POINTER_CONVERSION_BADNESS;
- }
- else
- {
-
- if (!strict_type_checking)
- return NS_INTEGER_POINTER_CONVERSION_BADNESS;
- }
- }
-
- case TYPE_CODE_ENUM:
- case TYPE_CODE_FLAGS:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_BOOL:
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- case TYPE_CODE_ARRAY:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_PTR:
- case TYPE_CODE_ARRAY:
- return rank_one_type (TYPE_TARGET_TYPE (parm),
- TYPE_TARGET_TYPE (arg), NULL);
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- case TYPE_CODE_FUNC:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_PTR:
- return rank_one_type (parm, TYPE_TARGET_TYPE (arg), NULL);
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- case TYPE_CODE_INT:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_INT:
- if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
- {
-
- if (TYPE_NOSIGN (parm))
- {
-
- if (TYPE_NOSIGN (arg))
- return EXACT_MATCH_BADNESS;
- else
- return INTEGER_CONVERSION_BADNESS;
- }
- else if (TYPE_UNSIGNED (parm))
- {
- if (TYPE_UNSIGNED (arg))
- {
-
- if (integer_types_same_name_p (TYPE_NAME (parm),
- TYPE_NAME (arg)))
- return EXACT_MATCH_BADNESS;
- 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_CONVERSION_BADNESS;
- }
- else
- {
- if (integer_types_same_name_p (TYPE_NAME (arg),
- "long")
- && integer_types_same_name_p (TYPE_NAME (parm),
- "int"))
-
- return INTEGER_CONVERSION_BADNESS;
- else
-
- return INTEGER_CONVERSION_BADNESS;
- }
- }
- else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
- {
- if (integer_types_same_name_p (TYPE_NAME (parm),
- TYPE_NAME (arg)))
- return EXACT_MATCH_BADNESS;
- 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_CONVERSION_BADNESS;
- }
- else
- return INTEGER_CONVERSION_BADNESS;
- }
- else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
- return INTEGER_PROMOTION_BADNESS;
- else
- return INTEGER_CONVERSION_BADNESS;
- case TYPE_CODE_ENUM:
- case TYPE_CODE_FLAGS:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_BOOL:
- if (TYPE_DECLARED_CLASS (arg))
- return INCOMPATIBLE_TYPE_BADNESS;
- return INTEGER_PROMOTION_BADNESS;
- case TYPE_CODE_FLT:
- return INT_FLOAT_CONVERSION_BADNESS;
- case TYPE_CODE_PTR:
- return NS_POINTER_CONVERSION_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_ENUM:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_ENUM:
- if (TYPE_DECLARED_CLASS (parm) || TYPE_DECLARED_CLASS (arg))
- return INCOMPATIBLE_TYPE_BADNESS;
- return INTEGER_CONVERSION_BADNESS;
- case TYPE_CODE_FLT:
- return INT_FLOAT_CONVERSION_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_CHAR:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_RANGE:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_ENUM:
- if (TYPE_DECLARED_CLASS (arg))
- return INCOMPATIBLE_TYPE_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_CONVERSION_BADNESS;
- else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
- return INTEGER_PROMOTION_BADNESS;
-
- case TYPE_CODE_CHAR:
-
- if (TYPE_NOSIGN (parm))
- {
- if (TYPE_NOSIGN (arg))
- return EXACT_MATCH_BADNESS;
- else
- return INTEGER_CONVERSION_BADNESS;
- }
- else if (TYPE_UNSIGNED (parm))
- {
- if (TYPE_UNSIGNED (arg))
- return EXACT_MATCH_BADNESS;
- else
- return INTEGER_PROMOTION_BADNESS;
- }
- else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
- return EXACT_MATCH_BADNESS;
- else
- return INTEGER_CONVERSION_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_RANGE:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_ENUM:
- return INTEGER_CONVERSION_BADNESS;
- case TYPE_CODE_FLT:
- return INT_FLOAT_CONVERSION_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_BOOL:
- switch (TYPE_CODE (arg))
- {
-
- case TYPE_CODE_INT:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_FLT:
- case TYPE_CODE_MEMBERPTR:
- case TYPE_CODE_PTR:
- return BOOL_CONVERSION_BADNESS;
- case TYPE_CODE_RANGE:
- return INCOMPATIBLE_TYPE_BADNESS;
- case TYPE_CODE_BOOL:
- return EXACT_MATCH_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_FLT:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_FLT:
- if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
- return FLOAT_PROMOTION_BADNESS;
- else if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
- return EXACT_MATCH_BADNESS;
- else
- return FLOAT_CONVERSION_BADNESS;
- case TYPE_CODE_INT:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_CHAR:
- return INT_FLOAT_CONVERSION_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_COMPLEX:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_FLT:
- return FLOAT_PROMOTION_BADNESS;
- case TYPE_CODE_COMPLEX:
- return EXACT_MATCH_BADNESS;
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_STRUCT:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_STRUCT:
-
- rank.subrank = distance_to_ancestor (parm, arg, 0);
- if (rank.subrank >= 0)
- return sum_ranks (BASE_CONVERSION_BADNESS, rank);
-
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_UNION:
- switch (TYPE_CODE (arg))
- {
- case TYPE_CODE_UNION:
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_MEMBERPTR:
- switch (TYPE_CODE (arg))
- {
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_METHOD:
- switch (TYPE_CODE (arg))
- {
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_REF:
- switch (TYPE_CODE (arg))
- {
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_SET:
- switch (TYPE_CODE (arg))
- {
-
- case TYPE_CODE_SET:
- return rank_one_type (TYPE_FIELD_TYPE (parm, 0),
- TYPE_FIELD_TYPE (arg, 0), NULL);
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- break;
- case TYPE_CODE_VOID:
- default:
- return INCOMPATIBLE_TYPE_BADNESS;
- }
- }
- static void
- print_bit_vector (B_TYPE *bits, int nbits)
- {
- int bitno;
- for (bitno = 0; bitno < nbits; bitno++)
- {
- if ((bitno % 8) == 0)
- {
- puts_filtered (" ");
- }
- if (B_TST (bits, bitno))
- printf_filtered (("1"));
- else
- printf_filtered (("0"));
- }
- }
- static void
- print_args (struct field *args, int nargs, int spaces)
- {
- if (args != NULL)
- {
- int i;
- for (i = 0; i < nargs; i++)
- {
- printfi_filtered (spaces, "[%d] name '%s'\n", i,
- args[i].name != NULL ? args[i].name : "<NULL>");
- recursive_dump_type (args[i].type, spaces + 2);
- }
- }
- }
- int
- field_is_static (struct field *f)
- {
-
- return (FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSNAME
- || FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSADDR);
- }
- static void
- dump_fn_fieldlists (struct type *type, int spaces)
- {
- int method_idx;
- int overload_idx;
- struct fn_field *f;
- printfi_filtered (spaces, "fn_fieldlists ");
- gdb_print_host_address (TYPE_FN_FIELDLISTS (type), gdb_stdout);
- printf_filtered ("\n");
- for (method_idx = 0; method_idx < TYPE_NFN_FIELDS (type); method_idx++)
- {
- f = TYPE_FN_FIELDLIST1 (type, method_idx);
- printfi_filtered (spaces + 2, "[%d] name '%s' (",
- method_idx,
- TYPE_FN_FIELDLIST_NAME (type, method_idx));
- gdb_print_host_address (TYPE_FN_FIELDLIST_NAME (type, method_idx),
- gdb_stdout);
- printf_filtered (_(") length %d\n"),
- TYPE_FN_FIELDLIST_LENGTH (type, method_idx));
- for (overload_idx = 0;
- overload_idx < TYPE_FN_FIELDLIST_LENGTH (type, method_idx);
- overload_idx++)
- {
- printfi_filtered (spaces + 4, "[%d] physname '%s' (",
- overload_idx,
- TYPE_FN_FIELD_PHYSNAME (f, overload_idx));
- gdb_print_host_address (TYPE_FN_FIELD_PHYSNAME (f, overload_idx),
- gdb_stdout);
- printf_filtered (")\n");
- printfi_filtered (spaces + 8, "type ");
- gdb_print_host_address (TYPE_FN_FIELD_TYPE (f, overload_idx),
- gdb_stdout);
- printf_filtered ("\n");
- recursive_dump_type (TYPE_FN_FIELD_TYPE (f, overload_idx),
- spaces + 8 + 2);
- printfi_filtered (spaces + 8, "args ");
- gdb_print_host_address (TYPE_FN_FIELD_ARGS (f, overload_idx),
- gdb_stdout);
- printf_filtered ("\n");
- print_args (TYPE_FN_FIELD_ARGS (f, overload_idx),
- TYPE_NFIELDS (TYPE_FN_FIELD_TYPE (f, overload_idx)),
- spaces + 8 + 2);
- printfi_filtered (spaces + 8, "fcontext ");
- gdb_print_host_address (TYPE_FN_FIELD_FCONTEXT (f, overload_idx),
- gdb_stdout);
- printf_filtered ("\n");
- printfi_filtered (spaces + 8, "is_const %d\n",
- TYPE_FN_FIELD_CONST (f, overload_idx));
- printfi_filtered (spaces + 8, "is_volatile %d\n",
- TYPE_FN_FIELD_VOLATILE (f, overload_idx));
- printfi_filtered (spaces + 8, "is_private %d\n",
- TYPE_FN_FIELD_PRIVATE (f, overload_idx));
- printfi_filtered (spaces + 8, "is_protected %d\n",
- TYPE_FN_FIELD_PROTECTED (f, overload_idx));
- printfi_filtered (spaces + 8, "is_stub %d\n",
- TYPE_FN_FIELD_STUB (f, overload_idx));
- printfi_filtered (spaces + 8, "voffset %u\n",
- TYPE_FN_FIELD_VOFFSET (f, overload_idx));
- }
- }
- }
- static void
- print_cplus_stuff (struct type *type, int spaces)
- {
- printfi_filtered (spaces, "n_baseclasses %d\n",
- TYPE_N_BASECLASSES (type));
- printfi_filtered (spaces, "nfn_fields %d\n",
- TYPE_NFN_FIELDS (type));
- if (TYPE_N_BASECLASSES (type) > 0)
- {
- printfi_filtered (spaces, "virtual_field_bits (%d bits at *",
- TYPE_N_BASECLASSES (type));
- gdb_print_host_address (TYPE_FIELD_VIRTUAL_BITS (type),
- gdb_stdout);
- printf_filtered (")");
- print_bit_vector (TYPE_FIELD_VIRTUAL_BITS (type),
- TYPE_N_BASECLASSES (type));
- puts_filtered ("\n");
- }
- if (TYPE_NFIELDS (type) > 0)
- {
- if (TYPE_FIELD_PRIVATE_BITS (type) != NULL)
- {
- printfi_filtered (spaces,
- "private_field_bits (%d bits at *",
- TYPE_NFIELDS (type));
- gdb_print_host_address (TYPE_FIELD_PRIVATE_BITS (type),
- gdb_stdout);
- printf_filtered (")");
- print_bit_vector (TYPE_FIELD_PRIVATE_BITS (type),
- TYPE_NFIELDS (type));
- puts_filtered ("\n");
- }
- if (TYPE_FIELD_PROTECTED_BITS (type) != NULL)
- {
- printfi_filtered (spaces,
- "protected_field_bits (%d bits at *",
- TYPE_NFIELDS (type));
- gdb_print_host_address (TYPE_FIELD_PROTECTED_BITS (type),
- gdb_stdout);
- printf_filtered (")");
- print_bit_vector (TYPE_FIELD_PROTECTED_BITS (type),
- TYPE_NFIELDS (type));
- puts_filtered ("\n");
- }
- }
- if (TYPE_NFN_FIELDS (type) > 0)
- {
- dump_fn_fieldlists (type, spaces);
- }
- }
- static void
- print_gnat_stuff (struct type *type, int spaces)
- {
- struct type *descriptive_type = TYPE_DESCRIPTIVE_TYPE (type);
- recursive_dump_type (descriptive_type, spaces + 2);
- }
- static struct obstack dont_print_type_obstack;
- void
- recursive_dump_type (struct type *type, int spaces)
- {
- int idx;
- if (spaces == 0)
- obstack_begin (&dont_print_type_obstack, 0);
- if (TYPE_NFIELDS (type) > 0
- || (HAVE_CPLUS_STRUCT (type) && TYPE_NFN_FIELDS (type) > 0))
- {
- struct type **first_dont_print
- = (struct type **) obstack_base (&dont_print_type_obstack);
- int i = (struct type **)
- obstack_next_free (&dont_print_type_obstack) - first_dont_print;
- while (--i >= 0)
- {
- if (type == first_dont_print[i])
- {
- printfi_filtered (spaces, "type node ");
- gdb_print_host_address (type, gdb_stdout);
- printf_filtered (_(" <same as already seen type>\n"));
- return;
- }
- }
- obstack_ptr_grow (&dont_print_type_obstack, type);
- }
- printfi_filtered (spaces, "type node ");
- gdb_print_host_address (type, gdb_stdout);
- printf_filtered ("\n");
- printfi_filtered (spaces, "name '%s' (",
- TYPE_NAME (type) ? TYPE_NAME (type) : "<NULL>");
- gdb_print_host_address (TYPE_NAME (type), gdb_stdout);
- printf_filtered (")\n");
- printfi_filtered (spaces, "tagname '%s' (",
- TYPE_TAG_NAME (type) ? TYPE_TAG_NAME (type) : "<NULL>");
- gdb_print_host_address (TYPE_TAG_NAME (type), gdb_stdout);
- printf_filtered (")\n");
- printfi_filtered (spaces, "code 0x%x ", TYPE_CODE (type));
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_UNDEF:
- printf_filtered ("(TYPE_CODE_UNDEF)");
- break;
- case TYPE_CODE_PTR:
- printf_filtered ("(TYPE_CODE_PTR)");
- break;
- case TYPE_CODE_ARRAY:
- printf_filtered ("(TYPE_CODE_ARRAY)");
- break;
- case TYPE_CODE_STRUCT:
- printf_filtered ("(TYPE_CODE_STRUCT)");
- break;
- case TYPE_CODE_UNION:
- printf_filtered ("(TYPE_CODE_UNION)");
- break;
- case TYPE_CODE_ENUM:
- printf_filtered ("(TYPE_CODE_ENUM)");
- break;
- case TYPE_CODE_FLAGS:
- printf_filtered ("(TYPE_CODE_FLAGS)");
- break;
- case TYPE_CODE_FUNC:
- printf_filtered ("(TYPE_CODE_FUNC)");
- break;
- case TYPE_CODE_INT:
- printf_filtered ("(TYPE_CODE_INT)");
- break;
- case TYPE_CODE_FLT:
- printf_filtered ("(TYPE_CODE_FLT)");
- break;
- case TYPE_CODE_VOID:
- printf_filtered ("(TYPE_CODE_VOID)");
- break;
- case TYPE_CODE_SET:
- printf_filtered ("(TYPE_CODE_SET)");
- break;
- case TYPE_CODE_RANGE:
- printf_filtered ("(TYPE_CODE_RANGE)");
- break;
- case TYPE_CODE_STRING:
- printf_filtered ("(TYPE_CODE_STRING)");
- break;
- case TYPE_CODE_ERROR:
- printf_filtered ("(TYPE_CODE_ERROR)");
- break;
- case TYPE_CODE_MEMBERPTR:
- printf_filtered ("(TYPE_CODE_MEMBERPTR)");
- break;
- case TYPE_CODE_METHODPTR:
- printf_filtered ("(TYPE_CODE_METHODPTR)");
- break;
- case TYPE_CODE_METHOD:
- printf_filtered ("(TYPE_CODE_METHOD)");
- break;
- case TYPE_CODE_REF:
- printf_filtered ("(TYPE_CODE_REF)");
- break;
- case TYPE_CODE_CHAR:
- printf_filtered ("(TYPE_CODE_CHAR)");
- break;
- case TYPE_CODE_BOOL:
- printf_filtered ("(TYPE_CODE_BOOL)");
- break;
- case TYPE_CODE_COMPLEX:
- printf_filtered ("(TYPE_CODE_COMPLEX)");
- break;
- case TYPE_CODE_TYPEDEF:
- printf_filtered ("(TYPE_CODE_TYPEDEF)");
- break;
- case TYPE_CODE_NAMESPACE:
- printf_filtered ("(TYPE_CODE_NAMESPACE)");
- break;
- default:
- printf_filtered ("(UNKNOWN TYPE CODE)");
- break;
- }
- puts_filtered ("\n");
- printfi_filtered (spaces, "length %d\n", TYPE_LENGTH (type));
- if (TYPE_OBJFILE_OWNED (type))
- {
- printfi_filtered (spaces, "objfile ");
- gdb_print_host_address (TYPE_OWNER (type).objfile, gdb_stdout);
- }
- else
- {
- printfi_filtered (spaces, "gdbarch ");
- gdb_print_host_address (TYPE_OWNER (type).gdbarch, gdb_stdout);
- }
- printf_filtered ("\n");
- printfi_filtered (spaces, "target_type ");
- gdb_print_host_address (TYPE_TARGET_TYPE (type), gdb_stdout);
- printf_filtered ("\n");
- if (TYPE_TARGET_TYPE (type) != NULL)
- {
- recursive_dump_type (TYPE_TARGET_TYPE (type), spaces + 2);
- }
- printfi_filtered (spaces, "pointer_type ");
- gdb_print_host_address (TYPE_POINTER_TYPE (type), gdb_stdout);
- printf_filtered ("\n");
- printfi_filtered (spaces, "reference_type ");
- gdb_print_host_address (TYPE_REFERENCE_TYPE (type), gdb_stdout);
- printf_filtered ("\n");
- 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");
- }
- if (TYPE_RESTRICT (type))
- {
- puts_filtered (" TYPE_FLAG_RESTRICT");
- }
- puts_filtered ("\n");
- printfi_filtered (spaces, "flags");
- if (TYPE_UNSIGNED (type))
- {
- puts_filtered (" TYPE_FLAG_UNSIGNED");
- }
- if (TYPE_NOSIGN (type))
- {
- puts_filtered (" TYPE_FLAG_NOSIGN");
- }
- if (TYPE_STUB (type))
- {
- puts_filtered (" TYPE_FLAG_STUB");
- }
- if (TYPE_TARGET_STUB (type))
- {
- puts_filtered (" TYPE_FLAG_TARGET_STUB");
- }
- if (TYPE_STATIC (type))
- {
- puts_filtered (" TYPE_FLAG_STATIC");
- }
- if (TYPE_PROTOTYPED (type))
- {
- puts_filtered (" TYPE_FLAG_PROTOTYPED");
- }
- if (TYPE_INCOMPLETE (type))
- {
- puts_filtered (" TYPE_FLAG_INCOMPLETE");
- }
- if (TYPE_VARARGS (type))
- {
- puts_filtered (" TYPE_FLAG_VARARGS");
- }
-
- if (TYPE_VECTOR (type))
- {
- puts_filtered (" TYPE_FLAG_VECTOR");
- }
- if (TYPE_FIXED_INSTANCE (type))
- {
- puts_filtered (" TYPE_FIXED_INSTANCE");
- }
- if (TYPE_STUB_SUPPORTED (type))
- {
- puts_filtered (" TYPE_STUB_SUPPORTED");
- }
- if (TYPE_NOTTEXT (type))
- {
- puts_filtered (" TYPE_NOTTEXT");
- }
- puts_filtered ("\n");
- printfi_filtered (spaces, "nfields %d ", TYPE_NFIELDS (type));
- gdb_print_host_address (TYPE_FIELDS (type), gdb_stdout);
- puts_filtered ("\n");
- for (idx = 0; idx < TYPE_NFIELDS (type); idx++)
- {
- if (TYPE_CODE (type) == TYPE_CODE_ENUM)
- printfi_filtered (spaces + 2,
- "[%d] enumval %s type ",
- idx, plongest (TYPE_FIELD_ENUMVAL (type, idx)));
- else
- printfi_filtered (spaces + 2,
- "[%d] bitpos %d bitsize %d type ",
- idx, TYPE_FIELD_BITPOS (type, idx),
- TYPE_FIELD_BITSIZE (type, idx));
- gdb_print_host_address (TYPE_FIELD_TYPE (type, idx), gdb_stdout);
- printf_filtered (" name '%s' (",
- TYPE_FIELD_NAME (type, idx) != NULL
- ? TYPE_FIELD_NAME (type, idx)
- : "<NULL>");
- gdb_print_host_address (TYPE_FIELD_NAME (type, idx), gdb_stdout);
- printf_filtered (")\n");
- if (TYPE_FIELD_TYPE (type, idx) != NULL)
- {
- recursive_dump_type (TYPE_FIELD_TYPE (type, idx), spaces + 4);
- }
- }
- if (TYPE_CODE (type) == TYPE_CODE_RANGE)
- {
- printfi_filtered (spaces, "low %s%s high %s%s\n",
- plongest (TYPE_LOW_BOUND (type)),
- TYPE_LOW_BOUND_UNDEFINED (type) ? " (undefined)" : "",
- plongest (TYPE_HIGH_BOUND (type)),
- TYPE_HIGH_BOUND_UNDEFINED (type)
- ? " (undefined)" : "");
- }
- printfi_filtered (spaces, "vptr_basetype ");
- gdb_print_host_address (TYPE_VPTR_BASETYPE (type), gdb_stdout);
- puts_filtered ("\n");
- if (TYPE_VPTR_BASETYPE (type) != NULL)
- {
- recursive_dump_type (TYPE_VPTR_BASETYPE (type), spaces + 2);
- }
- printfi_filtered (spaces, "vptr_fieldno %d\n",
- TYPE_VPTR_FIELDNO (type));
- switch (TYPE_SPECIFIC_FIELD (type))
- {
- case TYPE_SPECIFIC_CPLUS_STUFF:
- printfi_filtered (spaces, "cplus_stuff ");
- gdb_print_host_address (TYPE_CPLUS_SPECIFIC (type),
- gdb_stdout);
- puts_filtered ("\n");
- print_cplus_stuff (type, spaces);
- break;
- case TYPE_SPECIFIC_GNAT_STUFF:
- printfi_filtered (spaces, "gnat_stuff ");
- gdb_print_host_address (TYPE_GNAT_SPECIFIC (type), gdb_stdout);
- puts_filtered ("\n");
- print_gnat_stuff (type, spaces);
- break;
- case TYPE_SPECIFIC_FLOATFORMAT:
- printfi_filtered (spaces, "floatformat ");
- if (TYPE_FLOATFORMAT (type) == NULL)
- puts_filtered ("(null)");
- else
- {
- puts_filtered ("{ ");
- if (TYPE_FLOATFORMAT (type)[0] == NULL
- || TYPE_FLOATFORMAT (type)[0]->name == NULL)
- puts_filtered ("(null)");
- else
- puts_filtered (TYPE_FLOATFORMAT (type)[0]->name);
- puts_filtered (", ");
- if (TYPE_FLOATFORMAT (type)[1] == NULL
- || TYPE_FLOATFORMAT (type)[1]->name == NULL)
- puts_filtered ("(null)");
- else
- puts_filtered (TYPE_FLOATFORMAT (type)[1]->name);
- puts_filtered (" }");
- }
- puts_filtered ("\n");
- break;
- case TYPE_SPECIFIC_FUNC:
- printfi_filtered (spaces, "calling_convention %d\n",
- TYPE_CALLING_CONVENTION (type));
-
- break;
- }
- if (spaces == 0)
- obstack_free (&dont_print_type_obstack, NULL);
- }
- struct type_pair
- {
- struct type *old, *new;
- };
- static hashval_t
- type_pair_hash (const void *item)
- {
- const struct type_pair *pair = item;
- return htab_hash_pointer (pair->old);
- }
- static int
- type_pair_eq (const void *item_lhs, const void *item_rhs)
- {
- const struct type_pair *lhs = item_lhs, *rhs = item_rhs;
- return lhs->old == rhs->old;
- }
- htab_t
- create_copied_types_hash (struct objfile *objfile)
- {
- return htab_create_alloc_ex (1, type_pair_hash, type_pair_eq,
- NULL, &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- struct type *
- copy_type_recursive (struct objfile *objfile,
- struct type *type,
- htab_t copied_types)
- {
- struct type_pair *stored, pair;
- void **slot;
- struct type *new_type;
- if (! TYPE_OBJFILE_OWNED (type))
- return type;
-
- gdb_assert (TYPE_OBJFILE (type) == objfile);
- pair.old = type;
- slot = htab_find_slot (copied_types, &pair, INSERT);
- if (*slot != NULL)
- return ((struct type_pair *) *slot)->new;
- new_type = alloc_type_arch (get_type_arch (type));
-
- stored
- = obstack_alloc (&objfile->objfile_obstack, sizeof (struct type_pair));
- stored->old = type;
- stored->new = new_type;
- *slot = stored;
-
- *TYPE_MAIN_TYPE (new_type) = *TYPE_MAIN_TYPE (type);
- TYPE_OBJFILE_OWNED (new_type) = 0;
- TYPE_OWNER (new_type).gdbarch = get_type_arch (type);
- if (TYPE_NAME (type))
- TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type));
- if (TYPE_TAG_NAME (type))
- TYPE_TAG_NAME (new_type) = xstrdup (TYPE_TAG_NAME (type));
- TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
- TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
-
- if (TYPE_NFIELDS (type))
- {
- int i, nfields;
- nfields = TYPE_NFIELDS (type);
- TYPE_FIELDS (new_type) = XCNEWVEC (struct field, nfields);
- for (i = 0; i < nfields; i++)
- {
- TYPE_FIELD_ARTIFICIAL (new_type, i) =
- TYPE_FIELD_ARTIFICIAL (type, i);
- TYPE_FIELD_BITSIZE (new_type, i) = TYPE_FIELD_BITSIZE (type, i);
- if (TYPE_FIELD_TYPE (type, i))
- TYPE_FIELD_TYPE (new_type, i)
- = copy_type_recursive (objfile, TYPE_FIELD_TYPE (type, i),
- copied_types);
- if (TYPE_FIELD_NAME (type, i))
- TYPE_FIELD_NAME (new_type, i) =
- xstrdup (TYPE_FIELD_NAME (type, i));
- switch (TYPE_FIELD_LOC_KIND (type, i))
- {
- case FIELD_LOC_KIND_BITPOS:
- SET_FIELD_BITPOS (TYPE_FIELD (new_type, i),
- TYPE_FIELD_BITPOS (type, i));
- break;
- case FIELD_LOC_KIND_ENUMVAL:
- SET_FIELD_ENUMVAL (TYPE_FIELD (new_type, i),
- TYPE_FIELD_ENUMVAL (type, i));
- break;
- case FIELD_LOC_KIND_PHYSADDR:
- SET_FIELD_PHYSADDR (TYPE_FIELD (new_type, i),
- TYPE_FIELD_STATIC_PHYSADDR (type, i));
- break;
- case FIELD_LOC_KIND_PHYSNAME:
- SET_FIELD_PHYSNAME (TYPE_FIELD (new_type, i),
- xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type,
- i)));
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("Unexpected type field location kind: %d"),
- TYPE_FIELD_LOC_KIND (type, i));
- }
- }
- }
-
- if (TYPE_CODE (type) == TYPE_CODE_RANGE)
- {
- TYPE_RANGE_DATA (new_type) = xmalloc (sizeof (struct range_bounds));
- *TYPE_RANGE_DATA (new_type) = *TYPE_RANGE_DATA (type);
- }
-
- if (TYPE_DATA_LOCATION (type) != NULL)
- {
- TYPE_DATA_LOCATION (new_type)
- = TYPE_ALLOC (new_type, sizeof (struct dynamic_prop));
- memcpy (TYPE_DATA_LOCATION (new_type), TYPE_DATA_LOCATION (type),
- sizeof (struct dynamic_prop));
- }
-
- if (TYPE_TARGET_TYPE (type))
- TYPE_TARGET_TYPE (new_type) =
- copy_type_recursive (objfile,
- TYPE_TARGET_TYPE (type),
- copied_types);
- if (TYPE_VPTR_BASETYPE (type))
- TYPE_VPTR_BASETYPE (new_type) =
- copy_type_recursive (objfile,
- TYPE_VPTR_BASETYPE (type),
- copied_types);
-
- if (TYPE_CODE (type) == TYPE_CODE_FLT)
- TYPE_FLOATFORMAT (new_type) = TYPE_FLOATFORMAT (type);
- else if (TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION
- || TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
- INIT_CPLUS_SPECIFIC (new_type);
- return new_type;
- }
- struct type *
- copy_type (const struct type *type)
- {
- struct type *new_type;
- gdb_assert (TYPE_OBJFILE_OWNED (type));
- new_type = alloc_type_copy (type);
- TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
- TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
- memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
- sizeof (struct main_type));
- if (TYPE_DATA_LOCATION (type) != NULL)
- {
- TYPE_DATA_LOCATION (new_type)
- = TYPE_ALLOC (new_type, sizeof (struct dynamic_prop));
- memcpy (TYPE_DATA_LOCATION (new_type), TYPE_DATA_LOCATION (type),
- sizeof (struct dynamic_prop));
- }
- return new_type;
- }
- struct type *
- arch_type (struct gdbarch *gdbarch,
- enum type_code code, int length, char *name)
- {
- struct type *type;
- type = alloc_type_arch (gdbarch);
- TYPE_CODE (type) = code;
- TYPE_LENGTH (type) = length;
- if (name)
- TYPE_NAME (type) = xstrdup (name);
- return type;
- }
- struct type *
- arch_integer_type (struct gdbarch *gdbarch,
- int bit, int unsigned_p, char *name)
- {
- struct type *t;
- t = arch_type (gdbarch, TYPE_CODE_INT, bit / TARGET_CHAR_BIT, name);
- if (unsigned_p)
- TYPE_UNSIGNED (t) = 1;
- if (name && strcmp (name, "char") == 0)
- TYPE_NOSIGN (t) = 1;
- return t;
- }
- struct type *
- arch_character_type (struct gdbarch *gdbarch,
- int bit, int unsigned_p, char *name)
- {
- struct type *t;
- t = arch_type (gdbarch, TYPE_CODE_CHAR, bit / TARGET_CHAR_BIT, name);
- if (unsigned_p)
- TYPE_UNSIGNED (t) = 1;
- return t;
- }
- struct type *
- arch_boolean_type (struct gdbarch *gdbarch,
- int bit, int unsigned_p, char *name)
- {
- struct type *t;
- t = arch_type (gdbarch, TYPE_CODE_BOOL, bit / TARGET_CHAR_BIT, name);
- if (unsigned_p)
- TYPE_UNSIGNED (t) = 1;
- return t;
- }
- struct type *
- arch_float_type (struct gdbarch *gdbarch,
- int bit, char *name, const struct floatformat **floatformats)
- {
- struct type *t;
- if (bit == -1)
- {
- gdb_assert (floatformats != NULL);
- gdb_assert (floatformats[0] != NULL && floatformats[1] != NULL);
- bit = floatformats[0]->totalsize;
- }
- gdb_assert (bit >= 0);
- t = arch_type (gdbarch, TYPE_CODE_FLT, bit / TARGET_CHAR_BIT, name);
- TYPE_FLOATFORMAT (t) = floatformats;
- return t;
- }
- struct type *
- arch_complex_type (struct gdbarch *gdbarch,
- char *name, struct type *target_type)
- {
- struct type *t;
- t = arch_type (gdbarch, TYPE_CODE_COMPLEX,
- 2 * TYPE_LENGTH (target_type), name);
- TYPE_TARGET_TYPE (t) = target_type;
- return t;
- }
- struct type *
- arch_flags_type (struct gdbarch *gdbarch, char *name, int length)
- {
- int nfields = length * TARGET_CHAR_BIT;
- struct type *type;
- type = arch_type (gdbarch, TYPE_CODE_FLAGS, length, name);
- TYPE_UNSIGNED (type) = 1;
- TYPE_NFIELDS (type) = nfields;
- TYPE_FIELDS (type) = TYPE_ZALLOC (type, nfields * sizeof (struct field));
- return type;
- }
- void
- append_flags_type_flag (struct type *type, int bitpos, char *name)
- {
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLAGS);
- gdb_assert (bitpos < TYPE_NFIELDS (type));
- gdb_assert (bitpos >= 0);
- if (name)
- {
- TYPE_FIELD_NAME (type, bitpos) = xstrdup (name);
- SET_FIELD_BITPOS (TYPE_FIELD (type, bitpos), bitpos);
- }
- else
- {
-
- SET_FIELD_BITPOS (TYPE_FIELD (type, bitpos), -1);
- }
- }
- struct type *
- arch_composite_type (struct gdbarch *gdbarch, char *name, enum type_code code)
- {
- struct type *t;
- gdb_assert (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION);
- t = arch_type (gdbarch, code, 0, NULL);
- TYPE_TAG_NAME (t) = name;
- INIT_CPLUS_SPECIFIC (t);
- return t;
- }
- struct field *
- append_composite_type_field_raw (struct type *t, char *name,
- struct type *field)
- {
- struct field *f;
- TYPE_NFIELDS (t) = TYPE_NFIELDS (t) + 1;
- TYPE_FIELDS (t) = xrealloc (TYPE_FIELDS (t),
- sizeof (struct field) * TYPE_NFIELDS (t));
- f = &(TYPE_FIELDS (t)[TYPE_NFIELDS (t) - 1]);
- memset (f, 0, sizeof f[0]);
- FIELD_TYPE (f[0]) = field;
- FIELD_NAME (f[0]) = name;
- return f;
- }
- void
- append_composite_type_field_aligned (struct type *t, char *name,
- struct type *field, int alignment)
- {
- struct field *f = append_composite_type_field_raw (t, name, field);
- if (TYPE_CODE (t) == TYPE_CODE_UNION)
- {
- if (TYPE_LENGTH (t) < TYPE_LENGTH (field))
- TYPE_LENGTH (t) = TYPE_LENGTH (field);
- }
- else if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
- {
- TYPE_LENGTH (t) = TYPE_LENGTH (t) + TYPE_LENGTH (field);
- if (TYPE_NFIELDS (t) > 1)
- {
- SET_FIELD_BITPOS (f[0],
- (FIELD_BITPOS (f[-1])
- + (TYPE_LENGTH (FIELD_TYPE (f[-1]))
- * TARGET_CHAR_BIT)));
- if (alignment)
- {
- int left;
- alignment *= TARGET_CHAR_BIT;
- left = FIELD_BITPOS (f[0]) % alignment;
- if (left)
- {
- SET_FIELD_BITPOS (f[0], FIELD_BITPOS (f[0]) + (alignment - left));
- TYPE_LENGTH (t) += (alignment - left) / TARGET_CHAR_BIT;
- }
- }
- }
- }
- }
- void
- append_composite_type_field (struct type *t, char *name,
- struct type *field)
- {
- append_composite_type_field_aligned (t, name, field, 0);
- }
- static struct gdbarch_data *gdbtypes_data;
- const struct builtin_type *
- builtin_type (struct gdbarch *gdbarch)
- {
- return gdbarch_data (gdbarch, gdbtypes_data);
- }
- static void *
- gdbtypes_post_init (struct gdbarch *gdbarch)
- {
- struct builtin_type *builtin_type
- = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_type);
-
- builtin_type->builtin_void
- = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void");
- builtin_type->builtin_char
- = arch_integer_type (gdbarch, TARGET_CHAR_BIT,
- !gdbarch_char_signed (gdbarch), "char");
- builtin_type->builtin_signed_char
- = arch_integer_type (gdbarch, TARGET_CHAR_BIT,
- 0, "signed char");
- builtin_type->builtin_unsigned_char
- = arch_integer_type (gdbarch, TARGET_CHAR_BIT,
- 1, "unsigned char");
- builtin_type->builtin_short
- = arch_integer_type (gdbarch, gdbarch_short_bit (gdbarch),
- 0, "short");
- builtin_type->builtin_unsigned_short
- = arch_integer_type (gdbarch, gdbarch_short_bit (gdbarch),
- 1, "unsigned short");
- builtin_type->builtin_int
- = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
- 0, "int");
- builtin_type->builtin_unsigned_int
- = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
- 1, "unsigned int");
- builtin_type->builtin_long
- = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
- 0, "long");
- builtin_type->builtin_unsigned_long
- = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
- 1, "unsigned long");
- builtin_type->builtin_long_long
- = arch_integer_type (gdbarch, gdbarch_long_long_bit (gdbarch),
- 0, "long long");
- builtin_type->builtin_unsigned_long_long
- = arch_integer_type (gdbarch, gdbarch_long_long_bit (gdbarch),
- 1, "unsigned long long");
- builtin_type->builtin_float
- = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch),
- "float", gdbarch_float_format (gdbarch));
- builtin_type->builtin_double
- = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
- "double", gdbarch_double_format (gdbarch));
- builtin_type->builtin_long_double
- = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
- "long double", gdbarch_long_double_format (gdbarch));
- builtin_type->builtin_complex
- = arch_complex_type (gdbarch, "complex",
- builtin_type->builtin_float);
- builtin_type->builtin_double_complex
- = arch_complex_type (gdbarch, "double complex",
- builtin_type->builtin_double);
- builtin_type->builtin_string
- = arch_type (gdbarch, TYPE_CODE_STRING, 1, "string");
- builtin_type->builtin_bool
- = arch_type (gdbarch, TYPE_CODE_BOOL, 1, "bool");
-
- builtin_type->builtin_decfloat
- = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 32 / 8, "_Decimal32");
- builtin_type->builtin_decdouble
- = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 64 / 8, "_Decimal64");
- builtin_type->builtin_declong
- = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 128 / 8, "_Decimal128");
-
- builtin_type->builtin_true_char
- = arch_character_type (gdbarch, TARGET_CHAR_BIT, 0, "true character");
- builtin_type->builtin_true_unsigned_char
- = arch_character_type (gdbarch, TARGET_CHAR_BIT, 1, "true character");
-
- builtin_type->builtin_int0
- = arch_integer_type (gdbarch, 0, 0, "int0_t");
- builtin_type->builtin_int8
- = arch_integer_type (gdbarch, 8, 0, "int8_t");
- builtin_type->builtin_uint8
- = arch_integer_type (gdbarch, 8, 1, "uint8_t");
- builtin_type->builtin_int16
- = arch_integer_type (gdbarch, 16, 0, "int16_t");
- builtin_type->builtin_uint16
- = arch_integer_type (gdbarch, 16, 1, "uint16_t");
- builtin_type->builtin_int32
- = arch_integer_type (gdbarch, 32, 0, "int32_t");
- builtin_type->builtin_uint32
- = arch_integer_type (gdbarch, 32, 1, "uint32_t");
- builtin_type->builtin_int64
- = arch_integer_type (gdbarch, 64, 0, "int64_t");
- builtin_type->builtin_uint64
- = arch_integer_type (gdbarch, 64, 1, "uint64_t");
- builtin_type->builtin_int128
- = arch_integer_type (gdbarch, 128, 0, "int128_t");
- builtin_type->builtin_uint128
- = arch_integer_type (gdbarch, 128, 1, "uint128_t");
- TYPE_INSTANCE_FLAGS (builtin_type->builtin_int8) |=
- TYPE_INSTANCE_FLAG_NOTTEXT;
- TYPE_INSTANCE_FLAGS (builtin_type->builtin_uint8) |=
- TYPE_INSTANCE_FLAG_NOTTEXT;
-
- builtin_type->builtin_char16
- = arch_integer_type (gdbarch, 16, 0, "char16_t");
- builtin_type->builtin_char32
- = arch_integer_type (gdbarch, 32, 0, "char32_t");
-
- builtin_type->builtin_data_ptr
- = lookup_pointer_type (builtin_type->builtin_void);
- builtin_type->builtin_func_ptr
- = lookup_pointer_type (lookup_function_type (builtin_type->builtin_void));
- builtin_type->builtin_func_func
- = lookup_function_type (builtin_type->builtin_func_ptr);
-
- builtin_type->internal_fn
- = arch_type (gdbarch, TYPE_CODE_INTERNAL_FUNCTION, 0,
- "<internal function>");
-
- builtin_type->xmethod
- = arch_type (gdbarch, TYPE_CODE_XMETHOD, 0, "<xmethod>");
- return builtin_type;
- }
- static const struct objfile_data *objfile_type_data;
- const struct objfile_type *
- objfile_type (struct objfile *objfile)
- {
- struct gdbarch *gdbarch;
- struct objfile_type *objfile_type
- = objfile_data (objfile, objfile_type_data);
- if (objfile_type)
- return objfile_type;
- objfile_type = OBSTACK_CALLOC (&objfile->objfile_obstack,
- 1, struct objfile_type);
-
- gdbarch = get_objfile_arch (objfile);
-
- objfile_type->builtin_void
- = init_type (TYPE_CODE_VOID, 1,
- 0,
- "void", objfile);
- objfile_type->builtin_char
- = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- (TYPE_FLAG_NOSIGN
- | (gdbarch_char_signed (gdbarch) ? 0 : TYPE_FLAG_UNSIGNED)),
- "char", objfile);
- objfile_type->builtin_signed_char
- = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- 0,
- "signed char", objfile);
- objfile_type->builtin_unsigned_char
- = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED,
- "unsigned char", objfile);
- objfile_type->builtin_short
- = init_type (TYPE_CODE_INT,
- gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "short", objfile);
- objfile_type->builtin_unsigned_short
- = init_type (TYPE_CODE_INT,
- gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
- objfile_type->builtin_int
- = init_type (TYPE_CODE_INT,
- gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "int", objfile);
- objfile_type->builtin_unsigned_int
- = init_type (TYPE_CODE_INT,
- gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
- objfile_type->builtin_long
- = init_type (TYPE_CODE_INT,
- gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "long", objfile);
- objfile_type->builtin_unsigned_long
- = init_type (TYPE_CODE_INT,
- gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
- objfile_type->builtin_long_long
- = init_type (TYPE_CODE_INT,
- gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "long long", objfile);
- objfile_type->builtin_unsigned_long_long
- = init_type (TYPE_CODE_INT,
- gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
- objfile_type->builtin_float
- = init_type (TYPE_CODE_FLT,
- gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "float", objfile);
- TYPE_FLOATFORMAT (objfile_type->builtin_float)
- = gdbarch_float_format (gdbarch);
- objfile_type->builtin_double
- = init_type (TYPE_CODE_FLT,
- gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "double", objfile);
- TYPE_FLOATFORMAT (objfile_type->builtin_double)
- = gdbarch_double_format (gdbarch);
- objfile_type->builtin_long_double
- = init_type (TYPE_CODE_FLT,
- gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "long double", objfile);
- TYPE_FLOATFORMAT (objfile_type->builtin_long_double)
- = gdbarch_long_double_format (gdbarch);
-
- objfile_type->builtin_error
- = init_type (TYPE_CODE_ERROR, 0, 0, "<unknown type>", objfile);
-
- objfile_type->nodebug_text_symbol
- = init_type (TYPE_CODE_FUNC, 1, 0,
- "<text variable, no debug info>", objfile);
- TYPE_TARGET_TYPE (objfile_type->nodebug_text_symbol)
- = objfile_type->builtin_int;
- objfile_type->nodebug_text_gnu_ifunc_symbol
- = init_type (TYPE_CODE_FUNC, 1, TYPE_FLAG_GNU_IFUNC,
- "<text gnu-indirect-function variable, no debug info>",
- objfile);
- TYPE_TARGET_TYPE (objfile_type->nodebug_text_gnu_ifunc_symbol)
- = objfile_type->nodebug_text_symbol;
- objfile_type->nodebug_got_plt_symbol
- = init_type (TYPE_CODE_PTR, gdbarch_addr_bit (gdbarch) / 8, 0,
- "<text from jump slot in .got.plt, no debug info>",
- objfile);
- TYPE_TARGET_TYPE (objfile_type->nodebug_got_plt_symbol)
- = objfile_type->nodebug_text_symbol;
- objfile_type->nodebug_data_symbol
- = init_type (TYPE_CODE_INT,
- gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
- "<data variable, no debug info>", objfile);
- objfile_type->nodebug_unknown_symbol
- = init_type (TYPE_CODE_INT, 1, 0,
- "<variable (not text or data), no debug info>", objfile);
- objfile_type->nodebug_tls_symbol
- = init_type (TYPE_CODE_INT,
- gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
- "<thread local variable, no debug info>", objfile);
-
- objfile_type->builtin_core_addr
- = init_type (TYPE_CODE_INT,
- gdbarch_addr_bit (gdbarch) / 8,
- TYPE_FLAG_UNSIGNED, "__CORE_ADDR", objfile);
- set_objfile_data (objfile, objfile_type_data, objfile_type);
- return objfile_type;
- }
- extern initialize_file_ftype _initialize_gdbtypes;
- void
- _initialize_gdbtypes (void)
- {
- gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
- objfile_type_data = register_objfile_data ();
- 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_setshow_boolean_cmd ("opaque-type-resolution", class_support,
- &opaque_type_resolution,
- _("Set resolution of opaque struct/class/union"
- " types (if set before loading symbols)."),
- _("Show resolution of opaque struct/class/union"
- " types (if set before loading symbols)."),
- NULL, NULL,
- show_opaque_type_resolution,
- &setlist, &showlist);
-
- 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);
- }