Fix struct, union, and enum nesting in C++

In C, an enum or structure defined inside other structure has global
scope just like it had been defined outside the struct in the first
place.  However, in C++, such a nested structure is given a name that
is nested inside the structure.  This patch moves such affected
structures/enums out to global scope, so that code using them works
the same in C++ as it works today in C.

gdb/ChangeLog:
2015-02-27  Tom Tromey  <tromey@redhat.com>
	    Pedro Alves  <palves@redhat.com>

	* dwarf2-frame.c (enum cfa_how_kind, struct
	dwarf2_frame_state_reg_info): Move out of struct
	dwarf2_frame_state.
	* dwarf2read.c (struct tu_stats): Move out of struct
	dwarf2_per_objfile.
	(struct file_entry): Move out of struct line_header.
	(struct nextfield, struct nextfnfield, struct fnfieldlist, struct
	typedef_field_list): Move out of struct field_info.
	* gdbtypes.h (enum dynamic_prop_kind, union dynamic_prop_data):
	Move out of struct dynamic_prop.
	(union type_owner, union field_location, struct field, struct
	range_bounds, union type_specific): Move out of struct main_type.
	(struct fn_fieldlist, struct fn_field, struct typedef_field)
	(VOFFSET_STATIC): Move out of struct cplus_struct_type.
	(struct call_site_target, union call_site_parameter_u, struct
	call_site_parameter): Move out of struct call_site.
	* m32c-tdep.c (enum m32c_prologue_kind): Move out of struct
	m32c_prologue.
	(enum srcdest_kind): Move out of struct srcdest.
	* main.c (enum cmdarg_kind): Move out of struct cmdarg.
	* prologue-value.h (enum prologue_value_kind): Move out of struct
	prologue_value.
	* s390-linux-tdep.c (enum s390_abi_kind): Move out of struct
	gdbarch_tdep.
	* stabsread.c (struct nextfield, struct next_fnfieldlist): Move
	out of struct field_info.
	* symfile.h (struct other_sections): Move out of struct
	section_addr_info.
	* symtab.c (struct symbol_cache_slot): Move out struct
	block_symbol_cache.
	* target-descriptions.c (enum tdesc_type_kind): Move out of
	typedef struct tdesc_type.
	* tui/tui-data.h (enum tui_line_or_address_kind): Move out of
	struct tui_line_or_address.
	* value.c (enum internalvar_kind, union internalvar_data): Move
	out of struct internalvar.
	* xtensa-tdep.h (struct ctype_cache): Move out of struct
	gdbarch_tdep.
This commit is contained in:
Tom Tromey 2015-02-09 14:59:05 +00:00 committed by Pedro Alves
parent fe978cb071
commit 52059ffd69
15 changed files with 649 additions and 534 deletions

View file

@ -403,31 +403,35 @@ enum type_instance_flag_value
#define TYPE_ADDRESS_CLASS_ALL(t) (TYPE_INSTANCE_FLAGS(t) \
& TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)
enum dynamic_prop_kind
{
PROP_UNDEFINED, /* Not defined. */
PROP_CONST, /* Constant. */
PROP_ADDR_OFFSET, /* Address offset. */
PROP_LOCEXPR, /* Location expression. */
PROP_LOCLIST /* Location list. */
};
union dynamic_prop_data
{
/* Storage for constant property. */
LONGEST const_val;
/* Storage for dynamic property. */
void *baton;
};
/* * Used to store a dynamic property. */
struct dynamic_prop
{
/* Determine which field of the union dynamic_prop.data is used. */
enum
{
PROP_UNDEFINED, /* Not defined. */
PROP_CONST, /* Constant. */
PROP_ADDR_OFFSET, /* Address offset. */
PROP_LOCEXPR, /* Location expression. */
PROP_LOCLIST /* Location list. */
} kind;
enum dynamic_prop_kind kind;
/* Storage for dynamic or static value. */
union data
{
/* Storage for constant property. */
LONGEST const_val;
/* Storage for dynamic property. */
void *baton;
} data;
union dynamic_prop_data data;
};
@ -465,6 +469,128 @@ enum type_specific_kind
TYPE_SPECIFIC_SELF_TYPE
};
union type_owner
{
struct objfile *objfile;
struct gdbarch *gdbarch;
};
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. */
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;
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;
};
struct field
{
union field_location 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;
/* * Discriminant for union field_location. */
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
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. */
unsigned int bitsize : 28;
/* * 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 type *type;
/* * Name of field, value or argument.
NULL for range bounds, array domains, and member function
arguments. */
const char *name;
};
struct range_bounds
{
/* * Low bound of range. */
struct dynamic_prop low;
/* * High bound of range. */
struct dynamic_prop high;
/* True if HIGH range bound contains the number of elements in the
subrange. This affects how the final hight bound is computed. */
int flag_upper_bound_is_count : 1;
/* True if LOW or/and HIGH are resolved into a static bound from
a dynamic one. */
int flag_bound_evaluated : 1;
};
union type_specific
{
/* * CPLUS_STUFF is for TYPE_CODE_STRUCT. It is initialized to
point to cplus_struct_default, a default static instance of a
struct cplus_struct_type. */
struct cplus_struct_type *cplus_stuff;
/* * 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;
/* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */
struct func_type *func_stuff;
/* * For types that are pointer to member types (TYPE_CODE_METHODPTR,
TYPE_CODE_MEMBERPTR), SELF_TYPE is the type that this pointer
is a member of. */
struct type *self_type;
};
/* * Main structure representing a type in GDB.
This structure is space-critical. Its layout has been tweaked to
@ -548,11 +674,7 @@ struct main_type
this is somewhat ugly, but without major overhaul of the internal
type system, it can't be avoided for now. */
union type_owner
{
struct objfile *objfile;
struct gdbarch *gdbarch;
} owner;
union type_owner owner;
/* * For a pointer type, describes the type of object pointed to.
- For an array type, describes the type of the elements.
@ -584,125 +706,18 @@ struct main_type
union
{
struct field
{
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. */
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;
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;
/* * 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;
/* * Discriminant for union field_location. */
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
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. */
unsigned int bitsize : 28;
/* * 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 type *type;
/* * Name of field, value or argument.
NULL for range bounds, array domains, and member function
arguments. */
const char *name;
} *fields;
struct field *fields;
/* * Union member used for range types. */
struct range_bounds
{
/* * Low bound of range. */
struct dynamic_prop low;
/* * High bound of range. */
struct dynamic_prop high;
/* True if HIGH range bound contains the number of elements in the
subrange. This affects how the final hight bound is computed. */
int flag_upper_bound_is_count : 1;
/* True if LOW or/and HIGH are resolved into a static bound from
a dynamic one. */
int flag_bound_evaluated : 1;
} *bounds;
struct range_bounds *bounds;
} flds_bnds;
/* * Slot to point to additional language-specific fields of this
type. */
union type_specific
{
/* * CPLUS_STUFF is for TYPE_CODE_STRUCT. It is initialized to
point to cplus_struct_default, a default static instance of a
struct cplus_struct_type. */
struct cplus_struct_type *cplus_stuff;
/* * 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;
/* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */
struct func_type *func_stuff;
/* * For types that are pointer to member types (TYPE_CODE_METHODPTR,
TYPE_CODE_MEMBERPTR), SELF_TYPE is the type that this pointer
is a member of. */
struct type *self_type;
} type_specific;
union type_specific type_specific;
/* * Contains a location description value for the current type. Evaluating
this field yields to the location of the data for an object. */
@ -780,6 +795,101 @@ struct type
#define NULL_TYPE ((struct type *) 0)
struct fn_fieldlist
{
/* * The overloaded name.
This is generally allocated in the objfile's obstack.
However stabsread.c sometimes uses malloc. */
const char *name;
/* * The number of methods with this name. */
int length;
/* * The list of methods. */
struct fn_field *fn_fields;
};
struct fn_field
{
/* * If is_stub is clear, this is the mangled name which we can look
up to find the address of the method (FIXME: it would be cleaner
to have a pointer to the struct symbol here instead).
If is_stub is set, this is the portion of the mangled name which
specifies the arguments. For example, "ii", if there are two int
arguments, or "" if there are no arguments. See gdb_mangle_name
for the conversion from this format to the one used if is_stub is
clear. */
const char *physname;
/* * The function type for the method.
(This comment used to say "The return value of the method", but
that's wrong. The function type is expected here, i.e. something
with TYPE_CODE_METHOD, and *not* the return-value type). */
struct type *type;
/* * For virtual functions. First baseclass that defines this
virtual function. */
struct type *fcontext;
/* Attributes. */
unsigned int is_const:1;
unsigned int is_volatile:1;
unsigned int is_private:1;
unsigned int is_protected:1;
unsigned int is_public:1;
unsigned int is_abstract:1;
unsigned int is_static:1;
unsigned int is_final:1;
unsigned int is_synchronized:1;
unsigned int is_native:1;
unsigned int is_artificial:1;
/* * A stub method only has some fields valid (but they are enough
to reconstruct the rest of the fields). */
unsigned int is_stub:1;
/* * True if this function is a constructor, false otherwise. */
unsigned int is_constructor : 1;
/* * Unused. */
unsigned int dummy:3;
/* * Index into that baseclass's virtual function table, minus 2;
else if static: VOFFSET_STATIC; else: 0. */
unsigned int voffset:16;
#define VOFFSET_STATIC 1
};
struct typedef_field
{
/* * Unqualified name to be prefixed by owning class qualified
name. */
const char *name;
/* * Type this typedef named NAME represents. */
struct type *type;
};
/* * C++ language-specific information for TYPE_CODE_STRUCT and
TYPE_CODE_UNION nodes. */
@ -876,107 +986,13 @@ struct cplus_struct_type
fn_fieldlists points to an array of nfn_fields of these. */
struct fn_fieldlist
{
/* * The overloaded name.
This is generally allocated in the objfile's obstack.
However stabsread.c sometimes uses malloc. */
const char *name;
/* * The number of methods with this name. */
int length;
/* * The list of methods. */
struct fn_field
{
/* * If is_stub is clear, this is the mangled name which
we can look up to find the address of the method
(FIXME: it would be cleaner to have a pointer to the
struct symbol here instead).
If is_stub is set, this is the portion of the mangled
name which specifies the arguments. For example, "ii",
if there are two int arguments, or "" if there are no
arguments. See gdb_mangle_name for the conversion from
this format to the one used if is_stub is clear. */
const char *physname;
/* * The function type for the method.
(This comment used to say "The return value of the
method", but that's wrong. The function type is
expected here, i.e. something with TYPE_CODE_METHOD, and
*not* the return-value type). */
struct type *type;
/* * For virtual functions.
First baseclass that defines this virtual function. */
struct type *fcontext;
/* Attributes. */
unsigned int is_const:1;
unsigned int is_volatile:1;
unsigned int is_private:1;
unsigned int is_protected:1;
unsigned int is_public:1;
unsigned int is_abstract:1;
unsigned int is_static:1;
unsigned int is_final:1;
unsigned int is_synchronized:1;
unsigned int is_native:1;
unsigned int is_artificial:1;
/* * A stub method only has some fields valid (but they
are enough to reconstruct the rest of the fields). */
unsigned int is_stub:1;
/* * True if this function is a constructor, false
otherwise. */
unsigned int is_constructor : 1;
/* * Unused. */
unsigned int dummy:3;
/* * Index into that baseclass's virtual function table,
minus 2; else if static: VOFFSET_STATIC; else: 0. */
unsigned int voffset:16;
#define VOFFSET_STATIC 1
}
*fn_fields;
}
*fn_fieldlists;
struct fn_fieldlist *fn_fieldlists;
/* * typedefs defined inside this class. typedef_field points to
an array of typedef_field_count elements. */
struct typedef_field
{
/* * Unqualified name to be prefixed by owning class qualified
name. */
struct typedef_field *typedef_field;
const char *name;
/* * Type this typedef named NAME represents. */
struct type *type;
}
*typedef_field;
unsigned typedef_field_count;
/* * The template arguments. This is an array with
@ -1067,6 +1083,55 @@ enum call_site_parameter_kind
CALL_SITE_PARAMETER_PARAM_OFFSET
};
struct call_site_target
{
union field_location loc;
/* * Discriminant for union field_location. */
ENUM_BITFIELD(field_loc_kind) loc_kind : 3;
};
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;
};
struct call_site_parameter
{
ENUM_BITFIELD (call_site_parameter_kind) kind : 2;
union call_site_parameter_u 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;
};
/* * 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. */
@ -1086,15 +1151,7 @@ struct call_site
/* * 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;
struct call_site_target target;
/* * Size of the PARAMETER array. */
@ -1107,45 +1164,7 @@ struct call_site
/* * 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];
struct call_site_parameter parameter[1];
};
/* * The default value of TYPE_CPLUS_SPECIFIC(T) points to this shared