[PATCH] Partial fix for PR backtrace/1718
Mark Kettenis
kettenis@chello.nl
Sat Jul 24 12:59:00 GMT 2004
This fixes the backtrace problem with Emacs that Eli reported. It's a
partial fix since the prologue analyzer still doesn't notice that %ebx
gets saved on the stack, but that's not terribly important. This
patch also doesn't handle all the other instructions that might end up
in the prologue.
Committed,
Mark
Index: ChangeLog
from Mark Kettenis <kettenis@gnu.org>
Partial fix for PR backtrace/1718.
* i386-tdep.c (i386_analyze_frame_setup): Handle more instructions
that GCC migrates into the prolugue. Don't handle any
instructions that clobber %ebx.
Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.197
diff -u -p -r1.197 i386-tdep.c
--- i386-tdep.c 18 Jun 2004 16:06:24 -0000 1.197
+++ i386-tdep.c 24 Jul 2004 12:53:37 -0000
@@ -503,20 +503,28 @@ i386_analyze_frame_setup (CORE_ADDR pc,
op = read_memory_unsigned_integer (pc + 1, 1);
- /* Check for some special instructions that might be migrated
- by GCC into the prologue. We check for
+ /* Check for some special instructions that might be migrated by
+ GCC into the prologue. At this point in the prologue, code
+ should only touch the scratch registers %eax, %ecx and %edx,
+ so we check for
+
+ movl $XXX, %eax
+ movl $XXX, %ecx
+ movl $XXX, %edx
- xorl %ebx, %ebx
+ These instructions have opcodes 0xb8, 0xb9 and 0xba.
+
+ We also check for
+
+ xorl %eax, %eax
xorl %ecx, %ecx
xorl %edx, %edx
- xorl %eax, %eax
and the equivalent
- subl %ebx, %ebx
+ subl %eax, %eax
subl %ecx, %ecx
subl %edx, %edx
- subl %eax, %eax
Because of the symmetry, there are actually two ways to
encode these instructions; with opcode bytes 0x29 and 0x2b
@@ -524,21 +532,35 @@ i386_analyze_frame_setup (CORE_ADDR pc,
Make sure we only skip these instructions if we later see the
`movl %esp, %ebp' that actually sets up the frame. */
- while (op == 0x29 || op == 0x2b || op == 0x31 || op == 0x33)
+ while ((op >= 0xb8 && op <= 0xba)
+ || op == 0x29 || op == 0x2b
+ || op == 0x31 || op == 0x33)
{
- op = read_memory_unsigned_integer (pc + skip + 2, 1);
- switch (op)
+ if (op >= 0xb8 && op <= 0xba)
+ {
+ /* Skip the `movl' instructions cited above. */
+ skip += 5;
+ }
+ else
{
- case 0xdb: /* %ebx */
- case 0xc9: /* %ecx */
- case 0xd2: /* %edx */
- case 0xc0: /* %eax */
- skip += 2;
- break;
- default:
- return pc + 1;
+ /* Skip the `subl' and `xorl' instructions cited above. */
+ op = read_memory_unsigned_integer (pc + skip + 2, 1);
+ switch (op)
+ {
+ case 0xc0: /* %eax */
+ case 0xc9: /* %ecx */
+ case 0xd2: /* %edx */
+ skip += 2;
+ break;
+ default:
+ return pc + 1;
+ }
}
+ /* If that's all, return now. */
+ if (current_pc <= pc + skip + 1)
+ return current_pc;
+
op = read_memory_unsigned_integer (pc + skip + 1, 1);
}
More information about the Gdb-patches
mailing list