[PATCH v2 05/11] Little-endian fixes: 32-bit DFP parameters

Ulrich Weigand uweigand@de.ibm.com
Fri Jan 31 16:43:00 GMT 2014


Hello,

passing a 32-bit DFP in register needs to use the least-significant part
of the register.  Like with a previous patch that addressed the same
issue for small structs, this patch makes sure the appropriate offset
is used on little-endian systems.

Tested on powerpc64-linux and powerpc64le-linux.

v2 series changes: added ChangeLog, coding style fixes.

Bye,
Ulrich

ChangeLog:

	* ppc-sysv-tdep.c (ppc64_sysv_abi_push_freg): Use correct
	offset on little-endian when passing _Decimal32.
	(ppc64_sysv_abi_return_value_base): Likewise for return values.

Index: binutils-gdb/gdb/ppc-sysv-tdep.c
===================================================================
--- binutils-gdb.orig/gdb/ppc-sysv-tdep.c
+++ binutils-gdb/gdb/ppc-sysv-tdep.c
@@ -1232,7 +1232,10 @@ ppc64_sysv_abi_push_freg (struct gdbarch
       if (argpos->regcache && argpos->freg <= 13)
 	{
 	  int regnum = tdep->ppc_fp0_regnum + argpos->freg;
-	  int offset = 8 - TYPE_LENGTH (type);
+	  int offset = 0;
+
+	  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
+	    offset = 8 - TYPE_LENGTH (type);
 
 	  regcache_cooked_write_part (argpos->regcache, regnum,
 				      offset, TYPE_LENGTH (type), val);
@@ -1641,7 +1644,10 @@ ppc64_sysv_abi_return_value_base (struct
       && TYPE_CODE (valtype) == TYPE_CODE_DECFLOAT)
     {
       int regnum = tdep->ppc_fp0_regnum + 1 + index;
-      int offset = 8 - TYPE_LENGTH (valtype);
+      int offset = 0;
+
+      if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
+	offset = 8 - TYPE_LENGTH (valtype);
 
       if (writebuf != NULL)
 	regcache_cooked_write_part (regcache, regnum,
-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com



More information about the Gdb-patches mailing list