X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbtypes.h;h=32e5f041de106f8b02ff81cb08f37efe6d106f62;hb=f55ee35cf17f1eb104292b4c6b2f7def38ffe4a8;hp=b2d841f3f993639c30a3f76170e1b1eb57a79128;hpb=1bac305b7206372b7f2266851d6cc1ee2cb9d7ca;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index b2d841f3f9..32e5f041de 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,8 @@ /* Internal type definitions for GDB. - Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, + 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -9,7 +10,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -18,53 +19,18 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #if !defined (GDBTYPES_H) #define GDBTYPES_H 1 +#include "hashtab.h" + /* Forward declarations for prototypes. */ +struct field; struct block; - -/* Codes for `fundamental types'. This is a monstrosity based on the - bogus notion that there are certain compiler-independent - `fundamental types'. None of these is well-defined (how big is - FT_SHORT? Does it depend on the language? How does the - language-specific code know which type to correlate to FT_SHORT?) */ - -#define FT_VOID 0 -#define FT_BOOLEAN 1 -#define FT_CHAR 2 /* we use this for not-unsigned C/C++ chars */ -#define FT_SIGNED_CHAR 3 /* we use this for C++ signed chars */ -#define FT_UNSIGNED_CHAR 4 /* we use this for C/C++ unsigned chars */ -#define FT_SHORT 5 -#define FT_SIGNED_SHORT 6 -#define FT_UNSIGNED_SHORT 7 -#define FT_INTEGER 8 -#define FT_SIGNED_INTEGER 9 -#define FT_UNSIGNED_INTEGER 10 -#define FT_LONG 11 -#define FT_SIGNED_LONG 12 -#define FT_UNSIGNED_LONG 13 -#define FT_LONG_LONG 14 -#define FT_SIGNED_LONG_LONG 15 -#define FT_UNSIGNED_LONG_LONG 16 -#define FT_FLOAT 17 -#define FT_DBL_PREC_FLOAT 18 -#define FT_EXT_PREC_FLOAT 19 -#define FT_COMPLEX 20 -#define FT_DBL_PREC_COMPLEX 21 -#define FT_EXT_PREC_COMPLEX 22 -#define FT_STRING 23 -#define FT_FIXED_DECIMAL 24 -#define FT_FLOAT_DECIMAL 25 -#define FT_BYTE 26 -#define FT_UNSIGNED_BYTE 27 -#define FT_TEMPLATE_ARG 28 - -#define FT_NUM_MEMBERS 29 /* Highest FT_* above, plus one. */ +struct value_print_options; +struct language_defn; /* Some macros for char-based bitfields. */ @@ -81,10 +47,31 @@ enum type_code { TYPE_CODE_UNDEF, /* Not used; catches errors */ TYPE_CODE_PTR, /* Pointer type */ - TYPE_CODE_ARRAY, /* Array type with lower & upper bounds. */ + + /* Array type with lower & upper bounds. + + Regardless of the language, GDB represents multidimensional + array types the way C does: as arrays of arrays. So an + instance of a GDB array type T can always be seen as a series + of instances of TYPE_TARGET_TYPE (T) laid out sequentially in + memory. + + Row-major languages like C lay out multi-dimensional arrays so + that incrementing the rightmost index in a subscripting + expression results in the smallest change in the address of the + element referred to. Column-major languages like Fortran lay + them out so that incrementing the leftmost index results in the + smallest change. + + This means that, in column-major languages, working our way + from type to target type corresponds to working through indices + from right to left, not left to right. */ + TYPE_CODE_ARRAY, + TYPE_CODE_STRUCT, /* C struct or Pascal record */ TYPE_CODE_UNION, /* C union or Pascal variant part */ TYPE_CODE_ENUM, /* Enumeration type */ + TYPE_CODE_FLAGS, /* Bit flags type */ TYPE_CODE_FUNC, /* Function type */ TYPE_CODE_INT, /* Integer type */ @@ -118,8 +105,20 @@ enum type_code TYPE_CODE_ERROR, /* C++ */ - TYPE_CODE_MEMBER, /* Member type */ TYPE_CODE_METHOD, /* Method type */ + + /* Pointer-to-member-function type. This describes how to access a + particular member function of a class (possibly a virtual + member function). The representation may vary between different + C++ ABIs. */ + TYPE_CODE_METHODPTR, + + /* Pointer-to-member type. This is the offset within a class to some + particular data member. The only currently supported representation + uses an unbiased offset, with -1 representing NULL; this is used + by the Itanium C++ ABI (used by GCC on all platforms). */ + TYPE_CODE_MEMBERPTR, + TYPE_CODE_REF, /* C++ Reference types */ TYPE_CODE_CHAR, /* *real* character type */ @@ -132,9 +131,15 @@ enum type_code TYPE_CODE_COMPLEX, /* Complex float */ TYPE_CODE_TYPEDEF, - TYPE_CODE_TEMPLATE, /* C++ template */ - TYPE_CODE_TEMPLATE_ARG /* C++ template arg */ + TYPE_CODE_NAMESPACE, /* C++ namespace. */ + + TYPE_CODE_DECFLOAT, /* Decimal floating point. */ + + TYPE_CODE_MODULE, /* Fortran module. */ + + /* Internal function type. */ + TYPE_CODE_INTERNAL_FUNCTION }; /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an @@ -145,27 +150,61 @@ enum type_code #define TYPE_CODE_CLASS TYPE_CODE_STRUCT -/* Some bits for the type's flags word, and macros to test them. */ +/* 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 << 6), + TYPE_FLAG_NOSIGN = (1 << 7), + TYPE_FLAG_STUB = (1 << 8), + TYPE_FLAG_TARGET_STUB = (1 << 9), + TYPE_FLAG_STATIC = (1 << 10), + TYPE_FLAG_PROTOTYPED = (1 << 11), + TYPE_FLAG_INCOMPLETE = (1 << 12), + TYPE_FLAG_VARARGS = (1 << 13), + TYPE_FLAG_VECTOR = (1 << 14), + TYPE_FLAG_FIXED_INSTANCE = (1 << 15), + TYPE_FLAG_STUB_SUPPORTED = (1 << 16), + TYPE_FLAG_NOTTEXT = (1 << 17), + + /* 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. */ +enum type_instance_flag_value +{ + TYPE_INSTANCE_FLAG_CONST = (1 << 0), + TYPE_INSTANCE_FLAG_VOLATILE = (1 << 1), + TYPE_INSTANCE_FLAG_CODE_SPACE = (1 << 2), + TYPE_INSTANCE_FLAG_DATA_SPACE = (1 << 3), + TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 = (1 << 4), + TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2 = (1 << 5) +}; /* Unsigned integer type. If this is not set for a TYPE_CODE_INT, the type is signed (unless TYPE_FLAG_NOSIGN (below) is set). */ -#define TYPE_FLAG_UNSIGNED (1 << 0) -#define TYPE_UNSIGNED(t) (TYPE_FLAGS (t) & TYPE_FLAG_UNSIGNED) +#define TYPE_UNSIGNED(t) (TYPE_MAIN_TYPE (t)->flag_unsigned) /* No sign for this type. In C++, "char", "signed char", and "unsigned char" are distinct types; so we need an extra flag to indicate the absence of a sign! */ -#define TYPE_FLAG_NOSIGN (1 << 1) -#define TYPE_NOSIGN(t) (TYPE_FLAGS (t) & TYPE_FLAG_NOSIGN) +#define TYPE_NOSIGN(t) (TYPE_MAIN_TYPE (t)->flag_nosign) /* 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 *)). */ -#define TYPE_FLAG_STUB (1 << 2) -#define TYPE_STUB(t) (TYPE_FLAGS (t) & TYPE_FLAG_STUB) +#define TYPE_STUB(t) (TYPE_MAIN_TYPE (t)->flag_stub) /* The target type of this type is a stub type, and this type needs to be updated if it gets un-stubbed in check_typedef. @@ -173,8 +212,7 @@ enum type_code gets set based on the TYPE_LENGTH of the target type. Also, set for TYPE_CODE_TYPEDEF. */ -#define TYPE_FLAG_TARGET_STUB (1 << 3) -#define TYPE_TARGET_STUB(t) (TYPE_FLAGS (t) & TYPE_FLAG_TARGET_STUB) +#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. @@ -182,30 +220,13 @@ enum type_code * are indicated by other means (bitpos == -1) */ -#define TYPE_FLAG_STATIC (1 << 4) -#define TYPE_STATIC(t) (TYPE_FLAGS (t) & TYPE_FLAG_STATIC) - -/* Constant type. If this is set, the corresponding type has a - * const modifier. - */ - -#define TYPE_FLAG_CONST (1 << 5) -#define TYPE_CONST(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_CONST) - -/* Volatile type. If this is set, the corresponding type has a - * volatile modifier. - */ - -#define TYPE_FLAG_VOLATILE (1 << 6) -#define TYPE_VOLATILE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_VOLATILE) - +#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 is used with a short field. */ -#define TYPE_FLAG_PROTOTYPED (1 << 7) -#define TYPE_PROTOTYPED(t) (TYPE_FLAGS (t) & TYPE_FLAG_PROTOTYPED) +#define TYPE_PROTOTYPED(t) (TYPE_MAIN_TYPE (t)->flag_prototyped) /* This flag is used to indicate that processing for this type is incomplete. @@ -215,8 +236,66 @@ enum type_code info; the incomplete type has to be marked so that the class and the method can be assigned correct types.) */ -#define TYPE_FLAG_INCOMPLETE (1 << 8) -#define TYPE_INCOMPLETE(t) (TYPE_FLAGS (t) & TYPE_FLAG_INCOMPLETE) +#define TYPE_INCOMPLETE(t) (TYPE_MAIN_TYPE (t)->flag_incomplete) + +/* FIXME drow/2002-06-03: Only used for methods, but applies as well + to functions. */ + +#define TYPE_VARARGS(t) (TYPE_MAIN_TYPE (t)->flag_varargs) + +/* Identify a vector type. Gcc is handling this by adding an extra + attribute to the array type. We slurp that in as a new flag of a + type. This is used only in dwarf2read.c. */ +#define TYPE_VECTOR(t) (TYPE_MAIN_TYPE (t)->flag_vector) + +/* The debugging formats (especially STABS) do not contain enough information + to represent all Ada types---especially those whose size depends on + dynamic quantities. Therefore, the GNAT Ada compiler includes + extra information in the form of additional type definitions + connected by naming conventions. This flag indicates that the + type is an ordinary (unencoded) GDB type that has been created from + the necessary run-time information, and does not need further + interpretation. Optionally marks ordinary, fixed-size GDB type. */ + +#define TYPE_FIXED_INSTANCE(t) (TYPE_MAIN_TYPE (t)->flag_fixed_instance) + +/* This debug target supports TYPE_STUB(t). In the unsupported case we have to + rely on NFIELDS to be zero etc., see TYPE_IS_OPAQUE (). + TYPE_STUB(t) with !TYPE_STUB_SUPPORTED(t) may exist if we only guessed + the TYPE_STUB(t) value (see dwarfread.c). */ + +#define TYPE_STUB_SUPPORTED(t) (TYPE_MAIN_TYPE (t)->flag_stub_supported) + +/* Not textual. By default, GDB treats all single byte integers as + characters (or elements of strings) unless this flag is set. */ + +#define TYPE_NOTTEXT(t) (TYPE_MAIN_TYPE (t)->flag_nottext) + +/* Type owner. If TYPE_OBJFILE_OWNED is true, the type is owned by + the objfile retrieved as TYPE_OBJFILE. Otherweise, 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) +#define TYPE_OWNER(t) TYPE_MAIN_TYPE(t)->owner +#define TYPE_OBJFILE(t) (TYPE_OBJFILE_OWNED(t)? TYPE_OWNER(t).objfile : NULL) + +/* True if this type was declared using the "class" keyword. This is + only valid for C++ structure types, and only used for displaying + the type. If false, the structure was declared as a "struct". */ + +#define TYPE_DECLARED_CLASS(t) (TYPE_MAIN_TYPE (t)->flag_declared_class) + +/* 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) + +/* 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) /* Instruction-space delimited type. This is for Harvard architectures which have separate instruction and data address spaces (and perhaps @@ -237,50 +316,112 @@ enum type_code If neither flag is set, the default space for functions / methods is instruction space, and for data objects is data memory. */ -#define TYPE_FLAG_CODE_SPACE (1 << 9) -#define TYPE_CODE_SPACE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_CODE_SPACE) - -#define TYPE_FLAG_DATA_SPACE (1 << 10) -#define TYPE_DATA_SPACE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_DATA_SPACE) - -/* FIXME drow/2002-06-03: Only used for methods, but applies as well - to functions. */ - -#define TYPE_FLAG_VARARGS (1 << 11) -#define TYPE_VARARGS(t) (TYPE_FLAGS (t) & TYPE_FLAG_VARARGS) +#define TYPE_CODE_SPACE(t) \ + (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_CODE_SPACE) -/* Identify a vector type. Gcc is handling this by adding an extra - attribute to the array type. We slurp that in as a new flag of a - type. This is used only in dwarf2read.c. */ -#define TYPE_FLAG_VECTOR (1 << 12) -#define TYPE_VECTOR(t) (TYPE_FLAGS (t) & TYPE_FLAG_VECTOR) +#define TYPE_DATA_SPACE(t) \ + (TYPE_INSTANCE_FLAGS (t) & TYPE_INSTANCE_FLAG_DATA_SPACE) /* 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 target specific ways to represent these different types of address classes. */ -#define TYPE_FLAG_ADDRESS_CLASS_1 (1 << 13) #define TYPE_ADDRESS_CLASS_1(t) (TYPE_INSTANCE_FLAGS(t) \ - & TYPE_FLAG_ADDRESS_CLASS_1) -#define TYPE_FLAG_ADDRESS_CLASS_2 (1 << 14) + & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) #define TYPE_ADDRESS_CLASS_2(t) (TYPE_INSTANCE_FLAGS(t) \ - & TYPE_FLAG_ADDRESS_CLASS_2) -#define TYPE_FLAG_ADDRESS_CLASS_ALL (TYPE_FLAG_ADDRESS_CLASS_1 \ - | TYPE_FLAG_ADDRESS_CLASS_2) + & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) +#define TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL \ + (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) #define TYPE_ADDRESS_CLASS_ALL(t) (TYPE_INSTANCE_FLAGS(t) \ - & TYPE_FLAG_ADDRESS_CLASS_ALL) + & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) + +/* Determine which field of the union main_type.fields[x].loc is used. */ + +enum field_loc_kind + { + FIELD_LOC_KIND_BITPOS, /* bitpos */ + FIELD_LOC_KIND_PHYSADDR, /* physaddr */ + FIELD_LOC_KIND_PHYSNAME, /* physname */ + FIELD_LOC_KIND_DWARF_BLOCK /* dwarf_block */ + }; + +/* A discriminant to determine which field in the main_type.type_specific + union is being used, if any. + + For types such as TYPE_CODE_FLT or TYPE_CODE_FUNC, the use of this + discriminant is really redundant, as we know from the type code + which field is going to be used. As such, it would be possible to + reduce the size of this enum in order to save a bit or two for + other fields of struct main_type. But, since we still have extra + room , and for the sake of clarity and consistency, we treat all fields + of the union the same way. */ + +enum type_specific_kind +{ + TYPE_SPECIFIC_NONE, + TYPE_SPECIFIC_CPLUS_STUFF, + TYPE_SPECIFIC_GNAT_STUFF, + TYPE_SPECIFIC_FLOATFORMAT, + TYPE_SPECIFIC_CALLING_CONVENTION +}; + +/* This structure is space-critical. + Its layout has been tweaked to reduce the space used. */ struct main_type { /* Code for kind of type */ - enum type_code code; + ENUM_BITFIELD(type_code) code : 8; + + /* Flags about this type. These fields appear at this location + because they packs nicely here. See the TYPE_* macros for + documentation about these fields. */ + + unsigned int flag_unsigned : 1; + unsigned int flag_nosign : 1; + unsigned int flag_stub : 1; + unsigned int flag_target_stub : 1; + unsigned int flag_static : 1; + unsigned int flag_prototyped : 1; + unsigned int flag_incomplete : 1; + unsigned int flag_varargs : 1; + unsigned int flag_vector : 1; + unsigned int flag_stub_supported : 1; + unsigned int flag_nottext : 1; + unsigned int flag_fixed_instance : 1; + unsigned int flag_objfile_owned : 1; + /* True if this type was declared with "class" rather than + "struct". */ + unsigned int flag_declared_class : 1; + + /* A discriminant telling us which field of the type_specific union + is being used for this type, if any. */ + ENUM_BITFIELD(type_specific_kind) type_specific_field : 3; + + /* Number of fields described for this type. This field appears at + this location because it packs nicely here. */ + + short nfields; + + /* Field number of the virtual function table pointer in + VPTR_BASETYPE. If -1, we were unable to find the virtual + function table pointer in initial symbol reading, and + get_vptr_fieldno should be called to find it if possible. + get_vptr_fieldno will update this field if possible. + Otherwise the value is left at -1. + + Unused if this type does not have virtual functions. + + This field appears at this location because it packs nicely here. */ + + short vptr_fieldno; /* 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_NAMESPACE. */ + For looking up a name, look for a symbol in the VAR_DOMAIN. */ char *name; @@ -291,51 +432,14 @@ struct main_type 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_NAMESPACE. + 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. */ char *tag_name; - /* 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; - - /* FIXME, these should probably be restricted to a Fortran-specific - field in some fashion. */ -#define BOUND_CANNOT_BE_DETERMINED 5 -#define BOUND_BY_REF_ON_STACK 4 -#define BOUND_BY_VALUE_ON_STACK 3 -#define BOUND_BY_REF_IN_REG 2 -#define BOUND_BY_VALUE_IN_REG 1 -#define BOUND_SIMPLE 0 - int upper_bound_type; - int lower_bound_type; - /* Every type is now associated with a particular objfile, and the - type is allocated on the type_obstack for that objfile. One problem + type is allocated on the objfile_obstack for that objfile. One problem however, is that there are times when gdb allocates new types while it is not in the process of reading symbols from a particular objfile. Fortunately, these happen when the type being created is a derived @@ -346,25 +450,24 @@ struct main_type major overhaul of the internal type system, it can't be avoided for now. */ - struct objfile *objfile; + union type_owner + { + struct objfile *objfile; + struct gdbarch *gdbarch; + } owner; /* For a pointer type, describes the type of object pointed to. For an array type, describes the type of the elements. For a function or method type, describes the type of the return value. For a range type, describes the type of the full range. For a complex type, describes the type of each coordinate. + For a special record or union type encoding a dynamic-sized type + in GNAT, a memoized pointer to a corresponding static version of + the type. Unused otherwise. */ struct type *target_type; - /* Flags about this type. */ - - int flags; - - /* Number of fields described for this type */ - - short nfields; - /* For structure and union types, a description of each field. For set and pascal array types, there is one "field", whose type is the domain type of the set or array. @@ -381,63 +484,94 @@ struct main_type because we can allocate the space for a type before we know what to put in it. */ - struct field + union { - union field_location + struct field { - /* Position of this field, counting in bits from start of - containing structure. - For BITS_BIG_ENDIAN=1 targets, it is the bit offset to the MSB. - For BITS_BIG_ENDIAN=0 targets, it is the bit offset to the LSB. - For a range bound or enum value, this is the value itself. */ + 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. + For a range bound or enum value, this is the value itself. */ + + int bitpos; + + /* For a static field, if TYPE_FIELD_STATIC_HAS_ADDR then physaddr + is the location (in the target) of the static field. + Otherwise, physname is the mangled label of the static field. */ + + CORE_ADDR physaddr; + char *physname; + + /* The field location can be computed by evaluating the following DWARF + block. This can be used in Fortran variable-length arrays, for + instance. */ + + struct dwarf2_locexpr_baton *dwarf_block; + } + loc; + + /* For a function or member type, this is 1 if the argument is marked + artificial. Artificial arguments should not be shown to the + user. For TYPE_CODE_RANGE it is set if the specific bound is not + defined. */ + unsigned int artificial : 1; - int bitpos; + /* Discriminant for union field_location. */ + ENUM_BITFIELD(field_loc_kind) loc_kind : 2; - /* For a static field, if TYPE_FIELD_STATIC_HAS_ADDR then physaddr - is the location (in the target) of the static field. - Otherwise, physname is the mangled label of the static field. */ + /* Size of this field, in bits, or zero if not packed. + If non-zero in an array type, indicates the element size in + bits (used only in Ada at the moment). + For an unpacked field, the field's type's length + says how many bytes the field occupies. */ - CORE_ADDR physaddr; - char *physname; - } - loc; + unsigned int bitsize : 29; - /* For a function or member type, this is 1 if the argument is marked - artificial. Artificial arguments should not be shown to the - user. */ - unsigned int artificial : 1; + /* In a struct or union type, type of this field. + In a function or member type, type of this argument. + In an array type, the domain-type of the array. */ - /* This flag is zero for non-static fields, 1 for fields whose location - is specified by the label loc.physname, and 2 for fields whose location - is specified by loc.physaddr. */ + struct type *type; - unsigned int static_kind : 2; + /* Name of field, value or argument. + NULL for range bounds, array domains, and member function + arguments. */ - /* Size of this field, in bits, or zero if not packed. - For an unpacked field, the field's type's length - says how many bytes the field occupies. */ + char *name; + } *fields; - unsigned int bitsize : 29; + /* Union member used for range types. */ - /* In a struct or union type, type of this field. - In a function or member type, type of this argument. - In an array type, the domain-type of the array. */ + struct range_bounds + { + /* Low bound of range. */ + + LONGEST low; - struct type *type; + /* High bound of range. */ - /* Name of field, value or argument. - NULL for range bounds, array domains, and member function - arguments. */ + LONGEST high; - char *name; + /* Flags indicating whether the values of low and high are + valid. When true, the respective range value is + undefined. Currently used only for FORTRAN arrays. */ + + char low_undefined; + char high_undefined; - } *fields; + } *bounds; + + } flds_bnds; /* For types with virtual functions (TYPE_CODE_STRUCT), VPTR_BASETYPE is the base class which defined the virtual function table pointer. - For types that are pointer to member types (TYPE_CODE_MEMBER), - VPTR_BASETYPE is the type that this pointer is a member of. + For types that are pointer to member types (TYPE_CODE_METHODPTR, + TYPE_CODE_MEMBERPTR), VPTR_BASETYPE is the type that this pointer + is a member of. For method types (TYPE_CODE_METHOD), VPTR_BASETYPE is the aggregate type that contains the method. @@ -446,15 +580,6 @@ struct main_type struct type *vptr_basetype; - /* Field number of the virtual function table pointer in - VPTR_BASETYPE. If -1, we were unable to find the virtual - function table pointer in initial symbol reading, and - fill_in_vptr_fieldno should be called to find it if possible. - - Unused if this type does not have virtual functions. */ - - int vptr_fieldno; - /* Slot to point to additional language-specific fields of this type. */ union type_specific @@ -465,11 +590,21 @@ struct main_type struct cplus_struct_type *cplus_stuff; - /* FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to the - floatformat object that describes the floating-point value - that resides within the type. */ + /* GNAT_STUFF is for types for which the GNAT Ada compiler + provides additional information. */ + 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. */ + + const struct floatformat **floatformat; - const struct floatformat *floatformat; + /* For TYPE_CODE_FUNC types, the calling convention for targets + supporting multiple ABIs. Right now this is only fetched from + the Dwarf-2 DW_AT_calling_convention attribute. */ + unsigned calling_convention; } type_specific; }; @@ -489,15 +624,42 @@ struct type struct type *reference_type; /* Variant chain. This points to a type that differs from this one only - in qualifiers. Currently, the possible qualifiers are const, volatile, - code-space, and data-space. The variants are linked in a circular - ring and share MAIN_TYPE. */ + in qualifiers and length. Currently, the possible qualifiers are + const, volatile, code-space, data-space, and address class. The + length may differ only when one of the address class flags are set. + The variants are linked in a circular ring and share MAIN_TYPE. */ struct type *chain; /* Flags specific to this instance of the type, indicating where on the ring we are. */ 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; + /* Core type, shared by a group of qualified types. */ struct main_type *main_type; }; @@ -526,19 +688,12 @@ struct cplus_struct_type short nfn_fields_total; - /* The "declared_type" field contains a code saying how the - user really declared this type, e.g., "class s", "union s", - "struct s". - The 3 above things come out from the C++ compiler looking like classes, - but we keep track of the real declaration so we can give - the correct information on "ptype". (Note: TEMPLATE may not - belong in this list...) */ - -#define DECLARED_TYPE_CLASS 0 -#define DECLARED_TYPE_UNION 1 -#define DECLARED_TYPE_STRUCT 2 -#define DECLARED_TYPE_TEMPLATE 3 - short declared_type; /* One of the above codes */ + /* One if this struct is a dynamic class, as defined by the + Itanium C++ ABI: if it requires a virtual table pointer, + because it or any of its base classes have one or more virtual + member functions or virtual base classes. Minus one if not + dynamic. Zero if not yet computed. */ + int is_dynamic : 2; /* For derived classes, the number of base classes is given by n_baseclasses and virtual_field_bits is a bit vector containing one bit per base class. @@ -640,11 +795,8 @@ struct cplus_struct_type to reconstruct the rest of the fields). */ unsigned int is_stub:1; - /* C++ method that is inlined */ - unsigned int is_inlined:1; - /* Unused. */ - unsigned int dummy:3; + unsigned int dummy:4; /* Index into that baseclass's virtual function table, minus 2; else if static: VOFFSET_STATIC; else: 0. */ @@ -659,55 +811,6 @@ struct cplus_struct_type } *fn_fieldlists; - /* If this "struct type" describes a template, then it - * has arguments. "template_args" points to an array of - * template arg descriptors, of length "ntemplate_args". - * The only real information in each of these template arg descriptors - * is a name. "type" will typically just point to a "struct type" with - * the placeholder TYPE_CODE_TEMPLATE_ARG type. - */ - short ntemplate_args; - struct template_arg - { - char *name; - struct type *type; - } - *template_args; - - /* If this "struct type" describes a template, it has a list - * of instantiations. "instantiations" is a pointer to an array - * of type's, one representing each instantiation. There - * are "ninstantiations" elements in this array. - */ - short ninstantiations; - struct type **instantiations; - - /* The following points to information relevant to the runtime model - * of the compiler. - * Currently being used only for HP's ANSI C++ compiler. - * (This type may have to be changed/enhanced for other compilers.) - * - * RUNTIME_PTR is NULL if there is no runtime information (currently - * this means the type was not compiled by HP aCC). - * - * Fields in structure pointed to: - * ->HAS_VTABLE : 0 => no virtual table, 1 => vtable present - * - * ->PRIMARY_BASE points to the first non-virtual base class that has - * a virtual table. - * - * ->VIRTUAL_BASE_LIST points to a list of struct type * pointers that - * point to the type information for all virtual bases among this type's - * ancestors. - */ - struct runtime_info - { - short has_vtable; - struct type *primary_base; - struct type **virtual_base_list; - } - *runtime_ptr; - /* Pointer to information about enclosing scope, if this is a * local type. If it is not a local type, this is NULL */ @@ -733,6 +836,15 @@ struct badness_vector int *rank; }; +/* GNAT Ada-specific information for various Ada types. */ +struct gnat_aux_type + { + /* Parallel type used to encode information about dynamic types + used in Ada (such as variant records, variable-size array, + etc). */ + struct type* descriptive_type; + }; + /* The default value of TYPE_CPLUS_SPECIFIC(T) points to the this shared static structure. */ @@ -741,10 +853,27 @@ extern const struct cplus_struct_type cplus_struct_default; extern void allocate_cplus_struct_type (struct type *); #define INIT_CPLUS_SPECIFIC(type) \ - (TYPE_CPLUS_SPECIFIC(type)=(struct cplus_struct_type*)&cplus_struct_default) + (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_CPLUS_STUFF, \ + TYPE_RAW_CPLUS_SPECIFIC (type) = (struct cplus_struct_type*) &cplus_struct_default) + #define ALLOCATE_CPLUS_STRUCT_TYPE(type) allocate_cplus_struct_type (type) + #define HAVE_CPLUS_STRUCT(type) \ - (TYPE_CPLUS_SPECIFIC(type) != &cplus_struct_default) + (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_CPLUS_STUFF \ + && TYPE_RAW_CPLUS_SPECIFIC (type) != &cplus_struct_default) + +extern const struct gnat_aux_type gnat_aux_default; + +extern void allocate_gnat_aux_type (struct type *); + +#define INIT_GNAT_SPECIFIC(type) \ + (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_GNAT_STUFF, \ + TYPE_GNAT_SPECIFIC (type) = (struct gnat_aux_type *) &gnat_aux_default) +#define ALLOCATE_GNAT_AUX_TYPE(type) allocate_gnat_aux_type (type) +/* A macro that returns non-zero if the type-specific data should be + read as "gnat-stuff". */ +#define HAVE_GNAT_AUX_INFO(type) \ + (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_GNAT_STUFF) #define TYPE_INSTANCE_FLAGS(thistype) (thistype)->instance_flags #define TYPE_MAIN_TYPE(thistype) (thistype)->main_type @@ -758,33 +887,34 @@ extern void allocate_cplus_struct_type (struct type *); 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) TYPE_MAIN_TYPE(thistype)->length -#define TYPE_OBJFILE(thistype) TYPE_MAIN_TYPE(thistype)->objfile -#define TYPE_FLAGS(thistype) TYPE_MAIN_TYPE(thistype)->flags +#define TYPE_LENGTH(thistype) (thistype)->length /* 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 #define TYPE_NFIELDS(thistype) TYPE_MAIN_TYPE(thistype)->nfields -#define TYPE_FIELDS(thistype) TYPE_MAIN_TYPE(thistype)->fields -#define TYPE_TEMPLATE_ARGS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->template_args -#define TYPE_INSTANTIATIONS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->instantiations +#define TYPE_FIELDS(thistype) TYPE_MAIN_TYPE(thistype)->flds_bnds.fields #define TYPE_INDEX_TYPE(type) TYPE_FIELD_TYPE (type, 0) -#define TYPE_LOW_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 0) -#define TYPE_HIGH_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 1) +#define TYPE_RANGE_DATA(thistype) TYPE_MAIN_TYPE(thistype)->flds_bnds.bounds +#define TYPE_LOW_BOUND(range_type) TYPE_RANGE_DATA(range_type)->low +#define TYPE_HIGH_BOUND(range_type) TYPE_RANGE_DATA(range_type)->high +#define TYPE_LOW_BOUND_UNDEFINED(range_type) \ + TYPE_RANGE_DATA(range_type)->low_undefined +#define TYPE_HIGH_BOUND_UNDEFINED(range_type) \ + TYPE_RANGE_DATA(range_type)->high_undefined /* Moto-specific stuff for FORTRAN arrays */ -#define TYPE_ARRAY_UPPER_BOUND_TYPE(thistype) \ - TYPE_MAIN_TYPE(thistype)->upper_bound_type -#define TYPE_ARRAY_LOWER_BOUND_TYPE(thistype) \ - TYPE_MAIN_TYPE(thistype)->lower_bound_type +#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ + TYPE_HIGH_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) +#define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ + TYPE_LOW_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) #define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ - (TYPE_FIELD_BITPOS((TYPE_FIELD_TYPE((arraytype),0)),1)) + (TYPE_HIGH_BOUND(TYPE_INDEX_TYPE((arraytype)))) #define TYPE_ARRAY_LOWER_BOUND_VALUE(arraytype) \ - (TYPE_FIELD_BITPOS((TYPE_FIELD_TYPE((arraytype),0)),0)) + (TYPE_LOW_BOUND(TYPE_INDEX_TYPE((arraytype)))) /* C++ */ @@ -794,18 +924,30 @@ extern void allocate_cplus_struct_type (struct type *); #define TYPE_FN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fields #define TYPE_NFN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields #define TYPE_NFN_FIELDS_TOTAL(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields_total -#define TYPE_NTEMPLATE_ARGS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->ntemplate_args -#define TYPE_NINSTANTIATIONS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->ninstantiations -#define TYPE_DECLARED_TYPE(thistype) TYPE_CPLUS_SPECIFIC(thistype)->declared_type +#define TYPE_SPECIFIC_FIELD(thistype) \ + TYPE_MAIN_TYPE(thistype)->type_specific_field #define TYPE_TYPE_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific -#define TYPE_CPLUS_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.cplus_stuff +/* We need this tap-dance with the TYPE_RAW_SPECIFIC because of the case + where we're trying to print an Ada array using the C language. + In that case, there is no "cplus_stuff", but the C language assumes + that there is. What we do, in that case, is pretend that there is + an implicit one which is the default cplus stuff. */ +#define TYPE_CPLUS_SPECIFIC(thistype) \ + (!HAVE_CPLUS_STRUCT(thistype) \ + ? (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_FLOATFORMAT(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.floatformat -#define TYPE_BASECLASS(thistype,index) TYPE_MAIN_TYPE(thistype)->fields[index].type +#define TYPE_GNAT_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.gnat_stuff +#define TYPE_DESCRIPTIVE_TYPE(thistype) TYPE_GNAT_SPECIFIC(thistype)->descriptive_type +#define TYPE_CALLING_CONVENTION(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.calling_convention +#define TYPE_BASECLASS(thistype,index) TYPE_FIELD_TYPE(thistype, index) #define TYPE_N_BASECLASSES(thistype) TYPE_CPLUS_SPECIFIC(thistype)->n_baseclasses -#define TYPE_BASECLASS_NAME(thistype,index) TYPE_MAIN_TYPE(thistype)->fields[index].name +#define TYPE_BASECLASS_NAME(thistype,index) TYPE_FIELD_NAME(thistype, index) #define TYPE_BASECLASS_BITPOS(thistype,index) TYPE_FIELD_BITPOS(thistype,index) #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 BASETYPE_VIA_VIRTUAL(thistype, index) \ (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \ @@ -813,25 +955,37 @@ extern void allocate_cplus_struct_type (struct type *); #define FIELD_TYPE(thisfld) ((thisfld).type) #define FIELD_NAME(thisfld) ((thisfld).name) +#define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind) #define FIELD_BITPOS(thisfld) ((thisfld).loc.bitpos) +#define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) +#define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr) +#define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block) +#define SET_FIELD_BITPOS(thisfld, bitpos) \ + (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_BITPOS, \ + FIELD_BITPOS (thisfld) = (bitpos)) +#define SET_FIELD_PHYSNAME(thisfld, name) \ + (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \ + FIELD_STATIC_PHYSNAME (thisfld) = (name)) +#define SET_FIELD_PHYSADDR(thisfld, addr) \ + (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR, \ + FIELD_STATIC_PHYSADDR (thisfld) = (addr)) +#define SET_FIELD_DWARF_BLOCK(thisfld, addr) \ + (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_DWARF_BLOCK, \ + FIELD_DWARF_BLOCK (thisfld) = (addr)) #define FIELD_ARTIFICIAL(thisfld) ((thisfld).artificial) #define FIELD_BITSIZE(thisfld) ((thisfld).bitsize) -#define FIELD_STATIC_KIND(thisfld) ((thisfld).static_kind) -#define FIELD_PHYSNAME(thisfld) ((thisfld).loc.physname) -#define FIELD_PHYSADDR(thisfld) ((thisfld).loc.physaddr) -#define SET_FIELD_PHYSNAME(thisfld, name) \ - ((thisfld).static_kind = 1, FIELD_PHYSNAME(thisfld) = (name)) -#define SET_FIELD_PHYSADDR(thisfld, name) \ - ((thisfld).static_kind = 2, FIELD_PHYSADDR(thisfld) = (name)) -#define TYPE_FIELD(thistype, n) TYPE_MAIN_TYPE(thistype)->fields[n] + +#define TYPE_FIELD(thistype, n) TYPE_MAIN_TYPE(thistype)->flds_bnds.fields[n] #define TYPE_FIELD_TYPE(thistype, n) FIELD_TYPE(TYPE_FIELD(thistype, n)) #define TYPE_FIELD_NAME(thistype, n) FIELD_NAME(TYPE_FIELD(thistype, n)) -#define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS(TYPE_FIELD(thistype,n)) +#define TYPE_FIELD_LOC_KIND(thistype, n) FIELD_LOC_KIND (TYPE_FIELD (thistype, n)) +#define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n)) +#define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n)) +#define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n)) +#define TYPE_FIELD_DWARF_BLOCK(thistype, n) FIELD_DWARF_BLOCK (TYPE_FIELD (thistype, n)) #define TYPE_FIELD_ARTIFICIAL(thistype, n) FIELD_ARTIFICIAL(TYPE_FIELD(thistype,n)) #define TYPE_FIELD_BITSIZE(thistype, n) FIELD_BITSIZE(TYPE_FIELD(thistype,n)) #define TYPE_FIELD_PACKED(thistype, n) (FIELD_BITSIZE(TYPE_FIELD(thistype,n))!=0) -#define TYPE_TEMPLATE_ARG(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->template_args[n] -#define TYPE_INSTANTIATION(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->instantiations[n] #define TYPE_FIELD_PRIVATE_BITS(thistype) \ TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits @@ -862,12 +1016,6 @@ extern void allocate_cplus_struct_type (struct type *); (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \ : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (n))) -#define TYPE_FIELD_STATIC(thistype, n) (TYPE_MAIN_TYPE (thistype)->fields[n].static_kind != 0) -#define TYPE_FIELD_STATIC_KIND(thistype, n) TYPE_MAIN_TYPE (thistype)->fields[n].static_kind -#define TYPE_FIELD_STATIC_HAS_ADDR(thistype, n) (TYPE_MAIN_TYPE (thistype)->fields[n].static_kind == 2) -#define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_PHYSNAME(TYPE_FIELD(thistype, n)) -#define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_PHYSADDR(TYPE_FIELD(thistype, n)) - #define TYPE_FN_FIELDLISTS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists #define TYPE_FN_FIELDLIST(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n] #define TYPE_FN_FIELDLIST1(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n].fn_fields @@ -890,18 +1038,11 @@ extern void allocate_cplus_struct_type (struct type *); #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_INLINED(thisfn, n) ((thisfn)[n].is_inlined) #define TYPE_FN_FIELD_FCONTEXT(thisfn, n) ((thisfn)[n].fcontext) #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_RUNTIME_PTR(thistype) (TYPE_CPLUS_SPECIFIC(thistype)->runtime_ptr) -#define TYPE_VTABLE(thistype) (TYPE_RUNTIME_PTR(thistype)->has_vtable) -#define TYPE_HAS_VTABLE(thistype) (TYPE_RUNTIME_PTR(thistype) && TYPE_VTABLE(thistype)) -#define TYPE_PRIMARY_BASE(thistype) (TYPE_RUNTIME_PTR(thistype)->primary_base) -#define TYPE_VIRTUAL_BASE_LIST(thistype) (TYPE_RUNTIME_PTR(thistype)->virtual_base_list) - #define TYPE_LOCALTYPE_PTR(thistype) (TYPE_CPLUS_SPECIFIC(thistype)->localtype_ptr) #define TYPE_LOCALTYPE_FILE(thistype) (TYPE_CPLUS_SPECIFIC(thistype)->localtype_ptr->file) #define TYPE_LOCALTYPE_LINE(thistype) (TYPE_CPLUS_SPECIFIC(thistype)->localtype_ptr->line) @@ -909,176 +1050,216 @@ extern void allocate_cplus_struct_type (struct type *); #define TYPE_IS_OPAQUE(thistype) (((TYPE_CODE (thistype) == TYPE_CODE_STRUCT) || \ (TYPE_CODE (thistype) == TYPE_CODE_UNION)) && \ (TYPE_NFIELDS (thistype) == 0) && \ - (TYPE_CPLUS_SPECIFIC (thistype) && (TYPE_NFN_FIELDS (thistype) == 0))) - - - -/* Implicit sizes */ -extern struct type *builtin_type_void; -extern struct type *builtin_type_char; -extern struct type *builtin_type_short; -extern struct type *builtin_type_int; -extern struct type *builtin_type_long; -extern struct type *builtin_type_signed_char; -extern struct type *builtin_type_unsigned_char; -extern struct type *builtin_type_unsigned_short; -extern struct type *builtin_type_unsigned_int; -extern struct type *builtin_type_unsigned_long; -extern struct type *builtin_type_float; -extern struct type *builtin_type_double; -extern struct type *builtin_type_long_double; -extern struct type *builtin_type_complex; -extern struct type *builtin_type_double_complex; -extern struct type *builtin_type_string; -extern struct type *builtin_type_bool; - -/* Address/pointer types: */ -/* (C) Language `pointer to data' type. Some target platforms use an - implicitly {sign,zero} -extended 32 bit C language pointer on a 64 - bit ISA. */ -extern struct type *builtin_type_void_data_ptr; - -/* (C) Language `pointer to function returning void' type. Since - ANSI, C standards have explicitly said that pointers to functions - and pointers to data are not interconvertible --- that is, you - can't cast a function pointer to void * and back, and expect to get - the same value. However, all function pointer types are - interconvertible, so void (*) () can server as a generic function - pointer. */ -extern struct type *builtin_type_void_func_ptr; - -/* The target CPU's address type. This is the ISA address size. */ -extern struct type *builtin_type_CORE_ADDR; -/* The symbol table address type. Some object file formats have a 32 - bit address type even though the TARGET has a 64 bit pointer type - (cf MIPS). */ -extern struct type *builtin_type_bfd_vma; - -/* Explicit sizes - see C9X for naming scheme */ -extern struct type *builtin_type_int8; -extern struct type *builtin_type_uint8; -extern struct type *builtin_type_int16; -extern struct type *builtin_type_uint16; -extern struct type *builtin_type_int32; -extern struct type *builtin_type_uint32; -extern struct type *builtin_type_int64; -extern struct type *builtin_type_uint64; -extern struct type *builtin_type_int128; -extern struct type *builtin_type_uint128; - -/* SIMD types. We inherit these names from GCC. */ -extern struct type *builtin_type_v4sf; -extern struct type *builtin_type_v4si; -extern struct type *builtin_type_v16qi; -extern struct type *builtin_type_v8qi; -extern struct type *builtin_type_v8hi; -extern struct type *builtin_type_v4hi; -extern struct type *builtin_type_v2si; - -/* Type for 64 bit vectors. */ -extern struct type *builtin_type_vec64; -extern struct type *builtin_type_vec64i; - -/* Type for 128 bit vectors. */ -extern struct type *builtin_type_vec128; -extern struct type *builtin_type_vec128i; + (!HAVE_CPLUS_STRUCT (thistype) \ + || TYPE_NFN_FIELDS (thistype) == 0) && \ + (TYPE_STUB (thistype) || !TYPE_STUB_SUPPORTED (thistype))) + +struct builtin_type +{ + /* Integral types. */ + + /* Implicit size/sign (based on the the architecture's ABI). */ + struct type *builtin_void; + struct type *builtin_char; + struct type *builtin_short; + struct type *builtin_int; + struct type *builtin_long; + struct type *builtin_signed_char; + struct type *builtin_unsigned_char; + struct type *builtin_unsigned_short; + struct type *builtin_unsigned_int; + struct type *builtin_unsigned_long; + struct type *builtin_float; + struct type *builtin_double; + struct type *builtin_long_double; + struct type *builtin_complex; + struct type *builtin_double_complex; + struct type *builtin_string; + struct type *builtin_bool; + struct type *builtin_long_long; + struct type *builtin_unsigned_long_long; + struct type *builtin_decfloat; + struct type *builtin_decdouble; + struct type *builtin_declong; + + /* "True" character types. + We use these for the '/c' print format, because c_char is just a + one-byte integral type, which languages less laid back than C + will print as ... well, a one-byte integral type. */ + struct type *builtin_true_char; + struct type *builtin_true_unsigned_char; + + /* Explicit sizes - see C9X for naming scheme. The "int0" + is for when an architecture needs to describe a register that has + no size. */ + struct type *builtin_int0; + struct type *builtin_int8; + struct type *builtin_uint8; + struct type *builtin_int16; + struct type *builtin_uint16; + struct type *builtin_int32; + struct type *builtin_uint32; + struct type *builtin_int64; + struct type *builtin_uint64; + struct type *builtin_int128; + struct type *builtin_uint128; + + /* Wide character types. */ + struct type *builtin_char16; + struct type *builtin_char32; + + /* Pointer types. */ + + /* `pointer to data' type. Some target platforms use an implicitly + {sign,zero} -extended 32-bit ABI pointer on a 64-bit ISA. */ + struct type *builtin_data_ptr; + + /* `pointer to function (returning void)' type. Harvard + architectures mean that ABI function and code pointers are not + interconvertible. Similarly, since ANSI, C standards have + explicitly said that pointers to functions and pointers to data + are not interconvertible --- that is, you can't cast a function + pointer to void * and back, and expect to get the same value. + However, all function pointer types are interconvertible, so void + (*) () can server as a generic function pointer. */ + struct type *builtin_func_ptr; + + + /* Special-purpose types. */ + + /* This type is used to represent a GDB internal function. */ + struct type *internal_fn; +}; + +/* Return the type table for the specified architecture. */ +extern const struct builtin_type *builtin_type (struct gdbarch *gdbarch); + + +/* Per-objfile types used by symbol readers. */ + +struct objfile_type +{ + /* Basic types based on the objfile architecture. */ + struct type *builtin_void; + struct type *builtin_char; + struct type *builtin_short; + struct type *builtin_int; + struct type *builtin_long; + struct type *builtin_long_long; + struct type *builtin_signed_char; + struct type *builtin_unsigned_char; + struct type *builtin_unsigned_short; + struct type *builtin_unsigned_int; + struct type *builtin_unsigned_long; + struct type *builtin_unsigned_long_long; + struct type *builtin_float; + struct type *builtin_double; + struct type *builtin_long_double; + + /* This type is used to represent symbol addresses. */ + struct type *builtin_core_addr; + + /* This type represents a type that was unrecognized in symbol read-in. */ + struct type *builtin_error; + + /* Types used for symbols with no debug information. */ + struct type *nodebug_text_symbol; + struct type *nodebug_data_symbol; + struct type *nodebug_unknown_symbol; + struct type *nodebug_tls_symbol; +}; + +/* Return the type table for the specified objfile. */ +extern const struct objfile_type *objfile_type (struct objfile *objfile); + /* Explicit floating-point formats. See "floatformat.h". */ -extern struct type *builtin_type_ieee_single_big; -extern struct type *builtin_type_ieee_single_little; -extern struct type *builtin_type_ieee_double_big; -extern struct type *builtin_type_ieee_double_little; -extern struct type *builtin_type_ieee_double_littlebyte_bigword; -extern struct type *builtin_type_i387_ext; -extern struct type *builtin_type_m68881_ext; -extern struct type *builtin_type_i960_ext; -extern struct type *builtin_type_m88110_ext; -extern struct type *builtin_type_m88110_harris_ext; -extern struct type *builtin_type_arm_ext_big; -extern struct type *builtin_type_arm_ext_littlebyte_bigword; -extern struct type *builtin_type_ia64_spill_big; -extern struct type *builtin_type_ia64_spill_little; -extern struct type *builtin_type_ia64_quad_big; -extern struct type *builtin_type_ia64_quad_little; - -/* We use this for the '/c' print format, because builtin_type_char is - just a one-byte integral type, which languages less laid back than - C will print as ... well, a one-byte integral type. */ -extern struct type *builtin_type_true_char; - -/* This type represents a type that was unrecognized in symbol - read-in. */ - -extern struct type *builtin_type_error; - -extern struct type *builtin_type_long_long; -extern struct type *builtin_type_unsigned_long_long; - -/* Modula-2 types */ - -extern struct type *builtin_type_m2_char; -extern struct type *builtin_type_m2_int; -extern struct type *builtin_type_m2_card; -extern struct type *builtin_type_m2_real; -extern struct type *builtin_type_m2_bool; - -/* Fortran (F77) types */ - -extern struct type *builtin_type_f_character; -extern struct type *builtin_type_f_integer; -extern struct type *builtin_type_f_integer_s2; -extern struct type *builtin_type_f_logical; -extern struct type *builtin_type_f_logical_s1; -extern struct type *builtin_type_f_logical_s2; -extern struct type *builtin_type_f_real; -extern struct type *builtin_type_f_real_s8; -extern struct type *builtin_type_f_real_s16; -extern struct type *builtin_type_f_complex_s8; -extern struct type *builtin_type_f_complex_s16; -extern struct type *builtin_type_f_complex_s32; -extern struct type *builtin_type_f_void; - -/* RTTI for C++ */ -/* extern struct type *builtin_type_cxx_typeinfo; */ - -/* Maximum and minimum values of built-in types */ - -#define MAX_OF_TYPE(t) \ - (TYPE_UNSIGNED(t) ? UMAX_OF_SIZE(TYPE_LENGTH(t)) \ - : MAX_OF_SIZE(TYPE_LENGTH(t))) - -#define MIN_OF_TYPE(t) \ - (TYPE_UNSIGNED(t) ? UMIN_OF_SIZE(TYPE_LENGTH(t)) \ - : MIN_OF_SIZE(TYPE_LENGTH(t))) +extern const struct floatformat *floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_ieee_double_littlebyte_bigword[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_i387_ext[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_m68881_ext[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_arm_ext[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_ia64_spill[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_ia64_quad[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_vax_f[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN]; +extern const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN]; + /* Allocate space for storing data associated with a particular type. We ensure that the space is allocated using the same mechanism that was used to allocate the space for the type structure itself. I.E. - if the type is on an objfile's type_obstack, then the space for data - associated with that type will also be allocated on the type_obstack. + if the type is on an objfile's objfile_obstack, then the space for data + associated with that type will also be allocated on the objfile_obstack. If the type is not associated with any particular objfile (such as builtin types), then the data space will be allocated with xmalloc, the same as for the type structure. */ #define TYPE_ALLOC(t,size) \ - (TYPE_OBJFILE (t) != NULL \ - ? obstack_alloc (&TYPE_OBJFILE (t) -> type_obstack, size) \ + (TYPE_OBJFILE_OWNED (t) \ + ? obstack_alloc (&TYPE_OBJFILE (t) -> objfile_obstack, size) \ : xmalloc (size)) +#define TYPE_ZALLOC(t,size) \ + (TYPE_OBJFILE_OWNED (t) \ + ? memset (obstack_alloc (&TYPE_OBJFILE (t)->objfile_obstack, size), \ + 0, size) \ + : xzalloc (size)) + +/* Use alloc_type to allocate a type owned by an objfile. + Use alloc_type_arch to allocate a type owned by an architecture. + Use alloc_type_copy to allocate a type with the same owner as a + pre-existing template type, no matter whether objfile or gdbarch. */ extern struct type *alloc_type (struct objfile *); +extern struct type *alloc_type_arch (struct gdbarch *); +extern struct type *alloc_type_copy (const struct type *); +/* Return the type's architecture. For types owned by an architecture, + that architecture is returned. For types owned by an objfile, that + objfile's architecture is returned. */ +extern struct gdbarch *get_type_arch (const struct type *); + +/* Helper function to construct objfile-owned types. */ extern struct type *init_type (enum type_code, int, int, char *, struct objfile *); +/* 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 *, + const struct floatformat **); +extern struct type *arch_complex_type (struct gdbarch *, char *, + struct type *); + /* Helper functions to construct a struct or record type. An - initially empty type is created using init_composite_type(). - Fields are then added using append_struct_type_field(). A union + initially empty type is created using arch_composite_type(). + Fields are then added using append_composite_type_field*(). A union type has its size set to the largest field. A struct type has each field packed against the previous. */ -extern struct type *init_composite_type (char *name, enum type_code code); +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, struct type *field); +extern void append_composite_type_field_aligned (struct type *t, + char *name, + struct type *field, + int alignment); +struct field *append_composite_type_field_raw (struct type *t, 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(). */ +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); + +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 *); @@ -1088,22 +1269,25 @@ extern struct type *make_cv_type (int, int, struct type *, struct type **); extern void replace_type (struct type *, struct type *); -extern int address_space_name_to_int (char *); +extern int address_space_name_to_int (struct gdbarch *, char *); -extern const char *address_space_int_to_name (int); +extern const char *address_space_int_to_name (struct gdbarch *, int); extern struct type *make_type_with_address_space (struct type *type, int space_identifier); -extern struct type *lookup_member_type (struct type *, struct type *); +extern struct type *lookup_memberptr_type (struct type *, struct type *); + +extern struct type *lookup_methodptr_type (struct type *); + +extern void smash_to_method_type (struct type *type, struct type *domain, + struct type *to_type, struct field *args, + int nargs, int varargs); -extern void -smash_to_method_type (struct type *type, struct type *domain, - struct type *to_type, struct field *args, - int nargs, int varargs); +extern void smash_to_memberptr_type (struct type *, struct type *, + struct type *); -extern void -smash_to_member_type (struct type *, struct type *, struct type *); +extern void smash_to_methodptr_type (struct type *, struct type *); extern struct type *allocate_stub_method (struct type *); @@ -1119,88 +1303,54 @@ extern struct type *make_function_type (struct type *, struct type **); extern struct type *lookup_function_type (struct type *); -extern struct type *create_range_type (struct type *, struct type *, int, - int); +extern struct type *create_range_type (struct type *, struct type *, LONGEST, + LONGEST); extern struct type *create_array_type (struct type *, struct type *, struct type *); +extern struct type *lookup_array_range_type (struct type *, int, int); -extern struct type *create_string_type (struct type *, struct type *); +extern struct type *create_string_type (struct type *, struct type *, + struct type *); +extern struct type *lookup_string_range_type (struct type *, int, int); extern struct type *create_set_type (struct type *, struct type *); -extern struct type *lookup_unsigned_typename (char *); +extern struct type *lookup_unsigned_typename (const struct language_defn *, + struct gdbarch *,char *); -extern struct type *lookup_signed_typename (char *); +extern struct type *lookup_signed_typename (const struct language_defn *, + struct gdbarch *,char *); extern struct type *check_typedef (struct type *); -#define CHECK_TYPEDEF(TYPE) (TYPE) = check_typedef (TYPE) +#define CHECK_TYPEDEF(TYPE) \ + do { \ + (TYPE) = check_typedef (TYPE); \ + } while (0) extern void check_stub_method_group (struct type *, int); -extern struct type *lookup_primitive_typename (char *); - extern char *gdb_mangle_name (struct type *, int, int); -extern struct type *builtin_type (char **); - -extern struct type *lookup_typename (char *, struct block *, int); +extern struct type *lookup_typename (const struct language_defn *, + struct gdbarch *, char *, + struct block *, int); extern struct type *lookup_template_type (char *, struct type *, struct block *); -extern struct type *lookup_fundamental_type (struct objfile *, int); - -extern void fill_in_vptr_fieldno (struct type *); - -extern int get_destructor_fn_field (struct type *, int *, int *); +extern int get_vptr_fieldno (struct type *, struct type **); extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *); -extern int is_ancestor (struct type *, struct type *); - -extern int has_vtable (struct type *); - -extern struct type *primary_base_class (struct type *); +extern int class_types_same_p (const struct type *, const struct type *); -extern struct type **virtual_base_list (struct type *); - -extern int virtual_base_list_length (struct type *); -extern int virtual_base_list_length_skip_primaries (struct type *); - -extern int virtual_base_index (struct type *, struct type *); -extern int virtual_base_index_skip_primaries (struct type *, struct type *); - - -extern int class_index_in_primary_list (struct type *); - -extern int count_virtual_fns (struct type *); - -/* Constants for HP/Taligent ANSI C++ runtime model */ - -/* Where virtual function entries begin in the - * virtual table, in the non-RRBC vtable format. - * First 4 are the metavtable pointer, top offset, - * typeinfo pointer, and dup base info pointer */ -#define HP_ACC_VFUNC_START 4 - -/* (Negative) Offset where virtual base offset entries begin - * in the virtual table. Skips over metavtable pointer and - * the self-offset entry. - * NOTE: NEGATE THIS BEFORE USING! The virtual base offsets - * appear before the address point of the vtable (the slot - * pointed to by the object's vtable pointer), i.e. at lower - * addresses than the vtable pointer. */ -#define HP_ACC_VBASE_START 2 +extern int is_ancestor (struct type *, struct type *); -/* (Positive) Offset where the pointer to the typeinfo - * object is present in the virtual table */ -#define HP_ACC_TYPEINFO_OFFSET 2 +extern int is_public_ancestor (struct type *, struct type *); -/* (Positive) Offset where the ``top offset'' entry of - * the virtual table is */ -#define HP_ACC_TOP_OFFSET_OFFSET 1 +extern int is_unique_ancestor (struct type *, struct value *); /* Overload resolution */ @@ -1212,10 +1362,6 @@ extern int count_virtual_fns (struct type *); #define TOO_FEW_PARAMS_BADNESS 100 /* Badness if no conversion among types */ #define INCOMPATIBLE_TYPE_BADNESS 100 -/* Badness of coercing large integer to smaller size */ -#define INTEGER_COERCION_BADNESS 100 -/* Badness of coercing large floating type to smaller size */ -#define FLOAT_COERCION_BADNESS 100 /* Badness of integral promotion */ #define INTEGER_PROMOTION_BADNESS 1 @@ -1252,10 +1398,13 @@ extern int rank_one_type (struct type *, struct type *); extern void recursive_dump_type (struct type *, int); +extern int field_is_static (struct field *); + /* printcmd.c */ -extern void print_scalar_formatted (char *, struct type *, int, int, - struct ui_file *); +extern void print_scalar_formatted (const void *, struct type *, + const struct value_print_options *, + int, struct ui_file *); extern int can_dereference (struct type *); @@ -1263,4 +1412,12 @@ extern int is_integral_type (struct type *); extern void maintenance_print_type (char *, int); +extern htab_t create_copied_types_hash (struct objfile *objfile); + +extern struct type *copy_type_recursive (struct objfile *objfile, + struct type *type, + htab_t copied_types); + +extern struct type *copy_type (const struct type *type); + #endif /* GDBTYPES_H */