This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: fix register numbering on PPC


This addresses the FIXME at the end of the current
rs6000_dwarf2_stab_reg_to_regnum function.

2004-05-26  Jim Blandy  <jimb@redhat.com>

	* 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]