[PATCH] Add sp_regnum_from_eax/pc_regnum_from_eax to i386 gdbarch_tdep

H.J. Lu hongjiu.lu@intel.com
Tue Apr 10 20:06:00 GMT 2012


Hi,

X32 RSP and RIP registers are 64bits.  We like to map SP register
to ESP and PC register to EIP so that $sp has data_ptr type and
$pc has func_ptr type.  This patch adds sp_regnum_from_eax and
pc_regnum_from_eax to i386 gdbarch_tdep.  X32 target will use them
to set up ESP as SP register and EIP as PC register by setting
sp_regnum_from_eax to AMD64_RSP_REGNUM and pc_regnum_from_eax to
AMD64_RIP_REGNUM.  We need to do it in i386_gdbarch_init since
ESP and EIP are pseudo registers and their register numbers are
only known in i386_gdbarch_init after all available registers are
identified.  Tested on Linux/x86-64.  OK for trunk?

Thanks.


H.J.
---
	* i386-tdep.c (i386_gdbarch_init): Initialize sp_regnum_from_eax
	and pc_regnum_from_eax to -1.  Update SP regnum from
	sp_regnum_from_eax and PC regnum from pc_regnum_from_eax if
	needed.

	* i386-tdep.h (gdbarch_tdep): Add sp_regnum_from_eax and
	pc_regnum_from_eax.

diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index d18aa99..beebf3f 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -7454,6 +7454,9 @@ 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);
@@ -7498,6 +7501,14 @@ 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 870054f..865e409 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -149,6 +149,14 @@ 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;
 
-- 
1.7.6.5



More information about the Gdb-patches mailing list