PowerPC64 little-endian fixes: structure passing
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 4 Feb 2014 17:26:26 +0000 (18:26 +0100)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 4 Feb 2014 17:26:26 +0000 (18:26 +0100)
When passing a small structure in a GPR, the ABI specifies that it
should be passed in the least-significant bytes of the register
(or stack slot).  On big-endian systems, this means the value
needs to be stored at an offset, which is what current code does.

However, on little-endian systems, the least-significant bytes are
addresses with offset 0.  This patch fixes that.

gdb/ChangeLog:

* ppc-sysv-tdep.c (ppc64_sysv_abi_push_val): Use correct
offset on little-endian when passing small structures.

gdb/ChangeLog
gdb/ppc-sysv-tdep.c

index 281c441ff434affe539f70c0bae3e4e137c80895..ffa636ea63de1663a8569a17ff1129b4014c3268 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-04  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * ppc-sysv-tdep.c (ppc64_sysv_abi_push_val): Use correct
+       offset on little-endian when passing small structures.
+
 2014-02-04  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * ppc-sysv-tdep.c (get_decimal_float_return_value): Update comment.
index 77a71bc987a09afa50362a4e276e273d402b381e..62e9cbdaccb75b5c72d08e6feb2e339ea5803187 100644 (file)
@@ -1150,7 +1150,8 @@ ppc64_sysv_abi_push_val (struct gdbarch *gdbarch,
      doubleword are right-aligned and those larger are left-aligned.
      GCC versions before 3.4 implemented this incorrectly; see
      <http://gcc.gnu.org/gcc-3.4/powerpc-abi.html>.  */
-  if (len < tdep->wordsize)
+  if (len < tdep->wordsize
+      && gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
     offset = tdep->wordsize - len;
 
   if (argpos->regcache)