Index: gdb/gdbtypes.h |
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h |
index a54a3022f12dce4abb6a720b1b56a6787c8ff3cb..17bfbc55b31dae69d80d980aa06befecd6b4f830 100644 |
--- a/gdb/gdbtypes.h |
+++ b/gdb/gdbtypes.h |
@@ -30,6 +30,21 @@ struct block; |
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))) |
@@ -290,6 +305,12 @@ enum type_instance_flag_value |
#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. */ |
@@ -345,6 +366,7 @@ enum type_instance_flag_value |
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_DWARF_BLOCK /* dwarf_block */ |
@@ -400,6 +422,11 @@ struct main_type |
"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; |
@@ -425,9 +452,11 @@ struct main_type |
/* Name of this type, or NULL if none. |
This is used for printing only, except by poorly designed C++ code. |
- For looking up a name, look for a symbol in the VAR_DOMAIN. */ |
+ 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. |
@@ -440,7 +469,7 @@ struct main_type |
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 |
@@ -498,11 +527,13 @@ struct main_type |
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. */ |
@@ -525,7 +556,7 @@ struct main_type |
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 |
@@ -533,7 +564,7 @@ struct main_type |
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. |
@@ -545,7 +576,7 @@ struct main_type |
NULL for range bounds, array domains, and member function |
arguments. */ |
- char *name; |
+ const char *name; |
} *fields; |
/* Union member used for range types. */ |
@@ -693,11 +724,6 @@ struct cplus_struct_type |
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; |
@@ -755,9 +781,11 @@ struct cplus_struct_type |
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. */ |
@@ -856,13 +884,6 @@ struct cplus_struct_type |
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 |
{ |
@@ -909,6 +930,20 @@ struct func_type |
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. */ |
@@ -928,7 +963,7 @@ struct call_site |
union field_location loc; |
/* Discriminant for union field_location. */ |
- ENUM_BITFIELD(field_loc_kind) loc_kind : 2; |
+ ENUM_BITFIELD(field_loc_kind) loc_kind : 3; |
} |
target; |
@@ -942,15 +977,24 @@ struct call_site |
/* Describe DW_TAG_GNU_call_site's DW_TAG_formal_parameter. */ |
struct call_site_parameter |
{ |
- /* DW_TAG_formal_parameter's DW_AT_location's DW_OP_regX as DWARF |
- register number, for register passed parameters. If -1 then use |
- fb_offset. */ |
- int dwarf_reg; |
+ ENUM_BITFIELD (call_site_parameter_kind) kind : 2; |
- /* Offset from the callee's frame base, for stack passed parameters. |
- This equals offset from the caller's stack pointer. Valid only if |
- DWARF_REGNUM is -1. */ |
- CORE_ADDR fb_offset; |
+ 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. */ |
@@ -1050,7 +1094,6 @@ extern void allocate_gnat_aux_type (struct type *); |
#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 |
@@ -1085,13 +1128,19 @@ extern void allocate_gnat_aux_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_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)) |
@@ -1109,6 +1158,7 @@ extern void allocate_gnat_aux_type (struct type *); |
#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)) |
@@ -1456,7 +1506,7 @@ extern void smash_to_methodptr_type (struct type *, struct 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); |
@@ -1470,6 +1520,10 @@ extern struct type *make_function_type (struct type *, struct 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); |
@@ -1484,10 +1538,10 @@ 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 (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 *); |