diff options
author | Mark Kettenis <kettenis@gnu.org> | 2008-02-02 00:07:57 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2008-02-02 00:07:57 +0000 |
commit | d333e2740afc5ff6f8605ea412c16cb6e9af6793 (patch) | |
tree | e049f04441a050ba27316c758df53f9855f64278 /gdb | |
parent | 506240b5b237d9af0f0a597e6ceeb6ba1ed11868 (diff) | |
download | gdb-d333e2740afc5ff6f8605ea412c16cb6e9af6793.tar.gz |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | 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 <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 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 |