Blame SOURCES/gdb-rhbz1125820-ppc64le-enablement-28of37.patch

7ab123
commit 0ff3e01fdc67a3842ee54224cf197e9a55f0a750
7ab123
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
7ab123
Date:   Tue Feb 4 18:34:19 2014 +0100
7ab123
7ab123
    PowerPC64 little-endian fixes: 128-bit DFP parameters / registers
7ab123
    
7ab123
    The powerpc64le-linux ABI specifies that when a 128-bit DFP value is
7ab123
    passed in a pair of floating-point registers, the first register holds
7ab123
    the most-significant part of the value.  This is as opposed to the
7ab123
    usual rule on little-endian systems, where the first register would
7ab123
    hold the least-significant part.
7ab123
    
7ab123
    This affects two places in GDB, the read/write routines for the
7ab123
    128-bit DFP pseudo-registers, and the function call / return
7ab123
    sequence.  For the former, current code already distinguishes
7ab123
    between big- and little-endian targets, but gets the latter
7ab123
    wrong.  This is presumably because *GCC* also got it wrong,
7ab123
    and GDB matches the old GCC behavior.  But GCC is now fixed:
7ab123
    http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02145.html
7ab123
    so GDB needs to be fixed too.  (Old code shouldn't really be
7ab123
    an issue since there is no code "out there" so far that uses
7ab123
    dfp128 on little-endian ...)
7ab123
    
7ab123
    gdb/ChangeLog:
7ab123
    
7ab123
    	* ppc-sysv-tdep.c (ppc64_sysv_abi_push_freg): Use correct order
7ab123
    	within a register pair holding a DFP 128-bit value on little-endian.
7ab123
    	(ppc64_sysv_abi_return_value_base): Likewise.
7ab123
    	* rs6000-tdep.c (dfp_pseudo_register_read): Likewise.
7ab123
    	(dfp_pseudo_register_write): Likewise.
7ab123
    
7ab123
    gdb/testsuite/ChangeLog:
7ab123
    
7ab123
    	* gdb.arch/powerpc-d128-regs.exp: Enable on powerpc64*-*.
7ab123
7ab123
Index: gdb-7.6.1/gdb/ppc-sysv-tdep.c
7ab123
===================================================================
7ab123
--- gdb-7.6.1.orig/gdb/ppc-sysv-tdep.c
7ab123
+++ gdb-7.6.1/gdb/ppc-sysv-tdep.c
7ab123
@@ -1269,9 +1269,11 @@ ppc64_sysv_abi_push_freg (struct gdbarch
7ab123
       if (argpos->regcache && argpos->freg <= 12)
7ab123
 	{
7ab123
 	  int regnum = tdep->ppc_fp0_regnum + argpos->freg;
7ab123
+	  int lopart = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 8 : 0;
7ab123
+	  int hipart = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
7ab123
 
7ab123
-	  regcache_cooked_write (argpos->regcache, regnum, val);
7ab123
-	  regcache_cooked_write (argpos->regcache, regnum + 1, val + 8);
7ab123
+	  regcache_cooked_write (argpos->regcache, regnum, val + hipart);
7ab123
+	  regcache_cooked_write (argpos->regcache, regnum + 1, val + lopart);
7ab123
 	}
7ab123
 
7ab123
       argpos->freg += 2;
7ab123
@@ -1684,16 +1686,18 @@ ppc64_sysv_abi_return_value_base (struct
7ab123
       && TYPE_CODE (valtype) == TYPE_CODE_DECFLOAT)
7ab123
     {
7ab123
       int regnum = tdep->ppc_fp0_regnum + 2 + 2 * index;
7ab123
+      int lopart = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 8 : 0;
7ab123
+      int hipart = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
7ab123
 
7ab123
       if (writebuf != NULL)
7ab123
 	{
7ab123
-	  regcache_cooked_write (regcache, regnum, writebuf);
7ab123
-	  regcache_cooked_write (regcache, regnum + 1, writebuf + 8);
7ab123
+	  regcache_cooked_write (regcache, regnum, writebuf + hipart);
7ab123
+	  regcache_cooked_write (regcache, regnum + 1, writebuf + lopart);
7ab123
 	}
7ab123
       if (readbuf != NULL)
7ab123
 	{
7ab123
-	  regcache_cooked_read (regcache, regnum, readbuf);
7ab123
-	  regcache_cooked_read (regcache, regnum + 1, readbuf + 8);
7ab123
+	  regcache_cooked_read (regcache, regnum, readbuf + hipart);
7ab123
+	  regcache_cooked_read (regcache, regnum + 1, readbuf + lopart);
7ab123
 	}
7ab123
       return 1;
7ab123
     }
7ab123
Index: gdb-7.6.1/gdb/rs6000-tdep.c
7ab123
===================================================================
7ab123
--- gdb-7.6.1.orig/gdb/rs6000-tdep.c
7ab123
+++ gdb-7.6.1/gdb/rs6000-tdep.c
7ab123
@@ -2723,10 +2723,10 @@ dfp_pseudo_register_read (struct gdbarch
7ab123
   else
7ab123
     {
7ab123
       status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
7ab123
-				  2 * reg_index + 1, buffer + 8);
7ab123
+				  2 * reg_index + 1, buffer);
7ab123
       if (status == REG_VALID)
7ab123
 	status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
7ab123
-				    2 * reg_index, buffer);
7ab123
+				    2 * reg_index, buffer + 8);
7ab123
     }
7ab123
 
7ab123
   return status;
7ab123
@@ -2752,9 +2752,9 @@ dfp_pseudo_register_write (struct gdbarc
7ab123
   else
7ab123
     {
7ab123
       regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
7ab123
-			  2 * reg_index + 1, buffer + 8);
7ab123
+			  2 * reg_index + 1, buffer);
7ab123
       regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
7ab123
-			  2 * reg_index, buffer);
7ab123
+			  2 * reg_index, buffer + 8);
7ab123
     }
7ab123
 }
7ab123
 
7ab123
Index: gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-d128-regs.exp
7ab123
===================================================================
7ab123
--- gdb-7.6.1.orig/gdb/testsuite/gdb.arch/powerpc-d128-regs.exp
7ab123
+++ gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-d128-regs.exp
7ab123
@@ -20,7 +20,7 @@
7ab123
 
7ab123
 # Testcase for ppc decimal128 pseudo-registers.
7ab123
 
7ab123
-if ![istarget "powerpc64-*"] then {
7ab123
+if ![istarget "powerpc64*-*"] then {
7ab123
     verbose "Skipping powerpc Decimal128 pseudo-registers testcase."
7ab123
     return
7ab123
 }