X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbtypes.h;h=944e5f12bed78dc54e60f8be8f7472c7fd71de9e;hb=be85b69fc61880e3bde8d4df2bf6b4189c25d143;hp=3d8fbca073ef4cd915a80b7c3998a034f4eb136a;hpb=000177f0ad8107eeacc1fceaec5ca72ad9725099;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 3d8fbca073..944e5f12be 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,7 @@ /* Internal type definitions for GDB. - Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -19,12 +19,14 @@ 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. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #if !defined (GDBTYPES_H) #define GDBTYPES_H 1 +#include "hashtab.h" + /* Forward declarations for prototypes. */ struct field; struct block; @@ -82,10 +84,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 */ @@ -273,6 +296,17 @@ enum type_code #define TYPE_ADDRESS_CLASS_ALL(t) (TYPE_INSTANCE_FLAGS(t) \ & TYPE_FLAG_ADDRESS_CLASS_ALL) +/* 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_FLAG_FIXED_INSTANCE (1 << 15) + /* Array bound type. */ enum array_bound_type { @@ -946,29 +980,10 @@ struct builtin_type /* Integral types. */ - /* Explicit sizes. These are assumed to be 2's complement and in - the architecture's byte order. The "int0" is for when an ISA - needs to describe a register that has no size. The naming schema - is based on C9X . */ - /* FIXME: cagney/2004-07-26: As with floating-point, there should be - explicit big, little and little-byte-big-word endian types that - exist outside of the architecture vector. */ - 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; - /* We use this 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 *true_char; + struct type *builtin_true_char; /* Implicit size/sign (based on the the architecture's ABI). */ struct type *builtin_void; @@ -1060,17 +1075,27 @@ extern struct type *builtin_type_v8hi; extern struct type *builtin_type_v4hi; extern struct type *builtin_type_v2si; -/* Type for 64 bit vectors. */ +/* Types for 64 bit vectors. */ +extern struct type *builtin_type_v2_float; +extern struct type *builtin_type_v2_int32; +extern struct type *builtin_type_v4_int16; +extern struct type *builtin_type_v8_int8; extern struct type *builtin_type_vec64; -extern struct type *builtin_type_vec64i; -/* Type for 128 bit vectors. */ +/* Types for 128 bit vectors. */ +extern struct type *builtin_type_v2_double; +extern struct type *builtin_type_v4_float; +extern struct type *builtin_type_v2_int64; +extern struct type *builtin_type_v4_int32; +extern struct type *builtin_type_v8_int16; +extern struct type *builtin_type_v16_int8; extern struct type *builtin_type_vec128; -extern struct type *builtin_type_vec128i; /* Explicit floating-point formats. See "floatformat.h". */ +extern struct type *builtin_type_ieee_single[BFD_ENDIAN_UNKNOWN]; extern struct type *builtin_type_ieee_single_big; extern struct type *builtin_type_ieee_single_little; +extern struct type *builtin_type_ieee_double[BFD_ENDIAN_UNKNOWN]; 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; @@ -1079,10 +1104,13 @@ 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[BFD_ENDIAN_UNKNOWN]; extern struct type *builtin_type_arm_ext_big; extern struct type *builtin_type_arm_ext_littlebyte_bigword; +extern struct type *builtin_type_ia64_spill[BFD_ENDIAN_UNKNOWN]; extern struct type *builtin_type_ia64_spill_big; extern struct type *builtin_type_ia64_spill_little; +extern struct type *builtin_type_ia64_quad[BFD_ENDIAN_UNKNOWN]; extern struct type *builtin_type_ia64_quad_big; extern struct type *builtin_type_ia64_quad_little; @@ -1150,6 +1178,12 @@ extern struct type *builtin_type_f_void; ? obstack_alloc (&TYPE_OBJFILE (t) -> objfile_obstack, size) \ : xmalloc (size)) +#define TYPE_ZALLOC(t,size) \ + (TYPE_OBJFILE (t) != NULL \ + ? memset (obstack_alloc (&TYPE_OBJFILE (t)->objfile_obstack, size), \ + 0, size) \ + : xzalloc (size)) + extern struct type *alloc_type (struct objfile *); extern struct type *init_type (enum type_code, int, int, char *, @@ -1165,6 +1199,12 @@ extern struct type *init_composite_type (char *name, enum type_code code); extern void append_composite_type_field (struct type *t, char *name, struct type *field); +/* Helper functions to construct a bit flags type. An initially empty + type is created using init_flag_type(). Flags are then added using + append_flag_type_flag(). */ +extern struct type *init_flags_type (char *name, int length); +extern void append_flags_type_flag (struct type *type, int bitpos, char *name); + extern struct type *lookup_reference_type (struct type *); extern struct type *make_reference_type (struct type *, struct type **); @@ -1223,8 +1263,6 @@ extern struct type *check_typedef (struct type *); 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 *lookup_typename (char *, struct block *, int); @@ -1332,7 +1370,7 @@ extern void recursive_dump_type (struct type *, int); /* printcmd.c */ -extern void print_scalar_formatted (void *, struct type *, int, int, +extern void print_scalar_formatted (const void *, struct type *, int, int, struct ui_file *); extern int can_dereference (struct type *); @@ -1341,4 +1379,10 @@ 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); + #endif /* GDBTYPES_H */