X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbtypes.h;h=14059ab3dc55e3cbc96333168dbb4de0756e8a6e;hb=e99b03dcf42606425eab8bd12eadb8aa4007f35a;hp=883418fdafc707c8f5f928c414ca23ee0f4108e6;hpb=283a99589a0780a3b1fc011885b630bd9223ebba;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 883418fdaf..14059ab3dc 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,7 @@ /* Internal type definitions for GDB. - Copyright (C) 1992-2015 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. */ @@ -160,6 +163,8 @@ enum type_code TYPE_CODE_REF, /**< C++ Reference types */ + TYPE_CODE_RVALUE_REF, /**< C++ rvalue reference types */ + TYPE_CODE_CHAR, /**< *real* character type */ /* * Boolean type. 0 is false, 1 is true, and other values are @@ -184,35 +189,8 @@ enum type_code TYPE_CODE_XMETHOD }; -/* * Some constants representing each bit field in the main_type. See - the bit-field-specific macros, below, for documentation of each - constant in this enum. These enum values are only used with - init_type. Note that the values are chosen not to conflict with - type_instance_flag_value; this lets init_type error-check its - input. */ - -enum type_flag_value -{ - TYPE_FLAG_UNSIGNED = (1 << 9), - TYPE_FLAG_NOSIGN = (1 << 10), - TYPE_FLAG_STUB = (1 << 11), - TYPE_FLAG_TARGET_STUB = (1 << 12), - TYPE_FLAG_STATIC = (1 << 13), - TYPE_FLAG_PROTOTYPED = (1 << 14), - TYPE_FLAG_INCOMPLETE = (1 << 15), - TYPE_FLAG_VARARGS = (1 << 16), - TYPE_FLAG_VECTOR = (1 << 17), - TYPE_FLAG_FIXED_INSTANCE = (1 << 18), - TYPE_FLAG_STUB_SUPPORTED = (1 << 19), - TYPE_FLAG_GNU_IFUNC = (1 << 20), - - /* * Used for error-checking. */ - TYPE_FLAG_MIN = TYPE_FLAG_UNSIGNED -}; - /* * Some bits for the type's instance_flags word. See the macros - below for documentation on each bit. Note that if you add a value - here, you must update the enum type_flag_value as well. */ + below for documentation on each bit. */ enum type_instance_flag_value { @@ -227,8 +205,10 @@ 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_FLAG_NOSIGN (below) is set). */ + the type is signed (unless TYPE_NOSIGN (below) is set). */ #define TYPE_UNSIGNED(t) (TYPE_MAIN_TYPE (t)->flag_unsigned) @@ -252,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 @@ -339,28 +312,41 @@ 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. */ + +#define TYPE_IS_REFERENCE(t) \ + (TYPE_CODE (t) == TYPE_CODE_REF || TYPE_CODE (t) == TYPE_CODE_RVALUE_REF) /* * Instruction-space delimited type. This is for Harvard architectures which have separate instruction and data address spaces (and perhaps @@ -370,11 +356,11 @@ enum type_instance_flag_value architecture's two (or more) address spaces, but this is an extension of the architecture's model. - If TYPE_FLAG_INST is set, an object of the corresponding type + If TYPE_INSTANCE_FLAG_CODE_SPACE is set, an object of the corresponding type resides in instruction memory, even if its address (in the extended flat address space) does not reflect this. - Similarly, if TYPE_FLAG_DATA is set, then an object of the + Similarly, if TYPE_INSTANCE_FLAG_DATA_SPACE is set, then an object of the corresponding type resides in the data memory space, even if this is not indicated by its (flat address space) address. @@ -382,15 +368,15 @@ 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 types where the bits are interpreted differently than normal - addresses. The TYPE_FLAG_ADDRESS_CLASS_n flags may be used in + addresses. The TYPE_INSTANCE_FLAG_ADDRESS_CLASS_n flags may be used in target specific ways to represent these different types of address classes. */ @@ -403,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. */ @@ -434,12 +453,36 @@ 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 { /* A property providing a type's data location. Evaluating this field yields to the location of an object's data. */ DYN_PROP_DATA_LOCATION, + + /* A property representing DW_AT_allocated. The presence of this attribute + indicates that the object of the type can be allocated/deallocated. */ + DYN_PROP_ALLOCATED, + + /* 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. */ @@ -503,7 +546,7 @@ union field_location gdbarch_bits_big_endian=0 targets, it is the bit offset to the LSB. */ - int bitpos; + LONGEST bitpos; /* * Enum value. */ LONGEST enumval; @@ -580,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 @@ -593,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. */ @@ -650,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. */ @@ -662,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_FLAG_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 @@ -743,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. */ @@ -759,6 +808,10 @@ struct type struct type *reference_type; + /* * A C++ rvalue reference type added in C++11. */ + + struct type *rvalue_reference_type; + /* * Variant chain. This points to a type that differs from this one only in qualifiers and length. Currently, the possible qualifiers are const, volatile, code-space, data-space, and @@ -768,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. @@ -778,33 +839,25 @@ 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; - - /* * Length of storage for a value of this type. This is what - sizeof(type) would return; use it for address arithmetic, memory - reads and writes, etc. This size includes padding. For example, - an i386 extended-precision floating point value really only - occupies ten bytes, but most ABI's declare its size to be 12 - bytes, to preserve alignment. A `struct type' representing such - a floating-point type would have a `length' value of 12, even - though the last two bytes are unused. - - There's a bit of a host/target mess here, if you're concerned - about machines whose bytes aren't eight bits long, or who don't - have byte-addressed memory. Various places pass this to memcpy - and such, meaning it must be in units of host bytes. Various - other places expect they can calculate addresses by adding it - and such, meaning it must be in units of target bytes. For - some DSP targets, in which HOST_CHAR_BIT will (presumably) be 8 - and TARGET_CHAR_BIT will be (say) 32, this is a problem. - - One fix would be to make this field in bits (requiring that it - always be a multiple of HOST_CHAR_BIT and TARGET_CHAR_BIT) --- - the other choice would be to make it consistently in units of - HOST_CHAR_BIT. However, this would still fail to address - machines based on a ternary or decimal representation. */ - - unsigned length; + 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 + size includes padding. For example, an i386 extended-precision + floating point value really only occupies ten bytes, but most + ABI's declare its size to be 12 bytes, to preserve alignment. + A `struct type' representing such a floating-point type would + have a `length' value of 12, even though the last two bytes are + unused. + + Since this field is expressed in host bytes, its value is appropriate + to pass to memcpy and such (it is assumed that GDB itself always runs + on an 8-bits addressable architecture). However, when using it for + target address arithmetic (e.g. adding it to a target address), the + type_length_units function should be used in order to get the length + expressed in target addressable memory units. */ + + unsigned int length; /* * Core type, shared by a group of qualified types. */ @@ -866,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 @@ -885,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. */ @@ -896,7 +943,7 @@ struct fn_field }; -struct typedef_field +struct decl_field { /* * Unqualified name to be prefixed by owning class qualified name. */ @@ -906,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 @@ -915,8 +968,8 @@ struct cplus_struct_type { /* * Number of base classes this type derives from. The baseclasses are stored in the first N_BASECLASSES fields - (i.e. the `fields' field of the struct type). I think only the - `type' field of such a field has any meaning. */ + (i.e. the `fields' field of the struct type). The only fields + of struct field that are used are: type, name, loc.bitpos. */ short n_baseclasses; @@ -953,10 +1006,6 @@ struct cplus_struct_type int is_dynamic : 2; - /* * Non-zero if this type came from a Java CU. */ - - unsigned int is_java : 1; - /* * The base class which defined the virtual function table pointer. */ struct type *vptr_basetype; @@ -1009,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. */ @@ -1072,12 +1128,12 @@ struct func_type unsigned int is_noreturn : 1; - /* * Only those DW_TAG_GNU_call_site's in this function that have - DW_AT_GNU_tail_call set are linked in this list. Function + /* * Only those DW_TAG_call_site's in this function that have + DW_AT_call_tail_call set are linked in this list. Function without its tail call list complete - (DW_AT_GNU_all_tail_call_sites or its superset - DW_AT_GNU_all_call_sites) has TAIL_CALL_LIST NULL, even if some - DW_TAG_GNU_call_site's exist in such function. */ + (DW_AT_call_all_tail_calls or its superset + DW_AT_call_all_calls) has TAIL_CALL_LIST NULL, even if some + DW_TAG_call_site's exist in such function. */ struct call_site *tail_call_list; @@ -1128,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 @@ -1137,13 +1193,12 @@ struct call_site_parameter union call_site_parameter_u u; - /* * DW_TAG_formal_parameter's DW_AT_GNU_call_site_value. It - is never NULL. */ + /* * DW_TAG_formal_parameter's DW_AT_call_value. It is never NULL. */ const gdb_byte *value; size_t value_size; - /* * DW_TAG_formal_parameter's DW_AT_GNU_call_site_data_value. + /* * DW_TAG_formal_parameter's DW_AT_call_data_value. It may be NULL if not provided by DWARF. */ const gdb_byte *data_value; @@ -1151,8 +1206,7 @@ struct call_site_parameter }; /* * A place where a function gets called from, represented by - DW_TAG_GNU_call_site. It can be looked up from - symtab->call_site_htab. */ + DW_TAG_call_site. It can be looked up from symtab->call_site_htab. */ struct call_site { @@ -1166,7 +1220,7 @@ struct call_site struct call_site *tail_call_next; - /* * Describe DW_AT_GNU_call_site_target. Missing attribute uses + /* * Describe DW_AT_call_target. Missing attribute uses FIELD_LOC_KIND_DWARF_BLOCK with FIELD_DWARF_BLOCK == NULL. */ struct call_site_target target; @@ -1180,7 +1234,7 @@ struct call_site struct dwarf2_per_cu_data *per_cu; - /* * Describe DW_TAG_GNU_call_site's DW_TAG_formal_parameter. */ + /* * Describe DW_TAG_call_site's DW_TAG_formal_parameter. */ struct call_site_parameter parameter[1]; }; @@ -1218,23 +1272,43 @@ extern void allocate_gnat_aux_type (struct type *); #define INIT_FUNC_SPECIFIC(type) \ (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FUNC, \ - TYPE_MAIN_TYPE (type)->type_specific.func_stuff \ - = TYPE_ZALLOC (type, \ - sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff))) + TYPE_MAIN_TYPE (type)->type_specific.func_stuff = (struct func_type *) \ + TYPE_ZALLOC (type, \ + sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff))) #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 +#define TYPE_RVALUE_REFERENCE_TYPE(thistype) (thistype)->rvalue_reference_type #define TYPE_CHAIN(thistype) (thistype)->chain /* * Note that if thistype is a TYPEDEF type, you have to call check_typedef. But check_typedef does set the TYPE_LENGTH of the TYPEDEF 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 @@ -1266,6 +1340,12 @@ extern void allocate_gnat_aux_type (struct type *); #define TYPE_DATA_LOCATION_KIND(thistype) \ TYPE_DATA_LOCATION (thistype)->kind +/* Property accessors for the type allocated/associated. */ +#define TYPE_ALLOCATED_PROP(thistype) \ + get_dyn_prop (DYN_PROP_ALLOCATED, thistype) +#define TYPE_ASSOCIATED_PROP(thistype) \ + get_dyn_prop (DYN_PROP_ASSOCIATED, thistype) + /* Attribute accessors for dynamic properties. */ #define TYPE_DYN_PROP_LIST(thistype) \ TYPE_MAIN_TYPE(thistype)->dyn_prop_list @@ -1330,7 +1410,6 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define BASETYPE_VIA_PUBLIC(thistype, index) \ ((!TYPE_FIELD_PRIVATE(thistype, index)) && (!TYPE_FIELD_PROTECTED(thistype, index))) #define TYPE_CPLUS_DYNAMIC(thistype) TYPE_CPLUS_SPECIFIC (thistype)->is_dynamic -#define TYPE_CPLUS_REALLY_JAVA(thistype) TYPE_CPLUS_SPECIFIC (thistype)->is_java #define BASETYPE_VIA_VIRTUAL(thistype, index) \ (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \ @@ -1427,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) @@ -1441,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) \ @@ -1451,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) \ @@ -1472,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. */ @@ -1525,6 +1621,7 @@ struct builtin_type /* Wide character types. */ struct type *builtin_char16; struct type *builtin_char32; + struct type *builtin_wchar; /* Pointer types. */ @@ -1659,19 +1756,44 @@ extern struct gdbarch *get_type_arch (const struct type *); extern struct type *get_target_type (struct type *type); +/* Return the equivalent of TYPE_LENGTH, but in number of target + addressable memory units of the associated gdbarch instead of bytes. */ + +extern unsigned int type_length_units (struct type *type); + /* * Helper function to construct objfile-owned types. */ -extern struct type *init_type (enum type_code, int, int, const char *, - struct objfile *); +extern struct type *init_type (struct objfile *, enum type_code, int, + const char *); +extern struct type *init_integer_type (struct objfile *, int, int, + const char *); +extern struct type *init_character_type (struct objfile *, int, int, + const char *); +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 **); +extern struct type *init_decfloat_type (struct objfile *, int, const char *); +extern struct type *init_complex_type (struct objfile *, const char *, + struct type *); +extern struct type *init_pointer_type (struct objfile *, int, const char *, + struct type *); /* Helper functions to construct architecture-owned types. */ -extern struct type *arch_type (struct gdbarch *, enum type_code, int, char *); -extern struct type *arch_integer_type (struct gdbarch *, int, int, char *); -extern struct type *arch_character_type (struct gdbarch *, int, int, char *); -extern struct type *arch_boolean_type (struct gdbarch *, int, int, char *); -extern struct type *arch_float_type (struct gdbarch *, int, char *, +extern struct type *arch_type (struct gdbarch *, enum type_code, int, + const char *); +extern struct type *arch_integer_type (struct gdbarch *, int, int, + const char *); +extern struct type *arch_character_type (struct gdbarch *, int, int, + const char *); +extern struct type *arch_boolean_type (struct gdbarch *, int, int, + const char *); +extern struct type *arch_float_type (struct gdbarch *, int, const char *, const struct floatformat **); -extern struct type *arch_complex_type (struct gdbarch *, char *, +extern struct type *arch_decfloat_type (struct gdbarch *, int, const char *); +extern struct type *arch_complex_type (struct gdbarch *, const char *, + struct type *); +extern struct type *arch_pointer_type (struct gdbarch *, int, const char *, struct type *); /* Helper functions to construct a struct or record type. An @@ -1681,29 +1803,37 @@ extern struct type *arch_complex_type (struct gdbarch *, char *, field packed against the previous. */ extern struct type *arch_composite_type (struct gdbarch *gdbarch, - char *name, enum type_code code); -extern void append_composite_type_field (struct type *t, char *name, + const char *name, enum type_code code); +extern void append_composite_type_field (struct type *t, const char *name, struct type *field); extern void append_composite_type_field_aligned (struct type *t, - char *name, + const char *name, struct type *field, int alignment); -struct field *append_composite_type_field_raw (struct type *t, char *name, +struct field *append_composite_type_field_raw (struct type *t, const char *name, struct type *field); /* Helper functions to construct a bit flags type. An initially empty type is created using arch_flag_type(). Flags are then added using - append_flag_type_flag(). */ + append_flag_type_field() and append_flag_type_flag(). */ extern struct type *arch_flags_type (struct gdbarch *gdbarch, - char *name, int length); -extern void append_flags_type_flag (struct type *type, int bitpos, char *name); + 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); +extern void append_flags_type_flag (struct type *type, int bitpos, + const char *name); 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 **); @@ -1737,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); @@ -1760,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 *, @@ -1791,7 +1920,9 @@ extern void get_signed_type_minmax (struct type *, LONGEST *, LONGEST *); ADDR specifies the location of the variable the type is bound to. If TYPE has no dynamic properties return TYPE; otherwise a new type with static properties is returned. */ -extern struct type *resolve_dynamic_type (struct type *type, CORE_ADDR addr); +extern struct type *resolve_dynamic_type (struct type *type, + const gdb_byte *valaddr, + CORE_ADDR addr); /* * Predicate if the type has dynamic values, which are not resolved yet. */ extern int is_dynamic_type (struct type *type); @@ -1804,18 +1935,15 @@ 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 struct type *check_typedef (struct type *); +extern void remove_dyn_prop (enum dynamic_prop_node_kind prop_kind, + struct type *type); -#define CHECK_TYPEDEF(TYPE) \ - do { \ - (TYPE) = check_typedef (TYPE); \ - } while (0) +extern struct type *check_typedef (struct type *); extern void check_stub_method_group (struct type *, int); @@ -1835,6 +1963,8 @@ extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *); extern int get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound); +extern int discrete_position (struct type *type, LONGEST val, LONGEST *pos); + extern int class_types_same_p (const struct type *, const struct type *); extern int is_ancestor (struct type *, struct type *); @@ -1877,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 */ @@ -1908,7 +2049,7 @@ extern int field_is_static (struct field *); /* printcmd.c */ -extern void print_scalar_formatted (const void *, struct type *, +extern void print_scalar_formatted (const gdb_byte *, struct type *, const struct value_print_options *, int, struct ui_file *); @@ -1916,11 +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); @@ -1930,8 +2075,12 @@ 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 bool types_deeply_equal (struct type *, struct type *); + +extern int type_not_allocated (const struct type *type); -extern int types_deeply_equal (struct type *, struct type *); +extern int type_not_associated (const struct type *type); #endif /* GDBTYPES_H */