[PATCH] Set PC/SP types properly for x32

H.J. Lu hongjiu.lu@intel.com
Wed Jun 13 22:28:00 GMT 2012


Hi,

For x32, we want to set PC to the pseudo register EIP and set SP to the
pseudo register ESP.  But we won't know their register numbers until all
pseudo registers are determined.  This patch adds sp_regnum_from_eax and
pc_regnum_from_eax.  They are used to properly PC to EIP and SP to
ESP for x32.  OK to install?

Thanks.


H.J.
	* amd64-tdep.c (amd64_x32_init_abi): Set sp_regnum_from_eax to
	AMD64_RSP_REGNUM and pc_regnum_from_eax to AMD64_RIP_REGNUM.

	* 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/amd64-tdep.c b/gdb/amd64-tdep.c
index 2db5cf0..9bcf845 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -2761,6 +2801,9 @@ 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 ce4c8a4..357cf8e 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -7787,6 +7787,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);
@@ -7831,6 +7834,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 5f233f5..76afdce 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;
 



More information about the Gdb-patches mailing list