X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbtypes.h;h=74498435822a9b5320e60fe3a234abb8f61010b4;hb=07b76c2f0baf197ce44d66a153184d33047e7ba0;hp=32b58dcc6186703ef588e1b8100f3741dbdae4a6;hpb=2fabdf3381dfc4bc89f6339c3db3e4bfe7ca8b14;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 32b58dcc61..7449843582 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,7 @@ /* Internal type definitions for GDB. - Copyright (C) 1992-2018 Free Software Foundation, Inc. + Copyright (C) 1992-2020 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -45,11 +45,12 @@ */ #include "hashtab.h" -#include "common/offset-type.h" -#include "common/enum-flags.h" -#include "common/underlying.h" -#include "common/print-utils.h" -#include "gdbarch.h" +#include "gdbsupport/array-view.h" +#include "gdbsupport/offset-type.h" +#include "gdbsupport/enum-flags.h" +#include "gdbsupport/underlying.h" +#include "gdbsupport/print-utils.h" +#include "dwarf2.h" /* Forward declarations for prototypes. */ struct field; @@ -193,7 +194,7 @@ enum type_code /* * Some bits for the type's instance_flags word. See the macros below for documentation on each bit. */ -enum type_instance_flag_value +enum type_instance_flag_value : unsigned { TYPE_INSTANCE_FLAG_CONST = (1 << 0), TYPE_INSTANCE_FLAG_VOLATILE = (1 << 1), @@ -219,6 +220,12 @@ DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); #define TYPE_NOSIGN(t) (TYPE_MAIN_TYPE (t)->flag_nosign) +/* * A compiler may supply dwarf instrumentation + that indicates the desired endian interpretation of the variable + differs from the native endian representation. */ + +#define TYPE_ENDIANITY_NOT_DEFAULT(t) (TYPE_MAIN_TYPE (t)->flag_endianity_not_default) + /* * This appears in a type's flags word if it is a stub type (e.g., if someone referenced a type that wasn't defined in a source file via (struct sir_not_appearing_in_this_film *)). */ @@ -292,7 +299,7 @@ DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); #define TYPE_GNU_IFUNC(t) (TYPE_MAIN_TYPE (t)->flag_gnu_ifunc) /* * Type owner. If TYPE_OBJFILE_OWNED is true, the type is owned by - the objfile retrieved as TYPE_OBJFILE. Otherweise, the type is + the objfile retrieved as TYPE_OBJFILE. Otherwise, the type is owned by an architecture; TYPE_OBJFILE is NULL in this case. */ #define TYPE_OBJFILE_OWNED(t) (TYPE_MAIN_TYPE (t)->flag_objfile_owned) @@ -349,6 +356,10 @@ DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); #define TYPE_IS_REFERENCE(t) \ (TYPE_CODE (t) == TYPE_CODE_REF || TYPE_CODE (t) == TYPE_CODE_RVALUE_REF) +/* * True if this type is allocatable. */ +#define TYPE_IS_ALLOCATABLE(t) \ + (get_dyn_prop (DYN_PROP_ALLOCATED, t) != NULL) + /* * Instruction-space delimited type. This is for Harvard architectures which have separate instruction and data address spaces (and perhaps others). @@ -542,10 +553,9 @@ union type_owner union field_location { /* * Position of this field, counting in bits from start of - containing structure. For gdbarch_bits_big_endian=1 - targets, it is the bit offset to the MSB. For - gdbarch_bits_big_endian=0 targets, it is the bit offset to - the LSB. */ + containing structure. For big-endian targets, it is the bit + offset to the MSB. For little-endian targets, it is the bit + offset to the LSB. */ LONGEST bitpos; @@ -613,15 +623,31 @@ struct range_bounds struct dynamic_prop high; + /* The stride value for this range. This can be stored in bits or bytes + based on the value of BYTE_STRIDE_P. It is optional to have a stride + value, if this range has no stride value defined then this will be set + to the constant zero. */ + + struct dynamic_prop stride; + + /* * The bias. Sometimes a range value is biased before storage. + The bias is added to the stored bits to form the true value. */ + + LONGEST bias; + /* True if HIGH range bound contains the number of elements in the - subrange. This affects how the final hight bound is computed. */ + subrange. This affects how the final high bound is computed. */ - int flag_upper_bound_is_count : 1; + unsigned int flag_upper_bound_is_count : 1; /* True if LOW or/and HIGH are resolved into a static bound from a dynamic one. */ - int flag_bound_evaluated : 1; + unsigned int flag_bound_evaluated : 1; + + /* If this is true this STRIDE is in bytes, otherwise STRIDE is in bits. */ + + unsigned int flag_is_byte_stride : 1; }; /* Compare two range_bounds objects for equality. Simply does @@ -692,6 +718,7 @@ struct main_type unsigned int flag_gnu_ifunc : 1; unsigned int flag_fixed_instance : 1; unsigned int flag_objfile_owned : 1; + unsigned int flag_endianity_not_default : 1; /* * True if this type was declared with "class" rather than "struct". */ @@ -858,7 +885,7 @@ struct type type_length_units function should be used in order to get the length expressed in target addressable memory units. */ - unsigned int length; + ULONGEST length; /* * Core type, shared by a group of qualified types. */ @@ -931,9 +958,18 @@ struct fn_field unsigned int is_constructor : 1; + /* * True if this function is deleted, false otherwise. */ + + unsigned int is_deleted : 1; + + /* * DW_AT_defaulted attribute for this function. The value is one + of the DW_DEFAULTED constants. */ + + ENUM_BITFIELD (dwarf_defaulted_attribute) defaulted : 2; + /* * Unused. */ - unsigned int dummy:9; + unsigned int dummy:6; /* * Index into that baseclass's virtual function table, minus 2; else if static: VOFFSET_STATIC; else: 0. */ @@ -1007,6 +1043,12 @@ struct cplus_struct_type int is_dynamic : 2; + /* * The calling convention for this type, fetched from the + DW_AT_calling_convention attribute. The value is one of the + DW_CC constants. */ + + ENUM_BITFIELD (dwarf_calling_convention) calling_convention : 8; + /* * The base class which defined the virtual function table pointer. */ struct type *vptr_basetype; @@ -1094,13 +1136,9 @@ struct rank short subrank; }; -/* * Struct used for ranking a function for overload resolution. */ +/* * Used for ranking a function for overload resolution. */ -struct badness_vector - { - int length; - struct rank *rank; - }; +typedef std::vector badness_vector; /* * GNAT Ada-specific information for various Ada types. */ @@ -1119,9 +1157,9 @@ struct func_type /* * The calling convention for targets supporting multiple ABIs. Right now this is only fetched from the Dwarf-2 DW_AT_calling_convention attribute. The value is one of the - DW_CC enum dwarf_calling_convention constants. */ + DW_CC constants. */ - unsigned calling_convention : 8; + ENUM_BITFIELD (dwarf_calling_convention) calling_convention : 8; /* * Whether this function normally returns to its caller. It is set from the DW_AT_noreturn attribute if set on the @@ -1258,6 +1296,10 @@ extern void allocate_cplus_struct_type (struct type *); (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_CPLUS_STUFF \ && TYPE_RAW_CPLUS_SPECIFIC (type) != &cplus_struct_default) +#define INIT_NONE_SPECIFIC(type) \ + (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_NONE, \ + TYPE_MAIN_TYPE (type)->type_specific = {}) + extern const struct gnat_aux_type gnat_aux_default; extern void allocate_gnat_aux_type (struct type *); @@ -1271,6 +1313,12 @@ extern void allocate_gnat_aux_type (struct type *); #define HAVE_GNAT_AUX_INFO(type) \ (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_GNAT_STUFF) +/* * True if TYPE is known to be an Ada type of some kind. */ +#define ADA_TYPE_P(type) \ + (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_GNAT_STUFF \ + || (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_NONE \ + && TYPE_FIXED_INSTANCE (type))) + #define INIT_FUNC_SPECIFIC(type) \ (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FUNC, \ TYPE_MAIN_TYPE (type)->type_specific.func_stuff = (struct func_type *) \ @@ -1330,6 +1378,9 @@ extern bool set_type_align (struct type *, ULONGEST); TYPE_RANGE_DATA(range_type)->high.kind #define TYPE_LOW_BOUND_KIND(range_type) \ TYPE_RANGE_DATA(range_type)->low.kind +#define TYPE_BIT_STRIDE(range_type) \ + (TYPE_RANGE_DATA(range_type)->stride.data.const_val \ + * (TYPE_RANGE_DATA(range_type)->flag_is_byte_stride ? 8 : 1)) /* Property accessors for the type data location. */ #define TYPE_DATA_LOCATION(thistype) \ @@ -1358,7 +1409,8 @@ extern bool set_type_align (struct type *, ULONGEST); dynprop->kind -/* Moto-specific stuff for FORTRAN arrays. */ +/* Accessors for struct range_bounds data attached to an array type's + index type. */ #define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ TYPE_HIGH_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) @@ -1371,6 +1423,9 @@ extern bool set_type_align (struct type *, ULONGEST); #define TYPE_ARRAY_LOWER_BOUND_VALUE(arraytype) \ (TYPE_LOW_BOUND(TYPE_INDEX_TYPE((arraytype)))) +#define TYPE_ARRAY_BIT_STRIDE(arraytype) \ + (TYPE_BIT_STRIDE(TYPE_INDEX_TYPE((arraytype)))) + /* C++ */ #define TYPE_SELF_TYPE(thistype) internal_type_self_type (thistype) @@ -1398,6 +1453,8 @@ extern void set_type_vptr_basetype (struct type *, struct type *); ? (struct cplus_struct_type*)&cplus_struct_default \ : TYPE_RAW_CPLUS_SPECIFIC(thistype)) #define TYPE_RAW_CPLUS_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.cplus_stuff +#define TYPE_CPLUS_CALLING_CONVENTION(thistype) \ + TYPE_MAIN_TYPE(thistype)->type_specific.cplus_stuff->calling_convention #define TYPE_FLOATFORMAT(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.floatformat #define TYPE_GNAT_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.gnat_stuff #define TYPE_DESCRIPTIVE_TYPE(thistype) TYPE_GNAT_SPECIFIC(thistype)->descriptive_type @@ -1514,6 +1571,8 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define TYPE_FN_FIELD_VOFFSET(thisfn, n) ((thisfn)[n].voffset-2) #define TYPE_FN_FIELD_VIRTUAL_P(thisfn, n) ((thisfn)[n].voffset > 1) #define TYPE_FN_FIELD_STATIC_P(thisfn, n) ((thisfn)[n].voffset == VOFFSET_STATIC) +#define TYPE_FN_FIELD_DEFAULTED(thisfn, n) ((thisfn)[n].defaulted) +#define TYPE_FN_FIELD_DELETED(thisfn, n) ((thisfn)[n].is_deleted) /* Accessors for typedefs defined by a class. */ #define TYPE_TYPEDEF_FIELD_ARRAY(thistype) \ @@ -1584,6 +1643,7 @@ struct builtin_type struct type *builtin_unsigned_short; struct type *builtin_unsigned_int; struct type *builtin_unsigned_long; + struct type *builtin_half; struct type *builtin_float; struct type *builtin_double; struct type *builtin_long_double; @@ -1679,6 +1739,7 @@ struct objfile_type struct type *builtin_unsigned_int; struct type *builtin_unsigned_long; struct type *builtin_unsigned_long_long; + struct type *builtin_half; struct type *builtin_float; struct type *builtin_double; struct type *builtin_long_double; @@ -1779,7 +1840,8 @@ extern struct type *init_character_type (struct objfile *, int, int, extern struct type *init_boolean_type (struct objfile *, int, int, const char *); extern struct type *init_float_type (struct objfile *, int, const char *, - const struct floatformat **); + const struct floatformat **, + enum bfd_endian = BFD_ENDIAN_UNKNOWN); extern struct type *init_decfloat_type (struct objfile *, int, const char *); extern struct type *init_complex_type (struct objfile *, const char *, struct type *); @@ -1852,7 +1914,7 @@ extern struct type *make_atomic_type (struct type *); extern void replace_type (struct type *, struct type *); -extern int address_space_name_to_int (struct gdbarch *, char *); +extern int address_space_name_to_int (struct gdbarch *, const char *); extern const char *address_space_int_to_name (struct gdbarch *, int); @@ -1876,6 +1938,44 @@ extern struct type *allocate_stub_method (struct type *); extern const char *type_name_or_error (struct type *type); +struct struct_elt +{ + /* The field of the element, or NULL if no element was found. */ + struct field *field; + + /* The bit offset of the element in the parent structure. */ + LONGEST offset; +}; + +/* Given a type TYPE, lookup the field and offset of the component named + NAME. + + TYPE can be either a struct or union, or a pointer or reference to + a struct or union. If it is a pointer or reference, its target + type is automatically used. Thus '.' and '->' are interchangable, + as specified for the definitions of the expression element types + STRUCTOP_STRUCT and STRUCTOP_PTR. + + If NOERR is nonzero, the returned structure will have field set to + NULL if there is no component named NAME. + + If the component NAME is a field in an anonymous substructure of + TYPE, the returned offset is a "global" offset relative to TYPE + rather than an offset within the substructure. */ + +extern struct_elt lookup_struct_elt (struct type *, const char *, int); + +/* Given a type TYPE, lookup the type of the component named NAME. + + TYPE can be either a struct or union, or a pointer or reference to + a struct or union. If it is a pointer or reference, its target + type is automatically used. Thus '.' and '->' are interchangable, + as specified for the definitions of the expression element types + STRUCTOP_STRUCT and STRUCTOP_PTR. + + If NOERR is nonzero, return NULL if there is no component named + NAME. */ + extern struct type *lookup_struct_elt_type (struct type *, const char *, int); extern struct type *make_pointer_type (struct type *, struct type **); @@ -1900,7 +2000,18 @@ extern struct type *create_array_type_with_stride extern struct type *create_range_type (struct type *, struct type *, const struct dynamic_prop *, - const struct dynamic_prop *); + const struct dynamic_prop *, + LONGEST); + +/* Like CREATE_RANGE_TYPE but also sets up a stride. When BYTE_STRIDE_P + is true the value in STRIDE is a byte stride, otherwise STRIDE is a bit + stride. */ + +extern struct type * create_range_type_with_stride + (struct type *result_type, struct type *index_type, + const struct dynamic_prop *low_bound, + const struct dynamic_prop *high_bound, LONGEST bias, + const struct dynamic_prop *stride, bool byte_stride_p); extern struct type *create_array_type (struct type *, struct type *, struct type *); @@ -1914,10 +2025,10 @@ extern struct type *lookup_string_range_type (struct type *, LONGEST, LONGEST); extern struct type *create_set_type (struct type *, struct type *); extern struct type *lookup_unsigned_typename (const struct language_defn *, - struct gdbarch *, const char *); + const char *); extern struct type *lookup_signed_typename (const struct language_defn *, - struct gdbarch *, const char *); + const char *); extern void get_unsigned_type_max (struct type *, ULONGEST *); @@ -1957,10 +2068,9 @@ extern void check_stub_method_group (struct type *, int); extern char *gdb_mangle_name (struct type *, int, int); extern struct type *lookup_typename (const struct language_defn *, - struct gdbarch *, const char *, - const struct block *, int); + const char *, const struct block *, int); -extern struct type *lookup_template_type (char *, struct type *, +extern struct type *lookup_template_type (const char *, struct type *, const struct block *); extern int get_vptr_fieldno (struct type *, struct type **); @@ -1982,8 +2092,6 @@ extern int is_unique_ancestor (struct type *, struct value *); /* Overload resolution */ -#define LENGTH_MATCH(bv) ((bv)->rank[0]) - /* * Badness if parameter list length doesn't match arg list length. */ extern const struct rank LENGTH_MISMATCH_BADNESS; @@ -2017,6 +2125,7 @@ extern const struct rank BASE_CONVERSION_BADNESS; /* * Badness of converting from non-reference to reference. Subrank is the type of reference conversion being done. */ extern const struct rank REFERENCE_CONVERSION_BADNESS; +extern const struct rank REFERENCE_SEE_THROUGH_BADNESS; /* * Conversion to rvalue reference. */ #define REFERENCE_CONVERSION_RVALUE 1 /* * Conversion to const lvalue reference. */ @@ -2042,10 +2151,11 @@ extern const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS; extern struct rank sum_ranks (struct rank a, struct rank b); extern int compare_ranks (struct rank a, struct rank b); -extern int compare_badness (struct badness_vector *, struct badness_vector *); +extern int compare_badness (const badness_vector &, + const badness_vector &); -extern struct badness_vector *rank_function (struct type **, int, - struct value **, int); +extern badness_vector rank_function (gdb::array_view parms, + gdb::array_view args); extern struct rank rank_one_type (struct type *, struct type *, struct value *); @@ -2090,4 +2200,15 @@ extern int type_not_allocated (const struct type *type); extern int type_not_associated (const struct type *type); +/* * When the type includes explicit byte ordering, return that. + Otherwise, the byte ordering from gdbarch_byte_order for + get_type_arch is returned. */ + +extern enum bfd_endian type_byte_order (const struct type *type); + +/* A flag to enable printing of debugging information of C++ + overloading. */ + +extern unsigned int overload_debug; + #endif /* GDBTYPES_H */