* amd64-tdep.c (amd64_analyze_prologue): Recognize both variations of

"mov %rsp,%rbp".
This commit is contained in:
Doug Evans 2012-04-06 21:52:22 +00:00
parent 8c7a0b00aa
commit 50f1ae7b0c
2 changed files with 11 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2012-04-06 Doug Evans <dje@google.com>
* amd64-tdep.c (amd64_analyze_prologue): Recognize both variations of
"mov %rsp,%rbp".
2012-04-05 Kevin Buettner <kevinb@redhat.com> 2012-04-05 Kevin Buettner <kevinb@redhat.com>
* v850-tdep.c (E_NUM_OF_V850_REGS, E_NUM_OF_V850E_REGS): Fix * v850-tdep.c (E_NUM_OF_V850_REGS, E_NUM_OF_V850E_REGS): Fix

View File

@ -1865,7 +1865,7 @@ amd64_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
We will handle only functions beginning with: We will handle only functions beginning with:
pushq %rbp 0x55 pushq %rbp 0x55
movq %rsp, %rbp 0x48 0x89 0xe5 movq %rsp, %rbp 0x48 0x89 0xe5 (or 0x48 0x8b 0xec)
Any function that doesn't start with this sequence will be assumed Any function that doesn't start with this sequence will be assumed
to have no prologue and thus no valid frame pointer in %rbp. */ to have no prologue and thus no valid frame pointer in %rbp. */
@ -1876,7 +1876,9 @@ amd64_analyze_prologue (struct gdbarch *gdbarch,
struct amd64_frame_cache *cache) struct amd64_frame_cache *cache)
{ {
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
static gdb_byte proto[3] = { 0x48, 0x89, 0xe5 }; /* movq %rsp, %rbp */ /* There are two variations of movq %rsp, %rbp. */
static const gdb_byte mov_rsp_rbp_1[3] = { 0x48, 0x89, 0xe5 };
static const gdb_byte mov_rsp_rbp_2[3] = { 0x48, 0x8b, 0xec };
gdb_byte buf[3]; gdb_byte buf[3];
gdb_byte op; gdb_byte op;
@ -1900,7 +1902,8 @@ amd64_analyze_prologue (struct gdbarch *gdbarch,
/* Check for `movq %rsp, %rbp'. */ /* Check for `movq %rsp, %rbp'. */
read_memory (pc + 1, buf, 3); read_memory (pc + 1, buf, 3);
if (memcmp (buf, proto, 3) != 0) if (memcmp (buf, mov_rsp_rbp_1, 3) != 0
&& memcmp (buf, mov_rsp_rbp_2, 3) != 0)
return pc + 1; return pc + 1;
/* OK, we actually have a frame. */ /* OK, we actually have a frame. */