From f964a7562a92762d94cc8c1f6177db2989dcac15 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sat, 2 Feb 2008 00:07:57 +0000 Subject: [PATCH] Luis Machado Thiago Jung Bauermann * 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 | 7 +++++++ gdb/ppc-sysv-tdep.c | 22 +++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9adc41410ec..22dfd332cb1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2008-02-02 Mark Kettenis + Luis Machado + Thiago Jung Bauermann + + * 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 * symtab.c (symbol_set_names): Do not add an entry in the demangling diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 7a877434165..eea2287219c 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -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 -- 2.30.2