2013-03-20 Jan Kratochvil <jan.kratochvil@redhat.com>

Tom Tromey  <tromey@redhat.com>

	PR symtab/8421:
	* coffread.c (coff_register_index): New global.
	(process_coff_symbol, coff_read_enum_type): Set
	SYMBOL_ACLASS_INDEX.
	(_initialize_coffread): Initialize new global.
	* dwarf2loc.c (locexpr_find_frame_base_location)
	(dwarf2_block_frame_base_locexpr_funcs)
	(loclist_find_frame_base_location)
	(dwarf2_block_frame_base_loclist_funcs): New.
	(dwarf_expr_frame_base_1): Call SYMBOL_BLOCK_OPS, remove internal_error.
	(dwarf2_locexpr_funcs, dwarf2_loclist_funcs): Add location_has_loclist.
	* dwarf2loc.h (dwarf2_block_frame_base_locexpr_funcs)
	(dwarf2_block_frame_base_loclist_funcs): New.
	* dwarf2read.c (dwarf2_locexpr_index, dwarf2_loclist_index)
	(dwarf2_locexpr_block_index, dwarf2_loclist_block_index): New
	globals.
	(read_func_scope): Update.
	(fixup_go_packaging, mark_common_block_symbol_computed)
	(var_decode_location, new_symbol_full, dwarf2_const_value):
	Set SYMBOL_ACLASS_INDEX.
	(dwarf2_symbol_mark_computed): Likewise.  Add 'is_block' argument.
	(_initialize_dwarf2_read): Initialize new globals.
	* jit.c (finalize_symtab): Set SYMBOL_ACLASS_INDEX.
	* jv-lang.c (add_class_symbol): Set SYMBOL_ACLASS_INDEX.
	* mdebugread.c (mdebug_register_index, mdebug_regparm_index): New
	globals.
	(parse_symbol, psymtab_to_symtab_1): Set SYMBOL_ACLASS_INDEX.
	(_initialize_mdebugread): Initialize new globals.
	* psympriv.h (struct partial_symbol) <aclass>: Update comment.
	* stabsread.c (patch_block_stabs): Set SYMBOL_ACLASS_INDEX.
	(stab_register_index, stab_regparm_index): New globals.
	(define_symbol, read_enum_type, common_block_end): Set
	SYMBOL_ACLASS_INDEX.
	(_initialize_stabsread): Initialize new globals.
	* symtab.c (next_aclass_value, symbol_impl, symbol_impls): New
	globals.
	(MAX_SYMBOL_IMPLS): New define.
	(register_symbol_computed_impl, register_symbol_block_impl)
	(register_symbol_register_impl)
	(initialize_ordinary_address_classes): New functions.
	(_initialize_symtab): Call initialize_ordinary_address_classes.
	* symtab.h (enum address_class) <LOC_FINAL_VALUE>: New constant.
	(struct symbol_impl): New.
	(SYMBOL_ACLASS_BITS): New define.
	(struct symbol) <aclass, ops>: Remove fields.
	<aclass_index>: New field.
	(symbol_impls): Declare.
	(SYMBOL_CLASS, SYMBOL_COMPUTED_OPS, SYMBOL_REGISTER_OPS): Redefine.
	(SYMBOL_IMPL, SYMBOL_ACLASS_INDEX): New defines.
	(register_symbol_computed_impl, register_symbol_block_impl)
	(register_symbol_register_impl): Declare.
	(struct symbol_computed_ops): Add location_has_loclist.
	(struct symbol_block_ops): New.
	(SYMBOL_BLOCK_OPS): New.
	* xcoffread.c (process_xcoff_symbol): Set SYMBOL_ACLASS_INDEX.
This commit is contained in:
Tom Tromey
2013-03-20 18:33:05 +00:00
parent dbccfd4c96
commit f1e6e0721c
13 changed files with 412 additions and 141 deletions

View File

@@ -5012,9 +5012,111 @@ producer_is_realview (const char *producer)
return 0;
}
/* The next index to hand out in response to a registration request. */
static int next_aclass_value = LOC_FINAL_VALUE;
/* The maximum number of "aclass" registrations we support. This is
constant for convenience. */
#define MAX_SYMBOL_IMPLS (LOC_FINAL_VALUE + 10)
/* The objects representing the various "aclass" values. The elements
from 0 up to LOC_FINAL_VALUE-1 represent themselves, and subsequent
elements are those registered at gdb initialization time. */
static struct symbol_impl symbol_impl[MAX_SYMBOL_IMPLS];
/* The globally visible pointer. This is separate from 'symbol_impl'
so that it can be const. */
const struct symbol_impl *symbol_impls = &symbol_impl[0];
/* Make sure we saved enough room in struct symbol. */
gdb_static_assert (MAX_SYMBOL_IMPLS <= (1 << SYMBOL_ACLASS_BITS));
/* Register a computed symbol type. ACLASS must be LOC_COMPUTED. OPS
is the ops vector associated with this index. This returns the new
index, which should be used as the aclass_index field for symbols
of this type. */
int
register_symbol_computed_impl (enum address_class aclass,
const struct symbol_computed_ops *ops)
{
int result = next_aclass_value++;
gdb_assert (aclass == LOC_COMPUTED);
gdb_assert (result < MAX_SYMBOL_IMPLS);
symbol_impl[result].aclass = aclass;
symbol_impl[result].ops_computed = ops;
return result;
}
/* Register a function with frame base type. ACLASS must be LOC_BLOCK.
OPS is the ops vector associated with this index. This returns the
new index, which should be used as the aclass_index field for symbols
of this type. */
int
register_symbol_block_impl (enum address_class aclass,
const struct symbol_block_ops *ops)
{
int result = next_aclass_value++;
gdb_assert (aclass == LOC_BLOCK);
gdb_assert (result < MAX_SYMBOL_IMPLS);
symbol_impl[result].aclass = aclass;
symbol_impl[result].ops_block = ops;
/* Sanity check OPS. */
gdb_assert (ops != NULL);
gdb_assert (ops->find_frame_base_location != NULL);
return result;
}
/* Register a register symbol type. ACLASS must be LOC_REGISTER or
LOC_REGPARM_ADDR. OPS is the register ops vector associated with
this index. This returns the new index, which should be used as
the aclass_index field for symbols of this type. */
int
register_symbol_register_impl (enum address_class aclass,
const struct symbol_register_ops *ops)
{
int result = next_aclass_value++;
gdb_assert (aclass == LOC_REGISTER || aclass == LOC_REGPARM_ADDR);
gdb_assert (result < MAX_SYMBOL_IMPLS);
symbol_impl[result].aclass = aclass;
symbol_impl[result].ops_register = ops;
return result;
}
/* Initialize elements of 'symbol_impl' for the constants in enum
address_class. */
static void
initialize_ordinary_address_classes (void)
{
int i;
for (i = 0; i < LOC_FINAL_VALUE; ++i)
symbol_impl[i].aclass = i;
}
void
_initialize_symtab (void)
{
initialize_ordinary_address_classes ();
add_info ("variables", variables_info, _("\
All global and static variable names, or those matching REGEXP."));
if (dbx_commands)