This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
PATCH: PR backtrace/14646: [x32] backtrace doesn't work
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: GDB <gdb-patches at sourceware dot org>
- Cc: mark dot kettenis at xs4all dot nl
- Date: Sun, 30 Sep 2012 14:40:17 -0700
- Subject: PATCH: PR backtrace/14646: [x32] backtrace doesn't work
Hi,
amd64_x32_init_abi has
tdep->sp_regnum_from_eax = AMD64_RSP_REGNUM;
tdep->pc_regnum_from_eax = AMD64_RIP_REGNUM;
But unwind frame info is based on the real RSP/RIP
registers. Pseudo sp/pc registers don't work with
frame related codes:
[hjl@gnu-tools-1 gdb]$ egrep "pc_regnum|sp_regnum" *fram*.c
dwarf2-frame.c: if (regnum == gdbarch_pc_regnum (gdbarch))
dwarf2-frame.c: else if (regnum == gdbarch_sp_regnum (gdbarch))
dwarf2-frame.c: == gdbarch_sp_regnum (gdbarch)))
dwarf2-frame-tailcall.c: if (regnum == gdbarch_pc_regnum
(this_gdbarch))
dwarf2-frame-tailcall.c: else if (cache->prev_sp_p && regnum ==
gdbarch_sp_regnum (this_gdbarch))
dwarf2-frame-tailcall.c: int sp_regnum;
dwarf2-frame-tailcall.c: sp_regnum = gdbarch_sp_regnum
(prev_gdbarch);
dwarf2-frame-tailcall.c: if (sp_regnum == -1)
dwarf2-frame-tailcall.c: prev_sp = frame_unwind_register_unsigned
(this_frame, sp_regnum);
frame.c: && gdbarch_pc_regnum (gdbarch) >= 0
frame.c: gdbarch_pc_regnum (gdbarch),
frame.c: gdbarch_pc_regnum (gdbarch),
frame.c: the gdbarch_sp_regnum register is meaningful. */
frame.c: if (gdbarch_sp_regnum (gdbarch) >= 0)
frame.c: gdbarch_sp_regnum (gdbarch));
[hjl@gnu-tools-1 gdb]$
It is nice to print
(gdb) p $sp
$1 = (void *) 0xffffd028
instead of
(gdb) p $sp
$1 = 4294955048
But it breaks frame unwind. This patch removes pseudo sp/pc regnum from
x32. "p $sp" and "p $pc" will print 64bit integers. But "p $esp" and
"p $esp" work fine. OK for trunk and 4.5 branch?
Thanks.
H.J.
---
2012-09-30 H.J. Lu <hongjiu.lu@intel.com>
PR backtrace/14646
PR gdb/14647
* i386-tdep.h (gdbarch_tdep): Remove sp_regnum_from_eax and
pc_regnum_from_eax.
* i386-tdep.c (i386_gdbarch_init): Don't use sp_regnum_from_eax
nor pc_regnum_from_eax.
* amd64-tdep.c (amd64_x32_init_abi): Don't set sp_regnum_from_eax
nor pc_regnum_from_eax.
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 5424926..8ae1142 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -2946,9 +2946,6 @@ amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
tdesc = tdesc_x32;
tdep->tdesc = tdesc;
- tdep->sp_regnum_from_eax = AMD64_RSP_REGNUM;
- tdep->pc_regnum_from_eax = AMD64_RIP_REGNUM;
-
tdep->num_dword_regs = 17;
set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type);
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 84e9794..ddb20aa 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -7705,9 +7705,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
tdep->num_mmx_regs = 8;
tdep->num_ymm_regs = 0;
- tdep->sp_regnum_from_eax = -1;
- tdep->pc_regnum_from_eax = -1;
-
tdesc_data = tdesc_data_alloc ();
set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
@@ -7752,14 +7749,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Support dword pseudo-register if it hasn't been disabled. */
tdep->eax_regnum = ymm0_regnum;
ymm0_regnum += tdep->num_dword_regs;
- if (tdep->sp_regnum_from_eax != -1)
- set_gdbarch_sp_regnum (gdbarch,
- (tdep->eax_regnum
- + tdep->sp_regnum_from_eax));
- if (tdep->pc_regnum_from_eax != -1)
- set_gdbarch_pc_regnum (gdbarch,
- (tdep->eax_regnum
- + tdep->pc_regnum_from_eax));
}
else
tdep->eax_regnum = -1;
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 76afdce..5f233f5 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -149,14 +149,6 @@ struct gdbarch_tdep
of pseudo dword register support. */
int eax_regnum;
- /* Register number for SP, relative to %eax. Set this to -1 to
- indicate the absence of pseudo SP register support. */
- int sp_regnum_from_eax;
-
- /* Register number for PC, relative to %eax. Set this to -1 to
- indicate the absence of pseudo PC register support. */
- int pc_regnum_from_eax;
-
/* Number of core registers. */
int num_core_regs;