Fix sparc prologue skipping

sparc can fail at inline prologue skipping.  Andrew Burgess tracked
this down to sparc32_skip_prologue, which should use
skip_prologue_using_sal rather than its hand-rolled variant.

I don't have a good way to test this with the gdb test suite (is there
a board file for using qemu?  That would help), but it fixes a
regression in the internal AdaCore test suite.  We've had this patch
internally at AdaCore for a while, but I just now finally got around
to making sure that backing it out reintroduces the problem.

gdb/ChangeLog
2020-09-21  Tom Tromey  <tromey@adacore.com>

	* sparc-tdep.c (sparc32_skip_prologue): Use
	skip_prologue_using_sal.
This commit is contained in:
Tom Tromey
2020-09-21 07:09:10 -06:00
parent c73eac969a
commit 5dd918d980
2 changed files with 13 additions and 7 deletions

View File

@ -1,3 +1,8 @@
2020-09-21 Tom Tromey <tromey@adacore.com>
* sparc-tdep.c (sparc32_skip_prologue): Use
skip_prologue_using_sal.
2020-09-19 Tom Tromey <tom@tromey.com>
* symfile.c (add_section_size_callback): Remove.

View File

@ -1127,18 +1127,19 @@ static CORE_ADDR
sparc32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
{
struct symtab_and_line sal;
CORE_ADDR func_start, func_end;
CORE_ADDR func_addr;
struct sparc_frame_cache cache;
/* This is the preferred method, find the end of the prologue by
using the debugging information. */
if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
{
sal = find_pc_line (func_start, 0);
if (sal.end < func_end
&& start_pc <= sal.end)
return sal.end;
if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
{
CORE_ADDR post_prologue_pc
= skip_prologue_using_sal (gdbarch, func_addr);
if (post_prologue_pc != 0)
return std::max (start_pc, post_prologue_pc);
}
start_pc = sparc_analyze_prologue (gdbarch, start_pc, 0xffffffffUL, &cache);