gdb: remove BLOCK_ENTRY_PC macro

Replace with equivalent method.

Change-Id: I0e033095e7358799930775e61028b48246971a7d
This commit is contained in:
Simon Marchi 2022-02-06 22:41:58 -05:00 committed by Simon Marchi
parent 086d03c91e
commit 6395b62847
17 changed files with 56 additions and 51 deletions

View file

@ -571,7 +571,7 @@ gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var)
break; break;
case LOC_BLOCK: case LOC_BLOCK:
ax_const_l (ax, BLOCK_ENTRY_PC (var->value_block ())); ax_const_l (ax, var->value_block ()->entry_pc ());
value->kind = axs_rvalue; value->kind = axs_rvalue;
break; break;

View file

@ -171,6 +171,29 @@ struct block
bool is_contiguous () const bool is_contiguous () const
{ return this->ranges ().size () <= 1; } { return this->ranges ().size () <= 1; }
/* Return the "entry PC" of this block.
The entry PC is the lowest (start) address for the block when all addresses
within the block are contiguous. If non-contiguous, then use the start
address for the first range in the block.
At the moment, this almost matches what DWARF specifies as the entry
pc. (The missing bit is support for DW_AT_entry_pc which should be
preferred over range data and the low_pc.)
Once support for DW_AT_entry_pc is added, I expect that an entry_pc
field will be added to one of these data structures. Once that's done,
the entry_pc field can be set from the dwarf reader (and other readers
too). ENTRY_PC can then be redefined to be less DWARF-centric. */
CORE_ADDR entry_pc () const
{
if (this->is_contiguous ())
return this->start ();
else
return this->ranges ()[0].start ();
}
/* Addresses in the executable code that are in this block. */ /* Addresses in the executable code that are in this block. */
CORE_ADDR m_start; CORE_ADDR m_start;
@ -219,24 +242,6 @@ struct global_block
struct compunit_symtab *compunit_symtab; struct compunit_symtab *compunit_symtab;
}; };
/* Define the "entry pc" for a block BL to be the lowest (start) address
for the block when all addresses within the block are contiguous. If
non-contiguous, then use the start address for the first range in the
block.
At the moment, this almost matches what DWARF specifies as the entry
pc. (The missing bit is support for DW_AT_entry_pc which should be
preferred over range data and the low_pc.)
Once support for DW_AT_entry_pc is added, I expect that an entry_pc
field will be added to one of these data structures. Once that's done,
the entry_pc field can be set from the dwarf reader (and other readers
too). BLOCK_ENTRY_PC can then be redefined to be less DWARF-centric. */
#define BLOCK_ENTRY_PC(bl) (bl->is_contiguous () \
? bl->start () \
: bl->ranges ()[0].start ())
struct blockvector struct blockvector
{ {
/* Number of blocks in the list. */ /* Number of blocks in the list. */

View file

@ -96,7 +96,7 @@ get_pc_function_start (CORE_ADDR pc)
if (symbol) if (symbol)
{ {
bl = symbol->value_block (); bl = symbol->value_block ();
return BLOCK_ENTRY_PC (bl); return bl->entry_pc ();
} }
} }
@ -254,7 +254,7 @@ find_pc_partial_function_sym (CORE_ADDR pc,
f = find_pc_sect_function (mapped_pc, section); f = find_pc_sect_function (mapped_pc, section);
if (f != NULL if (f != NULL
&& (msymbol.minsym == NULL && (msymbol.minsym == NULL
|| (BLOCK_ENTRY_PC (f->value_block ()) || (f->value_block ()->entry_pc ()
>= msymbol.value_address ()))) >= msymbol.value_address ())))
{ {
const struct block *b = f->value_block (); const struct block *b = f->value_block ();
@ -392,7 +392,7 @@ find_function_entry_range_from_pc (CORE_ADDR pc, const char **name,
if (status && block != nullptr && !block->is_contiguous ()) if (status && block != nullptr && !block->is_contiguous ())
{ {
CORE_ADDR entry_pc = BLOCK_ENTRY_PC (block); CORE_ADDR entry_pc = block->entry_pc ();
for (const blockrange &range : block->ranges ()) for (const blockrange &range : block->ranges ())
{ {
@ -424,7 +424,7 @@ find_function_type (CORE_ADDR pc)
{ {
struct symbol *sym = find_pc_function (pc); struct symbol *sym = find_pc_function (pc);
if (sym != NULL && BLOCK_ENTRY_PC (sym->value_block ()) == pc) if (sym != NULL && sym->value_block ()->entry_pc () == pc)
return sym->type (); return sym->type ();
return NULL; return NULL;

View file

@ -93,7 +93,7 @@ convert_one_symbol (compile_c_instance *context,
case LOC_BLOCK: case LOC_BLOCK:
kind = GCC_C_SYMBOL_FUNCTION; kind = GCC_C_SYMBOL_FUNCTION;
addr = BLOCK_ENTRY_PC (sym.symbol->value_block ()); addr = sym.symbol->value_block ()->entry_pc ();
if (is_global && sym.symbol->type ()->is_gnu_ifunc ()) if (is_global && sym.symbol->type ()->is_gnu_ifunc ())
addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr); addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
break; break;
@ -404,7 +404,7 @@ gcc_symbol_address (void *datum, struct gcc_c_context *gcc_context,
gdb_printf (gdb_stdlog, gdb_printf (gdb_stdlog,
"gcc_symbol_address \"%s\": full symbol\n", "gcc_symbol_address \"%s\": full symbol\n",
identifier); identifier);
result = BLOCK_ENTRY_PC (sym->value_block ()); result = sym->value_block ()->entry_pc ();
if (sym->type ()->is_gnu_ifunc ()) if (sym->type ()->is_gnu_ifunc ())
result = gnu_ifunc_resolve_addr (target_gdbarch (), result); result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
found = 1; found = 1;

View file

@ -145,7 +145,7 @@ compile_object_run (compile_module_up &&module)
gdb_assert (func_type->code () == TYPE_CODE_FUNC); gdb_assert (func_type->code () == TYPE_CODE_FUNC);
func_val = value_from_pointer (lookup_pointer_type (func_type), func_val = value_from_pointer (lookup_pointer_type (func_type),
BLOCK_ENTRY_PC (func_sym->value_block ())); func_sym->value_block ()->entry_pc ());
vargs = XALLOCAVEC (struct value *, func_type->num_fields ()); vargs = XALLOCAVEC (struct value *, func_type->num_fields ());
if (func_type->num_fields () >= 1) if (func_type->num_fields () >= 1)

View file

@ -487,10 +487,10 @@ get_expr_block_and_pc (CORE_ADDR *pc)
block = BLOCKVECTOR_BLOCK (cursal.symtab->compunit ()->blockvector (), block = BLOCKVECTOR_BLOCK (cursal.symtab->compunit ()->blockvector (),
STATIC_BLOCK); STATIC_BLOCK);
if (block != NULL) if (block != NULL)
*pc = BLOCK_ENTRY_PC (block); *pc = block->entry_pc ();
} }
else else
*pc = BLOCK_ENTRY_PC (block); *pc = block->entry_pc ();
return block; return block;
} }

View file

@ -453,7 +453,7 @@ dwarf2_find_location_expression (struct dwarf2_loclist_baton *baton,
if (pc_block) if (pc_block)
pc_func = block_linkage_function (pc_block); pc_func = block_linkage_function (pc_block);
if (pc_func && pc == BLOCK_ENTRY_PC (pc_func->value_block ())) if (pc_func && pc == pc_func->value_block ()->entry_pc ())
{ {
*locexpr_length = length; *locexpr_length = length;
return loc_ptr; return loc_ptr;
@ -753,7 +753,7 @@ func_addr_to_tail_call_list (struct gdbarch *gdbarch, CORE_ADDR addr)
struct symbol *sym = find_pc_function (addr); struct symbol *sym = find_pc_function (addr);
struct type *type; struct type *type;
if (sym == NULL || BLOCK_ENTRY_PC (sym->value_block ()) != addr) if (sym == NULL || sym->value_block ()->entry_pc () != addr)
throw_error (NO_ENTRY_VALUE_ERROR, throw_error (NO_ENTRY_VALUE_ERROR,
_("DW_TAG_call_site resolving failed to find function " _("DW_TAG_call_site resolving failed to find function "
"name for address %s"), "name for address %s"),

View file

@ -704,10 +704,10 @@ language_defn::read_var_value (struct symbol *var,
case LOC_BLOCK: case LOC_BLOCK:
if (overlay_debugging) if (overlay_debugging)
addr = symbol_overlayed_address addr = symbol_overlayed_address
(BLOCK_ENTRY_PC (var->value_block ()), (var->value_block ()->entry_pc (),
var->obj_section (var->objfile ())); var->obj_section (var->objfile ()));
else else
addr = BLOCK_ENTRY_PC (var->value_block ()); addr = var->value_block ()->entry_pc ();
break; break;
case LOC_REGISTER: case LOC_REGISTER:

View file

@ -1345,7 +1345,7 @@ until_next_command (int from_tty)
{ {
sal = find_pc_line (pc, 0); sal = find_pc_line (pc, 0);
tp->control.step_range_start = BLOCK_ENTRY_PC (func->value_block ()); tp->control.step_range_start = func->value_block ()->entry_pc ();
tp->control.step_range_end = sal.end; tp->control.step_range_end = sal.end;
/* By setting the step_range_end based on the current pc, we are /* By setting the step_range_end based on the current pc, we are

View file

@ -4687,8 +4687,8 @@ fill_in_stop_func (struct gdbarch *gdbarch,
stop_func_start is NOT advanced when in a range of a stop_func_start is NOT advanced when in a range of a
non-contiguous block that does not contain the entry pc. */ non-contiguous block that does not contain the entry pc. */
if (block != nullptr if (block != nullptr
&& ecs->stop_func_start <= BLOCK_ENTRY_PC (block) && ecs->stop_func_start <= block->entry_pc ()
&& BLOCK_ENTRY_PC (block) < ecs->stop_func_end) && block->entry_pc () < ecs->stop_func_end)
{ {
ecs->stop_func_start ecs->stop_func_start
+= gdbarch_deprecated_function_start_offset (gdbarch); += gdbarch_deprecated_function_start_offset (gdbarch);

View file

@ -181,7 +181,7 @@ inline_frame_this_id (struct frame_info *this_frame,
in the frame ID (and eventually, to set breakpoints). */ in the frame ID (and eventually, to set breakpoints). */
func = get_frame_function (this_frame); func = get_frame_function (this_frame);
gdb_assert (func != NULL); gdb_assert (func != NULL);
(*this_id).code_addr = BLOCK_ENTRY_PC (func->value_block ()); (*this_id).code_addr = func->value_block ()->entry_pc ();
(*this_id).artificial_depth++; (*this_id).artificial_depth++;
} }
@ -362,7 +362,7 @@ skip_inline_frames (thread_info *thread, bpstat *stop_chain)
{ {
/* See comments in inline_frame_this_id about this use /* See comments in inline_frame_this_id about this use
of BLOCK_ENTRY_PC. */ of BLOCK_ENTRY_PC. */
if (BLOCK_ENTRY_PC (cur_block) == this_pc if (cur_block->entry_pc () == this_pc
|| block_starting_point_at (this_pc, cur_block)) || block_starting_point_at (this_pc, cur_block))
{ {
/* Do not skip the inlined frame if execution /* Do not skip the inlined frame if execution

View file

@ -2224,7 +2224,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec *ls)
&& sym.symbol->aclass () == LOC_BLOCK) && sym.symbol->aclass () == LOC_BLOCK)
{ {
const CORE_ADDR addr const CORE_ADDR addr
= BLOCK_ENTRY_PC (sym.symbol->value_block ()); = sym.symbol->value_block ()->entry_pc ();
for (const auto &elem : ls->minimal_symbols) for (const auto &elem : ls->minimal_symbols)
{ {

View file

@ -454,7 +454,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
if (!expression_context_block) if (!expression_context_block)
expression_context_block = get_selected_block (&expression_context_pc); expression_context_block = get_selected_block (&expression_context_pc);
else if (pc == 0) else if (pc == 0)
expression_context_pc = BLOCK_ENTRY_PC (expression_context_block); expression_context_pc = expression_context_block->entry_pc ();
else else
expression_context_pc = pc; expression_context_pc = pc;
@ -468,7 +468,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
= BLOCKVECTOR_BLOCK (cursal.symtab->compunit ()->blockvector (), = BLOCKVECTOR_BLOCK (cursal.symtab->compunit ()->blockvector (),
STATIC_BLOCK); STATIC_BLOCK);
if (expression_context_block) if (expression_context_block)
expression_context_pc = BLOCK_ENTRY_PC (expression_context_block); expression_context_pc = expression_context_block->entry_pc ();
} }
if (language_mode == language_mode_auto && block != NULL) if (language_mode == language_mode_auto && block != NULL)

View file

@ -645,7 +645,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
pointer is <function+3>. This matches the ISA behavior. */ pointer is <function+3>. This matches the ISA behavior. */
addr = gdbarch_addr_bits_remove (gdbarch, addr); addr = gdbarch_addr_bits_remove (gdbarch, addr);
name_location = BLOCK_ENTRY_PC (symbol->value_block ()); name_location = symbol->value_block ()->entry_pc ();
if (do_demangle || asm_demangle) if (do_demangle || asm_demangle)
name_temp = symbol->print_name (); name_temp = symbol->print_name ();
else else
@ -1778,7 +1778,7 @@ info_address_command (const char *exp, int from_tty)
case LOC_BLOCK: case LOC_BLOCK:
gdb_printf (_("a function at address ")); gdb_printf (_("a function at address "));
load_addr = BLOCK_ENTRY_PC (sym->value_block ()); load_addr = sym->value_block ()->entry_pc ();
fputs_styled (paddress (gdbarch, load_addr), address_style.style (), fputs_styled (paddress (gdbarch, load_addr), address_style.style (),
gdb_stdout); gdb_stdout);
if (section_is_overlay (section)) if (section_is_overlay (section))

View file

@ -1821,7 +1821,7 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
addr = sym->value_address (); addr = sym->value_address ();
break; break;
case LOC_BLOCK: case LOC_BLOCK:
addr = BLOCK_ENTRY_PC (sym->value_block ()); addr = sym->value_block ()->entry_pc ();
break; break;
default: default:
@ -3779,7 +3779,7 @@ find_function_start_sal (symbol *sym, bool funfirstline)
{ {
fixup_symbol_section (sym, NULL); fixup_symbol_section (sym, NULL);
symtab_and_line sal symtab_and_line sal
= find_function_start_sal_1 (BLOCK_ENTRY_PC (sym->value_block ()), = find_function_start_sal_1 (sym->value_block ()->entry_pc (),
sym->obj_section (sym->objfile ()), sym->obj_section (sym->objfile ()),
funfirstline); funfirstline);
sal.symbol = sym; sal.symbol = sym;
@ -3908,7 +3908,7 @@ skip_prologue_sal (struct symtab_and_line *sal)
fixup_symbol_section (sym, NULL); fixup_symbol_section (sym, NULL);
objfile = sym->objfile (); objfile = sym->objfile ();
pc = BLOCK_ENTRY_PC (sym->value_block ()); pc = sym->value_block ()->entry_pc ();
section = sym->obj_section (objfile); section = sym->obj_section (objfile);
name = sym->linkage_name (); name = sym->linkage_name ();
} }
@ -3984,7 +3984,7 @@ skip_prologue_sal (struct symtab_and_line *sal)
/* Check if gdbarch_skip_prologue left us in mid-line, and the next /* Check if gdbarch_skip_prologue left us in mid-line, and the next
line is still part of the same function. */ line is still part of the same function. */
if (skip && start_sal.pc != pc if (skip && start_sal.pc != pc
&& (sym ? (BLOCK_ENTRY_PC (sym->value_block ()) <= start_sal.end && (sym ? (sym->value_block ()->entry_pc () <= start_sal.end
&& start_sal.end < sym->value_block()->end ()) && start_sal.end < sym->value_block()->end ())
: (lookup_minimal_symbol_by_pc_section (start_sal.end, section).minsym : (lookup_minimal_symbol_by_pc_section (start_sal.end, section).minsym
== lookup_minimal_symbol_by_pc_section (pc, section).minsym))) == lookup_minimal_symbol_by_pc_section (pc, section).minsym)))
@ -4182,7 +4182,7 @@ find_function_alias_target (bound_minimal_symbol msymbol)
symbol *sym = find_pc_function (func_addr); symbol *sym = find_pc_function (func_addr);
if (sym != NULL if (sym != NULL
&& sym->aclass () == LOC_BLOCK && sym->aclass () == LOC_BLOCK
&& BLOCK_ENTRY_PC (sym->value_block ()) == func_addr) && sym->value_block ()->entry_pc () == func_addr)
return sym; return sym;
return NULL; return NULL;
@ -5791,7 +5791,7 @@ find_gnu_ifunc (const symbol *sym)
symbol_name_match_type::SEARCH_NAME); symbol_name_match_type::SEARCH_NAME);
struct objfile *objfile = sym->objfile (); struct objfile *objfile = sym->objfile ();
CORE_ADDR address = BLOCK_ENTRY_PC (sym->value_block ()); CORE_ADDR address = sym->value_block ()->entry_pc ();
minimal_symbol *ifunc = NULL; minimal_symbol *ifunc = NULL;
iterate_over_minimal_symbols (objfile, lookup_name, iterate_over_minimal_symbols (objfile, lookup_name,

View file

@ -2512,7 +2512,7 @@ info_scope_command (const char *args_in, int from_tty)
if (SYMBOL_COMPUTED_OPS (sym) != NULL) if (SYMBOL_COMPUTED_OPS (sym) != NULL)
SYMBOL_COMPUTED_OPS (sym)->describe_location (sym, SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
BLOCK_ENTRY_PC (block), block->entry_pc (),
gdb_stdout); gdb_stdout);
else else
{ {
@ -2587,7 +2587,7 @@ info_scope_command (const char *args_in, int from_tty)
gdb_printf ("a function at address "); gdb_printf ("a function at address ");
gdb_printf ("%s", gdb_printf ("%s",
paddress (gdbarch, paddress (gdbarch,
BLOCK_ENTRY_PC (sym->value_block ()))); sym->value_block ()->entry_pc ()));
break; break;
case LOC_UNRESOLVED: case LOC_UNRESOLVED:
msym = lookup_minimal_symbol (sym->linkage_name (), msym = lookup_minimal_symbol (sym->linkage_name (),

View file

@ -3184,7 +3184,7 @@ value_fn_field (struct value **arg1p, struct fn_field *f,
VALUE_LVAL (v) = lval_memory; VALUE_LVAL (v) = lval_memory;
if (sym) if (sym)
{ {
set_value_address (v, BLOCK_ENTRY_PC (sym->value_block ())); set_value_address (v, sym->value_block ()->entry_pc ());
} }
else else
{ {