Luis Machado <luisgpm@br.ibm.com>
authorMark Kettenis <kettenis@gnu.org>
Sat, 2 Feb 2008 00:07:57 +0000 (00:07 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 2 Feb 2008 00:07:57 +0000 (00:07 +0000)
    Thiago Jung Bauermann  <bauerman@br.ibm.com>

* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Pass floats that
don't fit into registerson the stack the way GCC does.

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

index 9adc414..22dfd33 100644 (file)
@@ -1,3 +1,10 @@
+2008-02-02  Mark Kettenis  <kettenis@gnu.org>
+           Luis Machado  <luisgpm@br.ibm.com>
+           Thiago Jung Bauermann  <bauerman@br.ibm.com>        
+
+       * ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Pass floats that
+       don't fit into registerson the stack the way GCC does.
+
 2008-02-01  Joel Brobecker  <brobecker@adacore.com>
 
        * symtab.c (symbol_set_names): Do not add an entry in the demangling
index 7a87743..eea2287 100644 (file)
@@ -129,17 +129,21 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                }
              else
                {
-                 /* SysV ABI converts floats to doubles before
-                    writing them to an 8 byte aligned stack location.  */
-                 argoffset = align_up (argoffset, 8);
+                 /* The SysV ABI tells us to convert floats to
+                    doubles before writing them to an 8 byte aligned
+                    stack location.  Unfortunately GCC does not do
+                    that, and stores floats into 4 byte aligned
+                    locations without converting them to doubles.
+                    Since there is no know compiler that actually
+                    follows the ABI here, we implement the GCC
+                    convention.  */
+
+                 /* Align to 4 bytes or 8 bytes depending on the type of
+                    the argument (float or double).  */
+                 argoffset = align_up (argoffset, len);
                  if (write_pass)
-                   {
-                     char memval[8];
-                     convert_typed_floating (val, type, memval,
-                                             builtin_type_ieee_double);
                      write_memory (sp + argoffset, val, len);
-                   }
-                 argoffset += 8;
+                 argoffset += len;
                }
            }
          else if (TYPE_CODE (type) == TYPE_CODE_FLT