ChangeLog:
authorUlrich Weigand <uweigand@de.ibm.com>
Tue, 8 Feb 2011 13:25:01 +0000 (13:25 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Tue, 8 Feb 2011 13:25:01 +0000 (13:25 +0000)
* ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Implement
correct ABI for AltiVec vector arguments.

testsuite/ChangeLog:

* gdb.arch/altivec-abi.c (vec_func): Make use of intv_on_stack_f
when computing result.
* gdb.arch/altivec-abi.exp: Update expected results.

gdb/ChangeLog
gdb/ppc-sysv-tdep.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/altivec-abi.c
gdb/testsuite/gdb.arch/altivec-abi.exp

index 641f22563d9fe540bb446f7983ced364c947e624..0197e8bce1dcc2115da1c437e1e015dddc0817e4 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-08  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Implement
+       correct ABI for AltiVec vector arguments.
+
 2011-02-07  Pedro Alves  <pedro@codesourcery.com>
 
        * valprint.c (val_print): Extend comment.
index 1200b61cd20533c08173c9649c509b98270d6278..300dcac6f1f685e665ce39e1c50c38109b0a2d9c 100644 (file)
@@ -902,9 +902,6 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
   ULONGEST back_chain;
   /* See for-loop comment below.  */
   int write_pass;
-  /* Size of the Altivec's vector parameter region, the final value is
-     computed in the for-loop below.  */
-  LONGEST vparam_size = 0;
   /* Size of the general parameter region, the final value is computed
      in the for-loop below.  */
   LONGEST gparam_size = 0;
@@ -948,28 +945,21 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
       /* Next available vector register for vector arguments.  */
       int vreg = 2;
       /* The address, at which the next general purpose parameter
-         (integer, struct, float, ...) should be saved.  */
+         (integer, struct, float, vector, ...) should be saved.  */
       CORE_ADDR gparam;
-      /* Address, at which the next Altivec vector parameter should be
-         saved.  */
-      CORE_ADDR vparam;
 
       if (!write_pass)
        {
-         /* During the first pass, GPARAM and VPARAM are more like
-            offsets (start address zero) than addresses.  That way
-            they accumulate the total stack space each region
-            requires.  */
+         /* During the first pass, GPARAM is more like an offset
+            (start address zero) than an address.  That way it
+            accumulates the total stack space required.  */
          gparam = 0;
-         vparam = 0;
        }
       else
        {
-         /* Decrement the stack pointer making space for the Altivec
-            and general on-stack parameters.  Set vparam and gparam
-            to their corresponding regions.  */
-         vparam = align_down (sp - vparam_size, 16);
-         gparam = align_down (vparam - gparam_size, 16);
+         /* Decrement the stack pointer making space for the on-stack
+            stack parameters.  Set gparam to that region.  */
+         gparam = align_down (sp - gparam_size, 16);
          /* Add in space for the TOC, link editor double word,
             compiler double word, LR save area, CR save area.  */
          sp = align_down (gparam - 48, 16);
@@ -1147,24 +1137,25 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
                   && TYPE_CODE (type) == TYPE_CODE_ARRAY
                   && tdep->ppc_vr0_regnum >= 0)
            {
-             /* In the Altivec ABI, vectors go in the vector
-                registers v2 .. v13, or when that runs out, a vector
-                annex which goes above all the normal parameters.
-                NOTE: cagney/2003-09-21: This is a guess based on the
-                PowerOpen Altivec ABI.  */
-             if (vreg <= 13)
+             /* In the Altivec ABI, vectors go in the vector registers
+                v2 .. v13, as well as the parameter area -- always at
+                16-byte aligned addresses.  */
+
+             gparam = align_up (gparam, 16);
+             greg += greg & 1;
+
+             if (write_pass)
                {
-                 if (write_pass)
+                 if (vreg <= 13)
                    regcache_cooked_write (regcache,
                                           tdep->ppc_vr0_regnum + vreg, val);
-                 vreg++;
-               }
-             else
-               {
-                 if (write_pass)
-                   write_memory (vparam, val, TYPE_LENGTH (type));
-                 vparam = align_up (vparam + TYPE_LENGTH (type), 16);
+
+                 write_memory (gparam, val, TYPE_LENGTH (type));
                }
+
+             greg += 2;
+             vreg++;
+             gparam += 16;
            }
          else if ((TYPE_CODE (type) == TYPE_CODE_INT
                    || TYPE_CODE (type) == TYPE_CODE_ENUM
@@ -1307,9 +1298,8 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
 
       if (!write_pass)
        {
-         /* Save the true region sizes ready for the second pass.  */
-         vparam_size = vparam;
-         /* Make certain that the general parameter save area is at
+         /* Save the true region sizes ready for the second pass.
+            Make certain that the general parameter save area is at
             least the minimum 8 registers (or doublewords) in size.  */
          if (greg < 8)
            gparam_size = 8 * tdep->wordsize;
index 6314f508ba485e6ea27f7647a54a31b27c8d9f97..3cb8d41f5ef543018b036f341d7091bca21b8484 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-08  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * gdb.arch/altivec-abi.c (vec_func): Make use of intv_on_stack_f
+       when computing result.
+       * gdb.arch/altivec-abi.exp: Update expected results.
+
 2011-02-07  Thiago Jung Bauermann  <bauerman@br.ibm.com>
 
        * gdb.base/break-interp.exp: Remove ${objdir} from test messages.
index f68ec25564287860e1c110a53fdabe86d6b2a827..61931a04ce56660e920b7d1f850444ac8d27ad20 100644 (file)
@@ -71,7 +71,7 @@ vec_func (vector short vshort_f,             /* goes in v2 */
    vector unsigned char vuchar_res;
 
    vint_res  = vec_add (vint_f, intv_on_stack_f);
-   vint_res  = vec_add (vint_f, y_f);
+   vint_res  = vec_add (vint_res, y_f);
    vuint_res  = vec_add (vuint_f, ((vector unsigned int) {5,6,7,8}));
    vshort_res  = vec_add (vshort_f, x_f);
    vushort_res  = vec_add (vushort_f,
index 061e4770ffd349c14b58a806df87ffd8070b9580..480af73e7ff3a93a95633c34acc197c3a38ce136 100644 (file)
@@ -91,7 +91,8 @@ proc altivec_abi_tests { extra_flags force_abi } {
     # the last one will go on the stack.
     set msg "call inferior function with vectors (1)"
     gdb_test "p vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack)" \
-       ".\[0-9\]+ = .2, 2, 2, 2." "call inferior function with vectors (1)"
+       ".\[0-9\]+ = .14, 36, 58, 80." "call inferior function with vectors (1)"
+
 
     # Let's call the function again with dummy arguments.  This is to clean
     # up the contents of the vector registers before the next call.
@@ -114,7 +115,7 @@ proc altivec_abi_tests { extra_flags force_abi } {
        "step into vec_fun"
 
     set pattern2 $pattern
-    append pattern2 " at.*altivec-abi.c.*main.*result = vec_func .vshort,.*goes in v2.*Value returned is.*= .2, 2, 2, 2."
+    append pattern2 " at.*altivec-abi.c.*main.*result = vec_func .vshort,.*goes in v2.*Value returned is.*= .14, 36, 58, 80."
 
     # Let's see if the result is returned correctly.
     gdb_test "finish" "Run till exit from .0.*$pattern2" \