H.J. Lu <hongjiu.lu@intel.com>

* amd64-tdep.c (amd64_analyze_prologue): Additionally check for
`movl %esp, %ebp' for the X32 ABI.
This commit is contained in:
Mark Kettenis 2012-05-07 21:02:43 +00:00
parent f39c6ffde7
commit 649e6d9245
2 changed files with 40 additions and 9 deletions

View file

@ -1,3 +1,9 @@
2012-05-07 Mark Kettenis <kettenis@gnu.org>
H.J. Lu <hongjiu.lu@intel.com>
* amd64-tdep.c (amd64_analyze_prologue): Additionally check for
`movl %esp, %ebp' for the X32 ABI.
2012-05-07 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (dwarf_tag_name): Return const char *. Use

View file

@ -1867,8 +1867,14 @@ amd64_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
pushq %rbp 0x55
movq %rsp, %rbp 0x48 0x89 0xe5 (or 0x48 0x8b 0xec)
Any function that doesn't start with this sequence will be assumed
to have no prologue and thus no valid frame pointer in %rbp. */
or (for the X32 ABI):
pushq %rbp 0x55
movl %esp, %ebp 0x89 0xe5 (or 0x8b 0xec)
Any function that doesn't start with one of these sequences will be
assumed to have no prologue and thus no valid frame pointer in
%rbp. */
static CORE_ADDR
amd64_analyze_prologue (struct gdbarch *gdbarch,
@ -1879,6 +1885,10 @@ amd64_analyze_prologue (struct gdbarch *gdbarch,
/* 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 };
/* Ditto for movl %esp, %ebp. */
static const gdb_byte mov_esp_ebp_1[2] = { 0x89, 0xe5 };
static const gdb_byte mov_esp_ebp_2[2] = { 0x8b, 0xec };
gdb_byte buf[3];
gdb_byte op;
@ -1900,15 +1910,30 @@ amd64_analyze_prologue (struct gdbarch *gdbarch,
if (current_pc <= pc + 1)
return current_pc;
/* Check for `movq %rsp, %rbp'. */
read_memory (pc + 1, buf, 3);
if (memcmp (buf, mov_rsp_rbp_1, 3) != 0
&& memcmp (buf, mov_rsp_rbp_2, 3) != 0)
return pc + 1;
/* OK, we actually have a frame. */
cache->frameless_p = 0;
return pc + 4;
/* Check for `movq %rsp, %rbp'. */
if (memcmp (buf, mov_rsp_rbp_1, 3) == 0
|| memcmp (buf, mov_rsp_rbp_2, 3) == 0)
{
/* OK, we actually have a frame. */
cache->frameless_p = 0;
return pc + 4;
}
/* For X32, also check for `movq %esp, %ebp'. */
if (gdbarch_ptr_bit (gdbarch) == 32)
{
if (memcmp (buf, mov_esp_ebp_1, 2) == 0
|| memcmp (buf, mov_esp_ebp_2, 2) == 0)
{
/* OK, we actually have a frame. */
cache->frameless_p = 0;
return pc + 3;
}
}
return pc + 1;
}
return pc;