X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbtypes.h;h=14059ab3dc55e3cbc96333168dbb4de0756e8a6e;hb=e99b03dcf42606425eab8bd12eadb8aa4007f35a;hp=7d107fae8236374e7f3b7f28583bbb9f3972b7fd;hpb=f9aeb8d499fa12610610dc19618230304c698f6c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 7d107fae82..14059ab3dc 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,7 @@ /* Internal type definitions for GDB. - Copyright (C) 1992-2017 Free Software Foundation, Inc. + Copyright (C) 1992-2018 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -45,6 +45,10 @@ */ #include "hashtab.h" +#include "common/offset-type.h" +#include "common/enum-flags.h" +#include "common/underlying.h" +#include "common/print-utils.h" /* Forward declarations for prototypes. */ struct field; @@ -57,18 +61,17 @@ struct language_defn; /* * Offset relative to the start of its containing CU (compilation unit). */ -typedef struct -{ - unsigned int cu_off; -} cu_offset; +DEFINE_OFFSET_TYPE (cu_offset, unsigned int); /* * Offset relative to the start of its .debug_info or .debug_types section. */ +DEFINE_OFFSET_TYPE (sect_offset, uint64_t); -typedef struct +static inline char * +sect_offset_str (sect_offset offset) { - unsigned int sect_off; -} sect_offset; + return hex_string (to_underlying (offset)); +} /* Some macros for char-based bitfields. */ @@ -202,6 +205,8 @@ enum type_instance_flag_value TYPE_INSTANCE_FLAG_ATOMIC = (1 << 8) }; +DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); + /* * Unsigned integer type. If this is not set for a TYPE_CODE_INT, the type is signed (unless TYPE_NOSIGN (below) is set). */ @@ -227,13 +232,6 @@ enum type_instance_flag_value #define TYPE_TARGET_STUB(t) (TYPE_MAIN_TYPE (t)->flag_target_stub) -/* * Static type. If this is set, the corresponding type had - a static modifier. - Note: This may be unnecessary, since static data members - are indicated by other means (bitpos == -1). */ - -#define TYPE_STATIC(t) (TYPE_MAIN_TYPE (t)->flag_static) - /* * This is a function type which appears to have a prototype. We need this for function calls in order to tell us if it's necessary to coerce the args, or to just do the standard conversions. This @@ -314,28 +312,36 @@ enum type_instance_flag_value #define TYPE_FLAG_ENUM(t) (TYPE_MAIN_TYPE (t)->flag_flag_enum) +/* * True if this type is a discriminated union type. Only valid for + TYPE_CODE_UNION. A discriminated union stores a reference to the + discriminant field along with the discriminator values in a dynamic + property. */ + +#define TYPE_FLAG_DISCRIMINATED_UNION(t) \ + (TYPE_MAIN_TYPE (t)->flag_discriminated_union) + /* * Constant type. If this is set, the corresponding type has a const modifier. */ -#define TYPE_CONST(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_CONST) +#define TYPE_CONST(t) ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_CONST) != 0) /* * Volatile type. If this is set, the corresponding type has a volatile modifier. */ #define TYPE_VOLATILE(t) \ - (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_VOLATILE) + ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_VOLATILE) != 0) /* * Restrict type. If this is set, the corresponding type has a restrict modifier. */ #define TYPE_RESTRICT(t) \ - (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_RESTRICT) + ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_RESTRICT) != 0) /* * Atomic type. If this is set, the corresponding type has an _Atomic modifier. */ #define TYPE_ATOMIC(t) \ - (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_ATOMIC) + ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_ATOMIC) != 0) /* * True if this type represents either an lvalue or lvalue reference type. */ @@ -362,10 +368,10 @@ enum type_instance_flag_value is instruction space, and for data objects is data memory. */ #define TYPE_CODE_SPACE(t) \ - (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_CODE_SPACE) + ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_CODE_SPACE) != 0) #define TYPE_DATA_SPACE(t) \ - (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_DATA_SPACE) + ((TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_DATA_SPACE) != 0) /* * Address class flags. Some environments provide for pointers whose size is different from that of a normal pointer or address @@ -383,6 +389,39 @@ enum type_instance_flag_value #define TYPE_ADDRESS_CLASS_ALL(t) (TYPE_INSTANCE_FLAGS(t) \ & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) +/* * Information needed for a discriminated union. A discriminated + union is handled somewhat differently from an ordinary union. + + One field is designated as the discriminant. Only one other field + is active at a time; which one depends on the value of the + discriminant and the data in this structure. + + Additionally, it is possible to have a univariant discriminated + union. In this case, the union has just a single field, which is + assumed to be the only active variant -- in this case no + discriminant is provided. */ + +struct discriminant_info +{ + /* * The index of the discriminant field. If -1, then this union + must have just a single field. */ + + int discriminant_index; + + /* * The index of the default branch of the union. If -1, then + there is no default branch. */ + + int default_index; + + /* * The discriminant values corresponding to each branch. This has + a number of entries equal to the number of fields in this union. + If discriminant_index is not -1, then that entry in this array is + not used. If default_index is not -1, then that entry in this + array is not used. */ + + ULONGEST discriminants[1]; +}; + enum dynamic_prop_kind { PROP_UNDEFINED, /* Not defined. */ @@ -414,6 +453,16 @@ struct dynamic_prop union dynamic_prop_data data; }; +/* Compare two dynamic_prop objects for equality. dynamic_prop + instances are equal iff they have the same type and storage. */ +extern bool operator== (const dynamic_prop &l, const dynamic_prop &r); + +/* Compare two dynamic_prop objects for inequality. */ +static inline bool operator!= (const dynamic_prop &l, const dynamic_prop &r) +{ + return !(l == r); +} + /* * Define a type's dynamic property node kind. */ enum dynamic_prop_node_kind { @@ -428,6 +477,12 @@ enum dynamic_prop_node_kind /* A property representing DW_AT_allocated. The presence of this attribute indicated that the object of the type can be associated. */ DYN_PROP_ASSOCIATED, + + /* A property providing an array's byte stride. */ + DYN_PROP_BYTE_STRIDE, + + /* A property holding information about a discriminated union. */ + DYN_PROP_DISCRIMINATED, }; /* * List for dynamic type attributes. */ @@ -568,6 +623,16 @@ struct range_bounds int flag_bound_evaluated : 1; }; +/* Compare two range_bounds objects for equality. Simply does + memberwise comparison. */ +extern bool operator== (const range_bounds &l, const range_bounds &r); + +/* Compare two range_bounds objects for inequality. */ +static inline bool operator!= (const range_bounds &l, const range_bounds &r) +{ + return !(l == r); +} + union type_specific { /* * CPLUS_STUFF is for TYPE_CODE_STRUCT. It is initialized to @@ -581,12 +646,11 @@ union type_specific struct gnat_aux_type *gnat_stuff; - /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to two - floatformat objects that describe the floating-point value - that resides within the type. The first is for big endian - targets and the second is for little endian targets. */ + /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to a + floatformat object that describes the floating-point value + that resides within the type. */ - const struct floatformat **floatformat; + const struct floatformat *floatformat; /* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */ @@ -638,6 +702,13 @@ struct main_type unsigned int flag_flag_enum : 1; + /* * True if this type is a discriminated union type. Only valid + for TYPE_CODE_UNION. A discriminated union stores a reference to + the discriminant field along with the discriminator values in a + dynamic property. */ + + unsigned int flag_discriminated_union : 1; + /* * A discriminant telling us which field of the type_specific union is being used for this type, if any. */ @@ -650,26 +721,12 @@ struct main_type /* * Name of this type, or NULL if none. - This is used for printing only, except by poorly designed C++ - code. For looking up a name, look for a symbol in the - VAR_DOMAIN. This is generally allocated in the objfile's - obstack. However coffread.c uses malloc. */ + This is used for printing only. For looking up a name, look for + a symbol in the VAR_DOMAIN. This is generally allocated in the + objfile's obstack. However coffread.c uses malloc. */ const char *name; - /* * Tag name for this type, or NULL if none. This means that the - name of the type consists of a keyword followed by the tag name. - Which keyword is determined by the type code ("struct" for - TYPE_CODE_STRUCT, etc.). As far as I know C/C++ are the only - languages with this feature. - - This is used for printing only, except by poorly designed C++ code. - For looking up a name, look for a symbol in the STRUCT_DOMAIN. - One more legitimate use is that if TYPE_STUB is set, this is - the name to use to look for definitions in other files. */ - - const char *tag_name; - /* * Every type is now associated with a particular objfile, and the type is allocated on the objfile_obstack for that objfile. One problem however, is that there are times when gdb allocates new @@ -731,6 +788,10 @@ struct main_type struct dynamic_prop_list *dyn_prop_list; }; +/* * Number of bits allocated for alignment. */ + +#define TYPE_ALIGN_BITS 8 + /* * A ``struct type'' describes a particular instance of a type, with some particular qualification. */ @@ -760,6 +821,14 @@ struct type struct type *chain; + /* * The alignment for this type. Zero means that the alignment was + not specified in the debug info. Note that this is stored in a + funny way: as the log base 2 (plus 1) of the alignment; so a + value of 1 means the alignment is 1, and a value of 9 means the + alignment is 256. */ + + unsigned align_log2 : TYPE_ALIGN_BITS; + /* * Flags specific to this instance of the type, indicating where on the ring we are. @@ -770,7 +839,7 @@ struct type instance flags are completely inherited from the target type. No qualifiers can be cleared by the typedef. See also check_typedef. */ - int instance_flags; + unsigned instance_flags : 9; /* * Length of storage for a value of this type. The value is the expression in host bytes of what sizeof(type) would return. This @@ -850,12 +919,6 @@ struct fn_field unsigned int is_volatile:1; unsigned int is_private:1; unsigned int is_protected:1; - unsigned int is_public:1; - unsigned int is_abstract:1; - unsigned int is_static:1; - unsigned int is_final:1; - unsigned int is_synchronized:1; - unsigned int is_native:1; unsigned int is_artificial:1; /* * A stub method only has some fields valid (but they are enough @@ -869,7 +932,7 @@ struct fn_field /* * Unused. */ - unsigned int dummy:3; + unsigned int dummy:9; /* * Index into that baseclass's virtual function table, minus 2; else if static: VOFFSET_STATIC; else: 0. */ @@ -880,7 +943,7 @@ struct fn_field }; -struct typedef_field +struct decl_field { /* * Unqualified name to be prefixed by owning class qualified name. */ @@ -890,6 +953,12 @@ struct typedef_field /* * Type this typedef named NAME represents. */ struct type *type; + + /* * True if this field was declared protected, false otherwise. */ + unsigned int is_protected : 1; + + /* * True if this field was declared private, false otherwise. */ + unsigned int is_private : 1; }; /* * C++ language-specific information for TYPE_CODE_STRUCT and @@ -989,10 +1058,17 @@ struct cplus_struct_type /* * typedefs defined inside this class. typedef_field points to an array of typedef_field_count elements. */ - struct typedef_field *typedef_field; + struct decl_field *typedef_field; unsigned typedef_field_count; + /* * The nested types defined by this type. nested_types points to + an array of nested_types_count elements. */ + + struct decl_field *nested_types; + + unsigned nested_types_count; + /* * The template arguments. This is an array with N_TEMPLATE_ARGUMENTS elements. This is NULL for non-template classes. */ @@ -1108,7 +1184,7 @@ union call_site_parameter_u DW_TAG_formal_parameter which is referenced by both caller and the callee. */ - cu_offset param_offset; + cu_offset param_cu_off; }; struct call_site_parameter @@ -1203,7 +1279,6 @@ extern void allocate_gnat_aux_type (struct type *); #define TYPE_INSTANCE_FLAGS(thistype) (thistype)->instance_flags #define TYPE_MAIN_TYPE(thistype) (thistype)->main_type #define TYPE_NAME(thistype) TYPE_MAIN_TYPE(thistype)->name -#define TYPE_TAG_NAME(type) TYPE_MAIN_TYPE(type)->tag_name #define TYPE_TARGET_TYPE(thistype) TYPE_MAIN_TYPE(thistype)->target_type #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type @@ -1214,6 +1289,26 @@ extern void allocate_gnat_aux_type (struct type *); so you only have to call check_typedef once. Since allocate_value calls check_typedef, TYPE_LENGTH (VALUE_TYPE (X)) is safe. */ #define TYPE_LENGTH(thistype) (thistype)->length + +/* * Return the alignment of the type in target addressable memory + units, or 0 if no alignment was specified. */ +#define TYPE_RAW_ALIGN(thistype) type_raw_align (thistype) + +/* * Return the alignment of the type in target addressable memory + units, or 0 if no alignment was specified. */ +extern unsigned type_raw_align (struct type *); + +/* * Return the alignment of the type in target addressable memory + units. Return 0 if the alignment cannot be determined; but note + that this makes an effort to compute the alignment even it it was + not specified in the debug info. */ +extern unsigned type_align (struct type *); + +/* * Set the alignment of the type. The alignment must be a power of + 2. Returns false if the given value does not fit in the available + space in struct type. */ +extern bool set_type_align (struct type *, ULONGEST); + /* * Note that TYPE_CODE can be TYPE_CODE_TYPEDEF, so if you want the real type, you need to do TYPE_CODE (check_type (this_type)). */ #define TYPE_CODE(thistype) TYPE_MAIN_TYPE(thistype)->code @@ -1411,13 +1506,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define TYPE_FN_FIELD_VOLATILE(thisfn, n) ((thisfn)[n].is_volatile) #define TYPE_FN_FIELD_PRIVATE(thisfn, n) ((thisfn)[n].is_private) #define TYPE_FN_FIELD_PROTECTED(thisfn, n) ((thisfn)[n].is_protected) -#define TYPE_FN_FIELD_PUBLIC(thisfn, n) ((thisfn)[n].is_public) -#define TYPE_FN_FIELD_STATIC(thisfn, n) ((thisfn)[n].is_static) -#define TYPE_FN_FIELD_FINAL(thisfn, n) ((thisfn)[n].is_final) -#define TYPE_FN_FIELD_SYNCHRONIZED(thisfn, n) ((thisfn)[n].is_synchronized) -#define TYPE_FN_FIELD_NATIVE(thisfn, n) ((thisfn)[n].is_native) #define TYPE_FN_FIELD_ARTIFICIAL(thisfn, n) ((thisfn)[n].is_artificial) -#define TYPE_FN_FIELD_ABSTRACT(thisfn, n) ((thisfn)[n].is_abstract) #define TYPE_FN_FIELD_STUB(thisfn, n) ((thisfn)[n].is_stub) #define TYPE_FN_FIELD_CONSTRUCTOR(thisfn, n) ((thisfn)[n].is_constructor) #define TYPE_FN_FIELD_FCONTEXT(thisfn, n) ((thisfn)[n].fcontext) @@ -1425,6 +1514,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #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) +/* Accessors for typedefs defined by a class. */ #define TYPE_TYPEDEF_FIELD_ARRAY(thistype) \ TYPE_CPLUS_SPECIFIC (thistype)->typedef_field #define TYPE_TYPEDEF_FIELD(thistype, n) \ @@ -1435,6 +1525,25 @@ extern void set_type_vptr_basetype (struct type *, struct type *); TYPE_TYPEDEF_FIELD (thistype, n).type #define TYPE_TYPEDEF_FIELD_COUNT(thistype) \ TYPE_CPLUS_SPECIFIC (thistype)->typedef_field_count +#define TYPE_TYPEDEF_FIELD_PROTECTED(thistype, n) \ + TYPE_TYPEDEF_FIELD (thistype, n).is_protected +#define TYPE_TYPEDEF_FIELD_PRIVATE(thistype, n) \ + TYPE_TYPEDEF_FIELD (thistype, n).is_private + +#define TYPE_NESTED_TYPES_ARRAY(thistype) \ + TYPE_CPLUS_SPECIFIC (thistype)->nested_types +#define TYPE_NESTED_TYPES_FIELD(thistype, n) \ + TYPE_CPLUS_SPECIFIC (thistype)->nested_types[n] +#define TYPE_NESTED_TYPES_FIELD_NAME(thistype, n) \ + TYPE_NESTED_TYPES_FIELD (thistype, n).name +#define TYPE_NESTED_TYPES_FIELD_TYPE(thistype, n) \ + TYPE_NESTED_TYPES_FIELD (thistype, n).type +#define TYPE_NESTED_TYPES_COUNT(thistype) \ + TYPE_CPLUS_SPECIFIC (thistype)->nested_types_count +#define TYPE_NESTED_TYPES_FIELD_PROTECTED(thistype, n) \ + TYPE_NESTED_TYPES_FIELD (thistype, n).is_protected +#define TYPE_NESTED_TYPES_FIELD_PRIVATE(thistype, n) \ + TYPE_NESTED_TYPES_FIELD (thistype, n).is_private #define TYPE_IS_OPAQUE(thistype) \ (((TYPE_CODE (thistype) == TYPE_CODE_STRUCT) \ @@ -1456,6 +1565,9 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define TYPE_ERROR_NAME(type) \ (TYPE_NAME (type) ? TYPE_NAME (type) : _("")) +/* Given TYPE, return its floatformat. */ +const struct floatformat *floatformat_from_type (const struct type *type); + struct builtin_type { /* Integral types. */ @@ -1509,6 +1621,7 @@ struct builtin_type /* Wide character types. */ struct type *builtin_char16; struct type *builtin_char32; + struct type *builtin_wchar; /* Pointer types. */ @@ -1704,7 +1817,7 @@ struct field *append_composite_type_field_raw (struct type *t, const char *name, type is created using arch_flag_type(). Flags are then added using append_flag_type_field() and append_flag_type_flag(). */ extern struct type *arch_flags_type (struct gdbarch *gdbarch, - const char *name, int length); + const char *name, int bit); extern void append_flags_type_field (struct type *type, int start_bitpos, int nr_bits, struct type *field_type, const char *name); @@ -1714,9 +1827,13 @@ extern void append_flags_type_flag (struct type *type, int bitpos, extern void make_vector_type (struct type *array_type); extern struct type *init_vector_type (struct type *elt_type, int n); -extern struct type *lookup_reference_type (struct type *); +extern struct type *lookup_reference_type (struct type *, enum type_code); +extern struct type *lookup_lvalue_reference_type (struct type *); +extern struct type *lookup_rvalue_reference_type (struct type *); + -extern struct type *make_reference_type (struct type *, struct type **); +extern struct type *make_reference_type (struct type *, struct type **, + enum type_code); extern struct type *make_cv_type (int, int, struct type *, struct type **); @@ -1750,9 +1867,7 @@ extern void smash_to_methodptr_type (struct type *, struct type *); extern struct type *allocate_stub_method (struct type *); -extern const char *type_name_no_tag (const struct type *); - -extern const char *type_name_no_tag_or_error (struct type *type); +extern const char *type_name_or_error (struct type *type); extern struct type *lookup_struct_elt_type (struct type *, const char *, int); @@ -1773,7 +1888,8 @@ extern struct type *create_static_range_type (struct type *, struct type *, extern struct type *create_array_type_with_stride - (struct type *, struct type *, struct type *, unsigned int); + (struct type *, struct type *, struct type *, + struct dynamic_prop *, unsigned int); extern struct type *create_range_type (struct type *, struct type *, const struct dynamic_prop *, @@ -1819,11 +1935,10 @@ extern struct dynamic_prop *get_dyn_prop /* * Given a dynamic property PROP of a given KIND, add this dynamic property to the given TYPE. - This function assumes that TYPE is objfile-owned, and that OBJFILE - is the TYPE's objfile. */ + This function assumes that TYPE is objfile-owned. */ extern void add_dyn_prop (enum dynamic_prop_node_kind kind, struct dynamic_prop prop, - struct type *type, struct objfile *objfile); + struct type *type); extern void remove_dyn_prop (enum dynamic_prop_node_kind prop_kind, struct type *type); @@ -1892,10 +2007,21 @@ extern const struct rank VOID_PTR_CONVERSION_BADNESS; extern const struct rank BOOL_CONVERSION_BADNESS; /* * Badness of converting derived to base class. */ extern const struct rank BASE_CONVERSION_BADNESS; -/* * Badness of converting from non-reference to reference. */ +/* * Badness of converting from non-reference to reference. Subrank + is the type of reference conversion being done. */ extern const struct rank REFERENCE_CONVERSION_BADNESS; +/* * Conversion to rvalue reference. */ +#define REFERENCE_CONVERSION_RVALUE 1 +/* * Conversion to const lvalue reference. */ +#define REFERENCE_CONVERSION_CONST_LVALUE 2 + /* * Badness of converting integer 0 to NULL pointer. */ extern const struct rank NULL_POINTER_CONVERSION; +/* * Badness of cv-conversion. Subrank is a flag describing the conversions + being done. */ +extern const struct rank CV_CONVERSION_BADNESS; +#define CV_CONVERSION_CONST 1 +#define CV_CONVERSION_VOLATILE 2 /* Non-standard conversions allowed by the debugger */ @@ -1931,13 +2057,15 @@ extern int can_dereference (struct type *); extern int is_integral_type (struct type *); +extern int is_floating_type (struct type *); + extern int is_scalar_type (struct type *type); extern int is_scalar_type_recursive (struct type *); extern int class_or_union_p (const struct type *); -extern void maintenance_print_type (char *, int); +extern void maintenance_print_type (const char *, int); extern htab_t create_copied_types_hash (struct objfile *objfile); @@ -1947,9 +2075,9 @@ extern struct type *copy_type_recursive (struct objfile *objfile, extern struct type *copy_type (const struct type *type); -extern int types_equal (struct type *, struct type *); +extern bool types_equal (struct type *, struct type *); -extern int types_deeply_equal (struct type *, struct type *); +extern bool types_deeply_equal (struct type *, struct type *); extern int type_not_allocated (const struct type *type);