/* Internal type definitions for GDB.
- Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1992-2004, 2006-2012 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
struct value_print_options;
struct language_defn;
+/* These declarations are DWARF-specific as some of the gdbtypes.h data types
+ are already DWARF-specific. */
+
+/* Offset relative to the start of its containing CU (compilation unit). */
+typedef struct
+{
+ unsigned int cu_off;
+} cu_offset;
+
+/* Offset relative to the start of its .debug_info or .debug_types section. */
+typedef struct
+{
+ unsigned int sect_off;
+} sect_offset;
+
/* Some macros for char-based bitfields. */
#define B_SET(a,x) ((a)[(x)>>3] |= (1 << ((x)&7)))
enum type_code
{
- TYPE_CODE_UNDEF, /* Not used; catches errors */
+ TYPE_CODE_BITSTRING = -1, /* Deprecated */
+ TYPE_CODE_UNDEF = 0, /* Not used; catches errors */
TYPE_CODE_PTR, /* Pointer type */
/* Array type with lower & upper bounds.
a new type code. */
TYPE_CODE_STRING,
- /* String of bits; like TYPE_CODE_SET but prints differently (at
- least for (the deleted) CHILL). */
- TYPE_CODE_BITSTRING,
-
/* Unknown type. The length field is valid if we were able to
deduce that much about the type, or 0 if we don't even know that. */
TYPE_CODE_ERROR,
#define TYPE_DECLARED_CLASS(t) (TYPE_MAIN_TYPE (t)->flag_declared_class)
+/* True if this type is a "flag" enum. A flag enum is one where all
+ the values are pairwise disjoint when "and"ed together. This
+ affects how enum values are printed. */
+
+#define TYPE_FLAG_ENUM(t) (TYPE_MAIN_TYPE (t)->flag_flag_enum)
+
/* Constant type. If this is set, the corresponding type has a
const modifier. */
enum field_loc_kind
{
FIELD_LOC_KIND_BITPOS, /* bitpos */
+ FIELD_LOC_KIND_ENUMVAL, /* enumval */
FIELD_LOC_KIND_PHYSADDR, /* physaddr */
- FIELD_LOC_KIND_PHYSNAME /* physname */
+ FIELD_LOC_KIND_PHYSNAME, /* physname */
+ FIELD_LOC_KIND_DWARF_BLOCK /* dwarf_block */
};
/* A discriminant to determine which field in the main_type.type_specific
TYPE_SPECIFIC_CPLUS_STUFF,
TYPE_SPECIFIC_GNAT_STUFF,
TYPE_SPECIFIC_FLOATFORMAT,
- TYPE_SPECIFIC_CALLING_CONVENTION
+ TYPE_SPECIFIC_FUNC
};
/* This structure is space-critical.
"struct". */
unsigned int flag_declared_class : 1;
+ /* True if this is an enum type with disjoint values. This affects
+ how the enum is printed. */
+
+ unsigned int flag_flag_enum : 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;
/* Name of this type, or NULL if none.
This is used for printing only, except by poorly designed C++ code.
- For looking up a name, look for a symbol in the VAR_DOMAIN. */
+ For looking up a name, look for a symbol in the VAR_DOMAIN.
+ This is generally allocated in the objfile's obstack.
+ However coffread.c uses malloc. */
- char *name;
+ const char *name;
/* Tag name for this type, or NULL if none. This means that the
name of the type consists of a keyword followed by the tag name.
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;
+ const char *tag_name;
/* Every type is now associated with a particular objfile, and the
type is allocated on the objfile_obstack for that objfile. One problem
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. */
+ the LSB. */
int bitpos;
+ /* Enum value. */
+ LONGEST enumval;
+
/* 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;
+ const char *physname;
+
+ /* The field location can be computed by evaluating the following DWARF
+ block. Its DATA is allocated on objfile_obstack - no CU load is
+ needed to access it. */
+
+ struct dwarf2_locexpr_baton *dwarf_block;
}
loc;
unsigned int artificial : 1;
/* Discriminant for union field_location. */
- ENUM_BITFIELD(field_loc_kind) loc_kind : 2;
+ ENUM_BITFIELD(field_loc_kind) loc_kind : 3;
/* Size of this field, in bits, or zero if not packed.
If non-zero in an array type, indicates the element size in
For an unpacked field, the field's type's length
says how many bytes the field occupies. */
- unsigned int bitsize : 29;
+ unsigned int bitsize : 28;
/* In a struct or union type, type of this field.
In a function or member type, type of this argument.
NULL for range bounds, array domains, and member function
arguments. */
- char *name;
+ const char *name;
} *fields;
/* Union member used for range types. */
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;
+ /* For TYPE_CODE_FUNC types, */
+ struct func_type *func_stuff;
} type_specific;
};
short nfn_fields;
- /* Number of methods described for this type, not including the
- methods that it derives from. */
-
- short nfn_fields_total;
-
/* Number of template arguments. */
unsigned short n_template_arguments;
dynamic. Zero if not yet computed. */
int is_dynamic : 2;
+ /* Non-zero if this type came from a Java CU. */
+ unsigned int is_java : 1;
+
/* 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. If the base class is virtual, the
struct fn_fieldlist
{
- /* The overloaded name. */
+ /* The overloaded name.
+ This is generally allocated in the objfile's obstack.
+ However stabsread.c sometimes uses malloc. */
- char *name;
+ const char *name;
/* The number of methods with this name. */
}
*fn_fieldlists;
- /* Pointer to information about enclosing scope, if this is a
- local type. If it is not a local type, this is NULL. */
- struct local_type_info
- {
- char *file;
- int line;
- }
- *localtype_ptr;
-
/* typedefs defined inside this class. TYPEDEF_FIELD points to an array of
TYPEDEF_FIELD_COUNT elements. */
struct typedef_field
struct symbol **template_arguments;
};
-/* Struct used in computing virtual base list. */
-struct vbase
- {
- struct type *vbasetype; /* pointer to virtual base */
- struct vbase *next; /* next in chain */
- };
-
/* Struct used to store conversion rankings. */
struct rank
{
struct type* descriptive_type;
};
+/* For TYPE_CODE_FUNC types, */
+struct func_type
+ {
+ /* 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;
+
+ /* Only those DW_TAG_GNU_call_site's in this function that have
+ DW_AT_GNU_tail_call set are linked in this list. Function without its
+ tail call list complete (DW_AT_GNU_all_tail_call_sites or its superset
+ DW_AT_GNU_all_call_sites) has TAIL_CALL_LIST NULL, even if some
+ DW_TAG_GNU_call_site's exist in such function. */
+ struct call_site *tail_call_list;
+ };
+
+/* struct call_site_parameter can be referenced in callees by several ways. */
+
+enum call_site_parameter_kind
+{
+ /* Use field call_site_parameter.u.dwarf_reg. */
+ CALL_SITE_PARAMETER_DWARF_REG,
+
+ /* Use field call_site_parameter.u.fb_offset. */
+ CALL_SITE_PARAMETER_FB_OFFSET,
+
+ /* Use field call_site_parameter.u.param_offset. */
+ CALL_SITE_PARAMETER_PARAM_OFFSET
+};
+
+/* A place where a function gets called from, represented by
+ DW_TAG_GNU_call_site. It can be looked up from symtab->call_site_htab. */
+
+struct call_site
+ {
+ /* Address of the first instruction after this call. It must be the first
+ field as we overload core_addr_hash and core_addr_eq for it. */
+ CORE_ADDR pc;
+
+ /* List successor with head in FUNC_TYPE.TAIL_CALL_LIST. */
+ struct call_site *tail_call_next;
+
+ /* Describe DW_AT_GNU_call_site_target. Missing attribute uses
+ FIELD_LOC_KIND_DWARF_BLOCK with FIELD_DWARF_BLOCK == NULL. */
+ struct
+ {
+ union field_location loc;
+
+ /* Discriminant for union field_location. */
+ ENUM_BITFIELD(field_loc_kind) loc_kind : 3;
+ }
+ target;
+
+ /* Size of the PARAMETER array. */
+ unsigned parameter_count;
+
+ /* CU of the function where the call is located. It gets used for DWARF
+ blocks execution in the parameter array below. */
+ struct dwarf2_per_cu_data *per_cu;
+
+ /* Describe DW_TAG_GNU_call_site's DW_TAG_formal_parameter. */
+ struct call_site_parameter
+ {
+ ENUM_BITFIELD (call_site_parameter_kind) kind : 2;
+
+ union call_site_parameter_u
+ {
+ /* DW_TAG_formal_parameter's DW_AT_location's DW_OP_regX as DWARF
+ register number, for register passed parameters. */
+ int dwarf_reg;
+
+ /* Offset from the callee's frame base, for stack passed parameters.
+ This equals offset from the caller's stack pointer. */
+ CORE_ADDR fb_offset;
+
+ /* Offset relative to the start of this PER_CU to
+ DW_TAG_formal_parameter which is referenced by both caller and
+ the callee. */
+ cu_offset param_offset;
+ }
+ u;
+
+ /* DW_TAG_formal_parameter's DW_AT_GNU_call_site_value. It is never
+ NULL. */
+ const gdb_byte *value;
+ size_t value_size;
+
+ /* DW_TAG_formal_parameter's DW_AT_GNU_call_site_data_value. It may be
+ NULL if not provided by DWARF. */
+ const gdb_byte *data_value;
+ size_t data_value_size;
+ }
+ parameter[1];
+ };
+
/* The default value of TYPE_CPLUS_SPECIFIC(T) points to the
this shared static structure. */
#define HAVE_GNAT_AUX_INFO(type) \
(TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_GNAT_STUFF)
+#define INIT_FUNC_SPECIFIC(type) \
+ (TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FUNC, \
+ TYPE_MAIN_TYPE (type)->type_specific.func_stuff \
+ = TYPE_ZALLOC (type, \
+ sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff)))
+
#define TYPE_INSTANCE_FLAGS(thistype) (thistype)->instance_flags
#define TYPE_MAIN_TYPE(thistype) (thistype)->main_type
#define TYPE_NAME(thistype) TYPE_MAIN_TYPE(thistype)->name
#define TYPE_VPTR_FIELDNO(thistype) TYPE_MAIN_TYPE(thistype)->vptr_fieldno
#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_SPECIFIC_FIELD(thistype) \
TYPE_MAIN_TYPE(thistype)->type_specific_field
#define TYPE_TYPE_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific
#define TYPE_FLOATFORMAT(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.floatformat
#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_CALLING_CONVENTION(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.func_stuff->calling_convention
+#define TYPE_TAIL_CALL_LIST(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.func_stuff->tail_call_list
#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_FIELD_NAME(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 TYPE_CPLUS_REALLY_JAVA(thistype) TYPE_CPLUS_SPECIFIC (thistype)->is_java
#define BASETYPE_VIA_VIRTUAL(thistype, index) \
(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \
#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_BITPOS_LVAL(thisfld) ((thisfld).loc.bitpos)
+#define FIELD_BITPOS(thisfld) (FIELD_BITPOS_LVAL (thisfld) + 0)
+#define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval)
+#define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0)
#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))
+ FIELD_BITPOS_LVAL (thisfld) = (bitpos))
+#define SET_FIELD_ENUMVAL(thisfld, enumval) \
+ (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_ENUMVAL, \
+ FIELD_ENUMVAL_LVAL (thisfld) = (enumval))
#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 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))
#define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n))
+#define TYPE_FIELD_ENUMVAL(thistype, n) FIELD_ENUMVAL (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_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_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)
-
#define TYPE_TYPEDEF_FIELD_ARRAY(thistype) \
TYPE_CPLUS_SPECIFIC (thistype)->typedef_field
#define TYPE_TYPEDEF_FIELD(thistype, n) \
|| TYPE_NFN_FIELDS (thistype) == 0) \
&& (TYPE_STUB (thistype) || !TYPE_STUB_SUPPORTED (thistype)))
+/* A helper macro that returns the name of a type or "unnamed type" if the type
+ has no name. */
+#define TYPE_SAFE_NAME(type) \
+ (TYPE_NAME (type) ? TYPE_NAME (type) : _("<unnamed type>"))
+
/* A helper macro that returns the name of an error type. If the type
has a name, it is used; otherwise, a default is used. */
#define TYPE_ERROR_NAME(type) \
extern struct type *allocate_stub_method (struct type *);
-extern char *type_name_no_tag (const struct type *);
+extern const char *type_name_no_tag (const struct type *);
extern const char *type_name_no_tag_or_error (struct type *type);
extern struct type *lookup_function_type (struct type *);
+extern struct type *lookup_function_type_with_arguments (struct type *,
+ int,
+ struct type **);
+
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 *lookup_array_range_type (struct type *, LONGEST, LONGEST);
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 *lookup_string_range_type (struct type *, LONGEST, LONGEST);
extern struct type *create_set_type (struct type *, struct type *);
extern struct type *lookup_unsigned_typename (const struct language_defn *,
- struct gdbarch *,char *);
+ struct gdbarch *, const char *);
extern struct type *lookup_signed_typename (const struct language_defn *,
- struct gdbarch *,char *);
+ struct gdbarch *, const char *);
extern struct type *check_typedef (struct type *);
extern char *gdb_mangle_name (struct type *, int, int);
extern struct type *lookup_typename (const struct language_defn *,
- struct gdbarch *, char *,
+ struct gdbarch *, const char *,
const struct block *, int);
extern struct type *lookup_template_type (char *, struct type *,
extern const struct rank INT_FLOAT_CONVERSION_BADNESS;
/* Badness of conversion of pointer to void pointer. */
extern const struct rank VOID_PTR_CONVERSION_BADNESS;
-/* Badness of conversion of pointer to boolean. */
-extern const struct rank BOOL_PTR_CONVERSION_BADNESS;
+/* Badness of conversion to boolean. */
+extern const struct rank BOOL_CONVERSION_BADNESS;
/* Badness of converting derived to base class. */
extern const struct rank BASE_CONVERSION_BADNESS;
/* Badness of converting from non-reference to reference. */
extern const struct rank REFERENCE_CONVERSION_BADNESS;
+/* Badness of converting integer 0 to NULL pointer. */
+extern const struct rank NULL_POINTER_CONVERSION;
/* Non-standard conversions allowed by the debugger */
/* Converting a pointer to an int is usually OK. */
extern const struct rank NS_POINTER_CONVERSION_BADNESS;
+/* Badness of converting a (non-zero) integer constant
+ to a pointer. */
+extern const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS;
extern struct rank sum_ranks (struct rank a, struct rank b);
extern int compare_ranks (struct rank a, struct rank b);
extern int compare_badness (struct badness_vector *, struct badness_vector *);
extern struct badness_vector *rank_function (struct type **, int,
- struct type **, int);
+ struct value **, int);
-extern struct rank rank_one_type (struct type *, struct type *);
+extern struct rank rank_one_type (struct type *, struct type *,
+ struct value *);
extern void recursive_dump_type (struct type *, int);
extern struct type *copy_type (const struct type *type);
+extern int types_equal (struct type *, struct type *);
+
#endif /* GDBTYPES_H */