From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: RFA: fix register numbering on PPC Date: Fri, 28 May 2004 02:28:00 -0000 Message-id: X-SW-Source: 2004-05/msg00764.html This addresses the FIXME at the end of the current rs6000_dwarf2_stab_reg_to_regnum function. 2004-05-26 Jim Blandy * rs6000-tdep.c (rs6000_dwarf2_stab_reg_to_regnum): Deleted. (rs6000_stab_reg_to_regnum, rs6000_dwarf2_reg_to_regnum): New functions, updated to match the register numberings used in GCC. (rs6000_gdbarch_init): Register rs6000_stab_reg_to_regnum and rs6000_dwarf2_reg_to_regnum as register number conversions functions for STABS and Dwarf2. Index: gdb/rs6000-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v retrieving revision 1.208 diff -c -p -r1.208 rs6000-tdep.c *** gdb/rs6000-tdep.c 22 May 2004 06:03:26 -0000 1.208 --- gdb/rs6000-tdep.c 26 May 2004 16:42:33 -0000 *************** e500_pseudo_register_write (struct gdbar *** 1829,1838 **** } } ! /* Convert a dbx stab or Dwarf 2 register number (from `r' ! declaration) to a gdb REGNUM. */ static int ! rs6000_dwarf2_stab_reg_to_regnum (int num) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); --- 1829,1837 ---- } } ! /* Convert a DBX STABS register number to a GDB register number. */ static int ! rs6000_stab_reg_to_regnum (int num) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); *************** rs6000_dwarf2_stab_reg_to_regnum (int nu *** 1843,1848 **** --- 1842,1849 ---- specifies registers the architecture doesn't have? Our callers don't check the value we return. */ return tdep->ppc_fp0_regnum + (num - 32); + else if (77 <= num && num <= 108) + return tdep->ppc_vr0_regnum + (num - 77); else if (1200 <= num && num < 1200 + 32) return tdep->ppc_ev0_regnum + (num - 1200); else *************** rs6000_dwarf2_stab_reg_to_regnum (int nu *** 1858,1884 **** return tdep->ppc_xer_regnum; case 109: return tdep->ppc_vrsave_regnum; case 111: ! return gdbarch_tdep (current_gdbarch)->ppc_acc_regnum; case 112: ! return gdbarch_tdep (current_gdbarch)->ppc_spefscr_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 rs6000_store_return_value (struct type *type, char *valbuf) { --- 1859,1918 ---- return tdep->ppc_xer_regnum; case 109: return tdep->ppc_vrsave_regnum; + case 110: + return tdep->ppc_vrsave_regnum - 1; /* vscr */ case 111: ! return tdep->ppc_acc_regnum; case 112: ! return tdep->ppc_spefscr_regnum; default: return num; } + } ! /* Convert a Dwarf 2 register number to a GDB register number. */ ! static int ! rs6000_dwarf2_reg_to_regnum (int num) ! { ! struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); ! if (0 <= num && num <= 31) ! return tdep->ppc_gp0_regnum + num; ! else if (32 <= num && num <= 63) ! /* FIXME: jimb/2004-05-05: What should we do when the debug info ! specifies registers the architecture doesn't have? Our ! callers don't check the value we return. */ ! return tdep->ppc_fp0_regnum + (num - 32); ! else if (1124 <= num && num < 1124 + 32) ! return tdep->ppc_vr0_regnum + (num - 1124); ! else if (1200 <= num && num < 1200 + 32) ! return tdep->ppc_ev0_regnum + (num - 1200); ! else ! switch (num) ! { ! case 67: ! return tdep->ppc_vrsave_regnum - 1; /* vscr */ ! case 99: ! return tdep->ppc_acc_regnum; ! case 100: ! return tdep->ppc_mq_regnum; ! case 101: ! return tdep->ppc_xer_regnum; ! case 108: ! return tdep->ppc_lr_regnum; ! case 109: ! return tdep->ppc_ctr_regnum; ! case 356: ! return tdep->ppc_vrsave_regnum; ! case 612: ! return tdep->ppc_spefscr_regnum; ! default: ! return num; ! } } + static void rs6000_store_return_value (struct type *type, char *valbuf) { *************** rs6000_gdbarch_init (struct gdbarch_info *** 2970,2977 **** 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_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 --- 3004,3011 ---- 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_dwarf2_reg_to_regnum (gdbarch, rs6000_dwarf2_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