X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fgdbtypes.h;h=b07bd07d1e90f909611f2f85b6c39ef57e12ebe0;hb=4ee62156d969867d3d3ffedf656a74643f77279e;hp=0a48db2b5e6e272a287557c6a443c9b211ffcb67;hpb=d6a843b5945deb4cb2df9b07c4f9b19e6fba01de;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 0a48db2b5e..b07bd07d1e 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1,7 +1,7 @@ /* Internal type definitions for GDB. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. + 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -28,6 +28,8 @@ /* Forward declarations for prototypes. */ struct field; struct block; +struct value_print_options; +struct language_defn; /* Some macros for char-based bitfields. */ @@ -133,7 +135,10 @@ enum type_code TYPE_CODE_NAMESPACE, /* C++ namespace. */ - TYPE_CODE_DECFLOAT /* Decimal floating point. */ + TYPE_CODE_DECFLOAT, /* Decimal floating point. */ + + /* Internal function type. */ + TYPE_CODE_INTERNAL_FUNCTION }; /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an @@ -265,6 +270,14 @@ enum type_instance_flag_value #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) + /* Constant type. If this is set, the corresponding type has a * const modifier. */ @@ -351,6 +364,7 @@ struct main_type unsigned int flag_stub_supported : 1; unsigned int flag_nottext : 1; unsigned int flag_fixed_instance : 1; + unsigned int flag_objfile_owned : 1; /* Number of fields described for this type. This field appears at this location because it packs nicely here. */ @@ -402,7 +416,11 @@ 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. @@ -429,61 +447,87 @@ 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 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. */ + 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; - int bitpos; + /* 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; - /* 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. */ + /* Discriminant for union field_location. */ + ENUM_BITFIELD(field_loc_kind) loc_kind : 2; - CORE_ADDR physaddr; - char *physname; + /* 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. */ - /* The field location can be computed by evaluating the following DWARF - block. This can be used in Fortran variable-length arrays, for - instance. */ + unsigned int bitsize : 29; - struct dwarf2_locexpr_baton *dwarf_block; - } - loc; + /* 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. */ - /* 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; + struct type *type; - /* Discriminant for union field_location. */ - ENUM_BITFIELD(field_loc_kind) loc_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; + + /* High bound of range. */ - struct type *type; + LONGEST high; - /* Name of field, value or argument. - NULL for range bounds, array domains, and member function - arguments. */ + /* 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; - char *name; + } *bounds; - } *fields; + } flds_bnds; /* For types with virtual functions (TYPE_CODE_STRUCT), VPTR_BASETYPE is the base class which defined the virtual function table pointer. @@ -757,6 +801,13 @@ struct cplus_struct_type int line; } *localtype_ptr; + + /* 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; }; /* Struct used in computing virtual base list */ @@ -799,30 +850,34 @@ extern void allocate_cplus_struct_type (struct type *); so you only have to call check_typedef once. Since allocate_value calls check_typedef, TYPE_LENGTH (VALUE_TYPE (X)) is safe. */ #define TYPE_LENGTH(thistype) (thistype)->length -#define TYPE_OBJFILE(thistype) TYPE_MAIN_TYPE(thistype)->objfile /* 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_FIELDS(thistype) TYPE_MAIN_TYPE(thistype)->flds_bnds.fields #define TYPE_TEMPLATE_ARGS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->template_args #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_IS_UNDEFINED(arraytype) \ - (TYPE_FIELD_ARTIFICIAL((TYPE_FIELD_TYPE((arraytype),0)),1)) + TYPE_HIGH_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ - (TYPE_FIELD_ARTIFICIAL((TYPE_FIELD_TYPE((arraytype),0)),0)) + 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++ */ @@ -838,12 +893,13 @@ extern void allocate_cplus_struct_type (struct type *); #define TYPE_CPLUS_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.cplus_stuff #define TYPE_FLOATFORMAT(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.floatformat #define TYPE_CALLING_CONVENTION(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.calling_convention -#define TYPE_BASECLASS(thistype,index) TYPE_MAIN_TYPE(thistype)->fields[index].type +#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 \ @@ -871,7 +927,7 @@ extern void allocate_cplus_struct_type (struct type *); #define FIELD_ARTIFICIAL(thisfld) ((thisfld).artificial) #define FIELD_BITSIZE(thisfld) ((thisfld).bitsize) -#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_LOC_KIND(thistype, n) FIELD_LOC_KIND (TYPE_FIELD (thistype, n)) @@ -952,7 +1008,56 @@ extern void allocate_cplus_struct_type (struct type *); struct builtin_type { - /* Address/pointer types. */ + /* 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; + + + /* Pointer types. */ /* `pointer to data' type. Some target platforms use an implicitly {sign,zero} -extended 32-bit ABI pointer on a 64-bit ISA. */ @@ -968,63 +1073,55 @@ struct builtin_type (*) () can server as a generic function pointer. */ struct type *builtin_func_ptr; - /* The target CPU's address type. This is the ISA address size. */ - struct type *builtin_core_addr; + /* Special-purpose types. */ - /* 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; + /* 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); - /* Integral types. */ - /* Implicit size/sign (based on the the architecture's ABI). */ +/* 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; - 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; + + /* 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 architecture. */ -extern const struct builtin_type *builtin_type (struct gdbarch *gdbarch); +/* Return the type table for the specified objfile. */ +extern const struct objfile_type *objfile_type (struct objfile *objfile); -/* Explicit sizes - see C9X for naming scheme. The "int0" - is for when an architecture needs to describe a register that has - no size. */ -extern struct type *builtin_type_int0; -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; - /* Explicit floating-point formats. See "floatformat.h". */ extern const struct floatformat *floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]; extern const struct floatformat *floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]; @@ -1038,34 +1135,6 @@ 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]; -extern struct type *builtin_type_ieee_single; -extern struct type *builtin_type_ieee_double; -extern struct type *builtin_type_i387_ext; -extern struct type *builtin_type_m68881_ext; -extern struct type *builtin_type_arm_ext; -extern struct type *builtin_type_ia64_spill; -extern struct type *builtin_type_ia64_quad; - -/* Platform-neutral void type. Never attempt to construct a pointer - or reference type to this, because those cannot be platform-neutral. - You must use builtin_type (...)->builtin_void in those cases. */ -extern struct type *builtin_type_void; - -/* Platform-neutral 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. */ -extern struct type *builtin_type_true_char; -extern struct type *builtin_type_true_unsigned_char; - - -/* This type represents a type that was unrecognized in symbol - read-in. */ -extern struct type *builtin_type_error; - - -/* RTTI for C++ */ -/* extern struct type *builtin_type_cxx_typeinfo; */ /* Maximum and minimum values of built-in types */ @@ -1087,35 +1156,63 @@ extern struct type *builtin_type_error; the same as for the type structure. */ #define TYPE_ALLOC(t,size) \ - (TYPE_OBJFILE (t) != NULL \ + (TYPE_OBJFILE_OWNED (t) \ ? obstack_alloc (&TYPE_OBJFILE (t) -> objfile_obstack, size) \ : xmalloc (size)) #define TYPE_ZALLOC(t,size) \ - (TYPE_OBJFILE (t) != NULL \ + (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(). + initially empty type is created using arch_composite_type(). Fields are then added using append_struct_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); /* Helper functions to construct a bit flags type. An initially empty - type is created using init_flag_type(). Flags are then added using + type is created using arch_flag_type(). Flags are then added using append_flag_type_flag(). */ -extern struct type *init_flags_type (char *name, int length); +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); @@ -1129,9 +1226,9 @@ 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); @@ -1161,37 +1258,45 @@ 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 char *gdb_mangle_name (struct type *, int, int); -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 int get_vptr_fieldno (struct type *, struct type **); -extern int get_destructor_fn_field (struct type *, int *, int *); - extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *); extern int is_ancestor (struct type *, struct type *); @@ -1246,8 +1351,9 @@ extern int field_is_static (struct field *); /* printcmd.c */ -extern void print_scalar_formatted (const void *, 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 *); @@ -1261,4 +1367,6 @@ 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 */