diff options
author | Tom de Vries <tdevries@suse.de> | 2023-05-16 17:00:51 +0100 |
---|---|---|
committer | Luis Machado <luis.machado@arm.com> | 2023-06-07 12:01:12 +0100 |
commit | 22f2cf64f178fa3c85508d08fe10dd4e98af4751 (patch) | |
tree | fcc76f49c4e1176fc3695aa2e079e257c129d797 /gdb/aarch64-tdep.c | |
parent | d033023bc4ce9e61fe47172ee451cce2b96cdc98 (diff) | |
download | gdb-22f2cf64f178fa3c85508d08fe10dd4e98af4751.zip gdb-22f2cf64f178fa3c85508d08fe10dd4e98af4751.tar.gz gdb-22f2cf64f178fa3c85508d08fe10dd4e98af4751.tar.bz2 |
Fix PR30369 regression on aarch64/arm (PR30506)
The gdb.dwarf2/dw2-prologue-end-2.exp test was failing for both AArch64 and
Arm.
As Tom pointed out here (https://inbox.sourceware.org/gdb-patches/6663707c-4297-c2f2-a0bd-f3e84fc62aad@suse.de/),
there are issues with both the prologue skipper for AArch64 and Arm and an
incorrect assumption by the testcase.
This patch fixes both of AArch64's and Arm's prologue skippers to not skip past
the end of a function. It also incorporates a fix to the testcase so it
doesn't assume the prologue skipper will stop at the first instruction of the
functions/labels.
Regression-tested on aarch64-linux/arm-linux Ubuntu 20.04/22.04 and
x86_64-linux Ubuntu 20.04.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30506
Co-Authored-By: Tom de Vries <tdevries@suse.de>
Co-Authored-By: Luis Machado <luis.machado@arm.com>
Diffstat (limited to 'gdb/aarch64-tdep.c')
-rw-r--r-- | gdb/aarch64-tdep.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index d8603c4..84a90b6 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -917,12 +917,15 @@ aarch64_analyze_prologue_test (void) static CORE_ADDR aarch64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) { - CORE_ADDR func_addr, limit_pc; + CORE_ADDR func_addr, func_end_addr, limit_pc; /* See if we can determine the end of the prologue via the symbol table. If so, then return either PC, or the PC after the prologue, whichever is greater. */ - if (find_pc_partial_function (pc, NULL, &func_addr, NULL)) + bool func_addr_found + = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr); + + if (func_addr_found) { CORE_ADDR post_prologue_pc = skip_prologue_using_sal (gdbarch, func_addr); @@ -942,6 +945,9 @@ aarch64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) if (limit_pc == 0) limit_pc = pc + 128; /* Magic. */ + limit_pc + = func_end_addr == 0? limit_pc : std::min (limit_pc, func_end_addr - 4); + /* Try disassembling prologue. */ return aarch64_analyze_prologue (gdbarch, pc, limit_pc, NULL); } |