forked from Imagelibrary/binutils-gdb
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:
@@ -357,32 +357,59 @@ dwarf_expr_frame_base (void *baton, const gdb_byte **start, size_t * length)
|
||||
start, length);
|
||||
}
|
||||
|
||||
/* Implement find_frame_base_location method for LOC_BLOCK functions using
|
||||
DWARF expression for its DW_AT_frame_base. */
|
||||
|
||||
static void
|
||||
locexpr_find_frame_base_location (struct symbol *framefunc, CORE_ADDR pc,
|
||||
const gdb_byte **start, size_t *length)
|
||||
{
|
||||
struct dwarf2_locexpr_baton *symbaton = SYMBOL_LOCATION_BATON (framefunc);
|
||||
|
||||
*length = symbaton->size;
|
||||
*start = symbaton->data;
|
||||
}
|
||||
|
||||
/* Vector for inferior functions as represented by LOC_BLOCK, if the inferior
|
||||
function uses DWARF expression for its DW_AT_frame_base. */
|
||||
|
||||
const struct symbol_block_ops dwarf2_block_frame_base_locexpr_funcs =
|
||||
{
|
||||
locexpr_find_frame_base_location
|
||||
};
|
||||
|
||||
/* Implement find_frame_base_location method for LOC_BLOCK functions using
|
||||
DWARF location list for its DW_AT_frame_base. */
|
||||
|
||||
static void
|
||||
loclist_find_frame_base_location (struct symbol *framefunc, CORE_ADDR pc,
|
||||
const gdb_byte **start, size_t *length)
|
||||
{
|
||||
struct dwarf2_loclist_baton *symbaton = SYMBOL_LOCATION_BATON (framefunc);
|
||||
|
||||
*start = dwarf2_find_location_expression (symbaton, length, pc);
|
||||
}
|
||||
|
||||
/* Vector for inferior functions as represented by LOC_BLOCK, if the inferior
|
||||
function uses DWARF location list for its DW_AT_frame_base. */
|
||||
|
||||
const struct symbol_block_ops dwarf2_block_frame_base_loclist_funcs =
|
||||
{
|
||||
loclist_find_frame_base_location
|
||||
};
|
||||
|
||||
static void
|
||||
dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
|
||||
const gdb_byte **start, size_t *length)
|
||||
{
|
||||
if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
|
||||
*length = 0;
|
||||
else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
|
||||
if (SYMBOL_BLOCK_OPS (framefunc) != NULL)
|
||||
{
|
||||
struct dwarf2_loclist_baton *symbaton;
|
||||
const struct symbol_block_ops *ops_block = SYMBOL_BLOCK_OPS (framefunc);
|
||||
|
||||
symbaton = SYMBOL_LOCATION_BATON (framefunc);
|
||||
*start = dwarf2_find_location_expression (symbaton, length, pc);
|
||||
ops_block->find_frame_base_location (framefunc, pc, start, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct dwarf2_locexpr_baton *symbaton;
|
||||
|
||||
symbaton = SYMBOL_LOCATION_BATON (framefunc);
|
||||
if (symbaton != NULL)
|
||||
{
|
||||
*length = symbaton->size;
|
||||
*start = symbaton->data;
|
||||
}
|
||||
else
|
||||
*length = 0;
|
||||
}
|
||||
*length = 0;
|
||||
|
||||
if (*length == 0)
|
||||
error (_("Could not find the frame base for \"%s\"."),
|
||||
@@ -3963,6 +3990,7 @@ const struct symbol_computed_ops dwarf2_locexpr_funcs = {
|
||||
locexpr_read_variable_at_entry,
|
||||
locexpr_read_needs_frame,
|
||||
locexpr_describe_location,
|
||||
0, /* location_has_loclist */
|
||||
locexpr_tracepoint_var_ref
|
||||
};
|
||||
|
||||
@@ -4141,6 +4169,7 @@ const struct symbol_computed_ops dwarf2_loclist_funcs = {
|
||||
loclist_read_variable_at_entry,
|
||||
loclist_read_needs_frame,
|
||||
loclist_describe_location,
|
||||
1, /* location_has_loclist */
|
||||
loclist_tracepoint_var_ref
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user