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: rs6000_store_return_value: pitch deprecated_write_register_bytes


This removes the use of a deprecated regcache function, and stops
registering a deprecated gdbarch method.

2004-06-04  Jim Blandy  <jimb@redhat.com>

	* rs6000-tdep.c (rs6000_store_return_value): Use
	regcache_cooked_write_part instead of
	deprecated_write_register_bytes.
	(rs6000_gdbarch_init): Register it for gdbarch_store_return_value,
	not gdbarch_deprecated_store_return_value.

Index: gdb/rs6000-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v
retrieving revision 1.211
diff -c -p -r1.211 rs6000-tdep.c
*** gdb/rs6000-tdep.c	2 Jun 2004 03:06:23 -0000	1.211
--- gdb/rs6000-tdep.c	4 Jun 2004 22:40:18 -0000
*************** rs6000_dwarf2_reg_to_regnum (int num)
*** 1894,1931 ****
  
  
  static void
! rs6000_store_return_value (struct type *type, char *valbuf)
  {
!   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
  
    /* The calling convention this function implements assumes the
       processor has floating-point registers.  We shouldn't be using it
       on PPC variants that lack them.  */
!   gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
  
    if (TYPE_CODE (type) == TYPE_CODE_FLT)
- 
      /* Floating point values are returned starting from FPR1 and up.
         Say a double_double_double type could be returned in
         FPR1/FPR2/FPR3 triple.  */
! 
!     deprecated_write_register_bytes
!       (DEPRECATED_REGISTER_BYTE (tdep->ppc_fp0_regnum + 1),
!        valbuf,
!        TYPE_LENGTH (type));
    else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
      {
        if (TYPE_LENGTH (type) == 16
            && TYPE_VECTOR (type))
! 	deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (tdep->ppc_vr0_regnum + 2),
! 					 valbuf, TYPE_LENGTH (type));
      }
    else
      /* Everything else is returned in GPR3 and up.  */
!     deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (gdbarch_tdep (current_gdbarch)->ppc_gp0_regnum + 3),
! 				     valbuf, TYPE_LENGTH (type));
  }
  
  /* Extract from an array REGBUF containing the (raw) register state
     the address in which a function should return its structure value,
     as a CORE_ADDR (or an expression that can be used as one).  */
--- 1894,1947 ----
  
  
  static void
! rs6000_store_return_value (struct type *type,
!                            struct regcache *regcache,
!                            const void *valbuf)
  {
!   struct gdbarch *gdbarch = get_regcache_arch (regcache);
!   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
!   int regnum = -1;
  
    /* The calling convention this function implements assumes the
       processor has floating-point registers.  We shouldn't be using it
       on PPC variants that lack them.  */
!   gdb_assert (ppc_floating_point_unit_p (gdbarch));
  
    if (TYPE_CODE (type) == TYPE_CODE_FLT)
      /* Floating point values are returned starting from FPR1 and up.
         Say a double_double_double type could be returned in
         FPR1/FPR2/FPR3 triple.  */
!     regnum = tdep->ppc_fp0_regnum + 1;
    else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
      {
        if (TYPE_LENGTH (type) == 16
            && TYPE_VECTOR (type))
!         regnum = tdep->ppc_vr0_regnum + 2;
!       else
!         gdb_assert (0);
      }
    else
      /* Everything else is returned in GPR3 and up.  */
!     regnum = tdep->ppc_gp0_regnum + 3;
! 
!   {
!     size_t bytes_written = 0;
! 
!     while (bytes_written < TYPE_LENGTH (type))
!       {
!         /* How much of this value can we write to this register?  */
!         size_t bytes_to_write = min (TYPE_LENGTH (type) - bytes_written,
!                                      register_size (gdbarch, regnum));
!         regcache_cooked_write_part (regcache, regnum,
!                                     0, bytes_to_write,
!                                     (char *) valbuf + bytes_written);
!         regnum++;
!         bytes_written += bytes_to_write;
!       }
!   }
  }
  
+ 
  /* Extract from an array REGBUF containing the (raw) register state
     the address in which a function should return its structure value,
     as a CORE_ADDR (or an expression that can be used as one).  */
*************** rs6000_gdbarch_init (struct gdbarch_info
*** 2885,2891 ****
    else
      {
        set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
!       set_gdbarch_deprecated_store_return_value (gdbarch, rs6000_store_return_value);
      }
  
    /* Set lr_frame_offset.  */
--- 2901,2907 ----
    else
      {
        set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
!       set_gdbarch_store_return_value (gdbarch, rs6000_store_return_value);
      }
  
    /* Set lr_frame_offset.  */


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