From 9edde48e00d4278aa430b25b96ee8703ebf3d880 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Mon, 18 Jul 2005 12:40:13 +0000 Subject: * i386-tdep.c (i386_reg_struct_return_p): Handle structures with a single 'long double' member correctly. (i386_return_value): Tweak comment. --- gdb/ChangeLog | 6 ++++++ gdb/i386-tdep.c | 20 +++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4f61778..b200e70 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2005-07-18 Mark Kettenis + + * i386-tdep.c (i386_reg_struct_return_p): Handle structures with a + single 'long double' member correctly. + (i386_return_value): Tweak comment. + 2005-07-16 Nick Roberts * mi/gdb-mi.el: Update for changes in Emacs 22.0.50. Bring more diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 40739a0..7c04787 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -1427,6 +1427,15 @@ i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type) && tdep->struct_return == pcc_struct_return)) return 0; + /* Structures consisting of a single `float', `double' or 'long + double' member are returned in %st(0). */ + if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1) + { + type = check_typedef (TYPE_FIELD_TYPE (type, 0)); + if (TYPE_CODE (type) == TYPE_CODE_FLT) + return (len == 4 || len == 8 || len == 12); + } + return (len == 1 || len == 2 || len == 4 || len == 8); } @@ -1469,11 +1478,12 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type, } /* This special case is for structures consisting of a single - `float' or `double' member. These structures are returned in - %st(0). For these structures, we call ourselves recursively, - changing TYPE into the type of the first member of the structure. - Since that should work for all structures that have only one - member, we don't bother to check the member's type here. */ + `float', `double' or 'long double' member. These structures are + returned in %st(0). For these structures, we call ourselves + recursively, changing TYPE into the type of the first member of + the structure. Since that should work for all structures that + have only one member, we don't bother to check the member's type + here. */ if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1) { type = check_typedef (TYPE_FIELD_TYPE (type, 0)); -- cgit v1.1