From 9f74450152e53440800ad827592ccdf25e26f103 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Thu, 1 Apr 2004 21:00:59 +0000 Subject: [PATCH] * rs6000-tdep.c (rs6000_dwarf2_stab_reg_to_regnum): New, unified function for register numbers on all the rs6000-derived targets. (rs6000_gdbarch_init): Don't register a separate gdbarch_dwarf2_reg_to_regnum function for the E500. Use rs6000_dwarf2_stab_reg_to_regnum for both Dwarf 2 and stabs on all variants. --- gdb/ChangeLog | 7 +++++ gdb/rs6000-tdep.c | 75 +++++++++++++++++++++++++---------------------- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aada64c0278..29f405f6642 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2004-04-01 Jim Blandy + * rs6000-tdep.c (rs6000_dwarf2_stab_reg_to_regnum): New, unified + function for register numbers on all the rs6000-derived targets. + (rs6000_gdbarch_init): Don't register a separate + gdbarch_dwarf2_reg_to_regnum function for the E500. Use + rs6000_dwarf2_stab_reg_to_regnum for both Dwarf 2 and stabs on all + variants. + * i386-tdep.c: Add FIXME regarding STABS vs. Dwarf 2 register numbering. diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 00062da2080..b4d624838e1 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1556,42 +1556,47 @@ e500_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, } } -/* Convert a dwarf2 register number to a gdb REGNUM. */ +/* Convert a dbx stab or Dwarf 2 register number (from `r' + declaration) to a gdb REGNUM. */ static int -e500_dwarf2_reg_to_regnum (int num) +rs6000_dwarf2_stab_reg_to_regnum (int num) { - int regnum; - if (0 <= num && num <= 31) - return num + gdbarch_tdep (current_gdbarch)->ppc_gp0_regnum; - else - return num; -} + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); -/* Convert a dbx stab register number (from `r' declaration) to a gdb - REGNUM. */ -static int -rs6000_stab_reg_to_regnum (int num) -{ - int regnum; - switch (num) - { - case 64: - regnum = gdbarch_tdep (current_gdbarch)->ppc_mq_regnum; - break; - case 65: - regnum = gdbarch_tdep (current_gdbarch)->ppc_lr_regnum; - break; - case 66: - regnum = gdbarch_tdep (current_gdbarch)->ppc_ctr_regnum; - break; - case 76: - regnum = gdbarch_tdep (current_gdbarch)->ppc_xer_regnum; - break; - default: - regnum = num; - break; - } - return regnum; + if (0 <= num && num <= 31) + return tdep->ppc_gp0_regnum + num; + else if (32 <= num && num <= 63) + return FP0_REGNUM + (num - 32); + else if (1200 <= num && num < 1200 + 32) + return tdep->ppc_ev0_regnum + (num - 1200); + else + switch (num) + { + case 64: + return tdep->ppc_mq_regnum; + case 65: + return tdep->ppc_lr_regnum; + case 66: + return tdep->ppc_ctr_regnum; + case 76: + return tdep->ppc_xer_regnum; + case 109: + return tdep->ppc_vrsave_regnum; + default: + return num; + } + + /* FIXME: jimb/2004-03-28: Doesn't something need to be done here + for the Altivec registers, too? + + Looking at GCC, the headers in config/rs6000 never define a + DBX_REGISTER_NUMBER macro, so the debug info uses the same + numbers GCC does internally. Then, looking at the REGISTER_NAMES + macro defined in config/rs6000/rs6000.h, it seems that GCC gives + v0 -- v31 the numbers 77 -- 108. But we number them 119 -- 150. + + I don't have a way to test this ready to hand, but I noticed it + and thought I should include a note. */ } static void @@ -2599,7 +2604,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pc_regnum (gdbarch, 0); set_gdbarch_sp_regnum (gdbarch, tdep->ppc_gp0_regnum + 1); set_gdbarch_deprecated_fp_regnum (gdbarch, tdep->ppc_gp0_regnum + 1); - set_gdbarch_dwarf2_reg_to_regnum (gdbarch, e500_dwarf2_reg_to_regnum); set_gdbarch_pseudo_register_read (gdbarch, e500_pseudo_register_read); set_gdbarch_pseudo_register_write (gdbarch, e500_pseudo_register_write); break; @@ -2674,7 +2678,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_deprecated_register_convertible (gdbarch, rs6000_register_convertible); set_gdbarch_deprecated_register_convert_to_virtual (gdbarch, rs6000_register_convert_to_virtual); set_gdbarch_deprecated_register_convert_to_raw (gdbarch, rs6000_register_convert_to_raw); - set_gdbarch_stab_reg_to_regnum (gdbarch, rs6000_stab_reg_to_regnum); + set_gdbarch_stab_reg_to_regnum (gdbarch, rs6000_dwarf2_stab_reg_to_regnum); + set_gdbarch_dwarf2_reg_to_regnum (gdbarch, rs6000_dwarf2_stab_reg_to_regnum); /* Note: kevinb/2002-04-12: I'm not convinced that rs6000_push_arguments() is correct for the SysV ABI when the wordsize is 8, but I'm also fairly certain that ppc_sysv_abi_push_arguments() will give even -- 2.30.2