Factor out minsym_found/find_function_start_sal overload
I need to make the ifunc resolving code in elfread.c skip the target function's prologue like minsym_found does. I thought of factoring that out to a separate function, but turns out there's already a comment in find_function_start_sal that says that should agree with minsym_found... Instead of making sure the code agrees with a comment, factor out the common code to a separate function and use it from both places. Note that the current find_function_start_sal does a bit more than minsym_found's equivalent (the "We always should ..." bit), though that's probably a latent bug. gdb/ChangeLog: 2018-04-26 Pedro Alves <palves@redhat.com> * linespec.c (minsym_found): Use find_function_start_sal CORE_ADDR overload. * symtab.c (find_function_start_sal(CORE_ADDR, obj_section *,bool)): New, factored out from ... (find_function_start_sal(symbol *, int)): ... this. Reimplement and use bool. * symtab.h (find_function_start_sal(CORE_ADDR, obj_section *,bool)): New. (find_function_start_sal(symbol *, int)): Change boolean parameter type to bool.
This commit is contained in:
parent
a0aca7b0e1
commit
42ddae103c
|
@ -4292,25 +4292,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
|
|||
symtab_and_line sal;
|
||||
|
||||
if (is_function && want_start_sal)
|
||||
{
|
||||
sal = find_pc_sect_line (func_addr, NULL, 0);
|
||||
|
||||
if (self->funfirstline)
|
||||
{
|
||||
if (sal.symtab != NULL
|
||||
&& (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab))
|
||||
|| SYMTAB_LANGUAGE (sal.symtab) == language_asm))
|
||||
{
|
||||
struct gdbarch *gdbarch = get_objfile_arch (objfile);
|
||||
|
||||
sal.pc = func_addr;
|
||||
if (gdbarch_skip_entrypoint_p (gdbarch))
|
||||
sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc);
|
||||
}
|
||||
else
|
||||
skip_prologue_sal (&sal);
|
||||
}
|
||||
}
|
||||
sal = find_function_start_sal (func_addr, NULL, self->funfirstline);
|
||||
else
|
||||
{
|
||||
sal.objfile = objfile;
|
||||
|
|
45
gdb/symtab.c
45
gdb/symtab.c
|
@ -3575,46 +3575,36 @@ find_pc_line_pc_range (CORE_ADDR pc, CORE_ADDR *startptr, CORE_ADDR *endptr)
|
|||
return sal.symtab != 0;
|
||||
}
|
||||
|
||||
/* Given a function symbol SYM, find the symtab and line for the start
|
||||
of the function.
|
||||
If the argument FUNFIRSTLINE is nonzero, we want the first line
|
||||
of real code inside the function.
|
||||
This function should return SALs matching those from minsym_found,
|
||||
otherwise false multiple-locations breakpoints could be placed. */
|
||||
/* See symtab.h. */
|
||||
|
||||
struct symtab_and_line
|
||||
find_function_start_sal (struct symbol *sym, int funfirstline)
|
||||
symtab_and_line
|
||||
find_function_start_sal (CORE_ADDR func_addr, obj_section *section,
|
||||
bool funfirstline)
|
||||
{
|
||||
fixup_symbol_section (sym, NULL);
|
||||
|
||||
obj_section *section = SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym);
|
||||
symtab_and_line sal
|
||||
= find_pc_sect_line (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)), section, 0);
|
||||
sal.symbol = sym;
|
||||
symtab_and_line sal = find_pc_sect_line (func_addr, section, 0);
|
||||
|
||||
if (funfirstline && sal.symtab != NULL
|
||||
&& (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab))
|
||||
|| SYMTAB_LANGUAGE (sal.symtab) == language_asm))
|
||||
{
|
||||
struct gdbarch *gdbarch = symbol_arch (sym);
|
||||
struct gdbarch *gdbarch = get_objfile_arch (SYMTAB_OBJFILE (sal.symtab));
|
||||
|
||||
sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
|
||||
sal.pc = func_addr;
|
||||
if (gdbarch_skip_entrypoint_p (gdbarch))
|
||||
sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc);
|
||||
return sal;
|
||||
}
|
||||
|
||||
/* We always should have a line for the function start address.
|
||||
If we don't, something is odd. Create a plain SAL refering
|
||||
If we don't, something is odd. Create a plain SAL referring
|
||||
just the PC and hope that skip_prologue_sal (if requested)
|
||||
can find a line number for after the prologue. */
|
||||
if (sal.pc < BLOCK_START (SYMBOL_BLOCK_VALUE (sym)))
|
||||
if (sal.pc < func_addr)
|
||||
{
|
||||
sal = {};
|
||||
sal.pspace = current_program_space;
|
||||
sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
|
||||
sal.pc = func_addr;
|
||||
sal.section = section;
|
||||
sal.symbol = sym;
|
||||
}
|
||||
|
||||
if (funfirstline)
|
||||
|
@ -3623,6 +3613,21 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
|
|||
return sal;
|
||||
}
|
||||
|
||||
/* See symtab.h. */
|
||||
|
||||
symtab_and_line
|
||||
find_function_start_sal (symbol *sym, bool funfirstline)
|
||||
{
|
||||
fixup_symbol_section (sym, NULL);
|
||||
symtab_and_line sal
|
||||
= find_function_start_sal (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
|
||||
SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym),
|
||||
funfirstline);
|
||||
sal.symbol = sym;
|
||||
return sal;
|
||||
}
|
||||
|
||||
|
||||
/* Given a function start address FUNC_ADDR and SYMTAB, find the first
|
||||
address for that function that has an entry in SYMTAB's line info
|
||||
table. If such an entry cannot be found, return FUNC_ADDR
|
||||
|
|
13
gdb/symtab.h
13
gdb/symtab.h
|
@ -1899,8 +1899,17 @@ int matching_obj_sections (struct obj_section *, struct obj_section *);
|
|||
|
||||
extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
|
||||
|
||||
extern struct symtab_and_line find_function_start_sal (struct symbol *sym,
|
||||
int);
|
||||
/* Given a function symbol SYM, find the symtab and line for the start
|
||||
of the function. If FUNFIRSTLINE is true, we want the first line
|
||||
of real code inside the function. */
|
||||
extern symtab_and_line find_function_start_sal (symbol *sym, bool
|
||||
funfirstline);
|
||||
|
||||
/* Same, but start with a function address/section instead of a
|
||||
symbol. */
|
||||
extern symtab_and_line find_function_start_sal (CORE_ADDR func_addr,
|
||||
obj_section *section,
|
||||
bool funfirstline);
|
||||
|
||||
extern void skip_prologue_sal (struct symtab_and_line *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue