diff options
author | Tom de Vries <tdevries@suse.de> | 2023-02-20 12:20:14 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-02-20 12:20:14 +0100 |
commit | 2f9f989c2b61d6556f01b2d80004f6abff46e4a3 (patch) | |
tree | c89aa03eeb2ff494723879bdd1893d9a34ba1bd3 /gdb | |
parent | cb911672fb70233f3ef127f68fc0a43d7f339a62 (diff) | |
download | gdb-2f9f989c2b61d6556f01b2d80004f6abff46e4a3.zip gdb-2f9f989c2b61d6556f01b2d80004f6abff46e4a3.tar.gz gdb-2f9f989c2b61d6556f01b2d80004f6abff46e4a3.tar.bz2 |
[gdb/tdep] Fix amd64/i386_stack_frame_destroyed_p
The use of compunit_epilogue_unwind_valid in both amd64_stack_frame_destroyed_p
and i386_stack_frame_destroyed_p is problematic, in the sense that the
functions no longer match their documented behaviour.
Fix this by moving the use of compunit_epilogue_unwind_valid to
amd64_epilogue_frame_sniffer and i386_epilogue_frame_sniffer. No functional
changes.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/amd64-tdep.c | 19 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 20 |
2 files changed, 24 insertions, 15 deletions
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 08f906b..75ab1b2 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2903,9 +2903,6 @@ amd64_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc) { gdb_byte insn; - if (compunit_epilogue_unwind_valid (find_pc_compunit_symtab (pc))) - return 0; - if (target_read_memory (pc, &insn, 1)) return 0; /* Can't read memory at pc. */ @@ -2920,11 +2917,19 @@ amd64_epilogue_frame_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame, void **this_prologue_cache) { - if (frame_relative_level (this_frame) == 0) - return amd64_stack_frame_destroyed_p (get_frame_arch (this_frame), - get_frame_pc (this_frame)); - else + struct gdbarch *gdbarch = get_frame_arch (this_frame); + CORE_ADDR pc = get_frame_pc (this_frame); + + if (frame_relative_level (this_frame) != 0) + /* We're not in the inner frame, so assume we're not in an epilogue. */ return 0; + + if (compunit_epilogue_unwind_valid (find_pc_compunit_symtab (pc))) + /* Don't override the symtab unwinders. */ + return 0; + + /* Check whether we're in an epilogue. */ + return amd64_stack_frame_destroyed_p (gdbarch, pc); } static struct amd64_frame_cache * diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 19358ca..032fcc4 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -2219,10 +2219,6 @@ static int i386_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc) { gdb_byte insn; - - if (compunit_epilogue_unwind_valid (find_pc_compunit_symtab (pc))) - return 0; - if (target_read_memory (pc, &insn, 1)) return 0; /* Can't read memory at pc. */ @@ -2237,11 +2233,19 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame, void **this_prologue_cache) { - if (frame_relative_level (this_frame) == 0) - return i386_stack_frame_destroyed_p (get_frame_arch (this_frame), - get_frame_pc (this_frame)); - else + struct gdbarch *gdbarch = get_frame_arch (this_frame); + CORE_ADDR pc = get_frame_pc (this_frame); + + if (frame_relative_level (this_frame) != 0) + /* We're not in the inner frame, so assume we're not in an epilogue. */ + return 0; + + if (compunit_epilogue_unwind_valid (find_pc_compunit_symtab (pc))) + /* Don't override the symtab unwinders. */ return 0; + + /* Check whether we're in an epilogue. */ + return i386_stack_frame_destroyed_p (gdbarch, pc); } static struct i386_frame_cache * |