From 5dd918d980cbcd31a569a6577d520c9da2ef9964 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 21 Sep 2020 07:09:10 -0600 Subject: 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 * sparc-tdep.c (sparc32_skip_prologue): Use skip_prologue_using_sal. --- gdb/ChangeLog | 5 +++++ gdb/sparc-tdep.c | 13 +++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 131ec93..ce9cef5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-09-21 Tom Tromey + + * sparc-tdep.c (sparc32_skip_prologue): Use + skip_prologue_using_sal. + 2020-09-19 Tom Tromey * symfile.c (add_section_size_callback): Remove. diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index e9636cd..8417a47 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -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)) + + if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL)) { - sal = find_pc_line (func_start, 0); + CORE_ADDR post_prologue_pc + = skip_prologue_using_sal (gdbarch, func_addr); - if (sal.end < func_end - && start_pc <= sal.end) - return sal.end; + if (post_prologue_pc != 0) + return std::max (start_pc, post_prologue_pc); } start_pc = sparc_analyze_prologue (gdbarch, start_pc, 0xffffffffUL, &cache); -- cgit v1.1