aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-06-28 16:48:18 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-06-28 16:48:18 -0400
commitad24823466a52926eb20b83b07fd60d39fd139c6 (patch)
tree9f6e9f06338f3237f890593e29df3477781c69b9
parent7f5648a54c9d541c0b3180e62402f2bcb8df5cef (diff)
downloadgcc-ad24823466a52926eb20b83b07fd60d39fd139c6.zip
gcc-ad24823466a52926eb20b83b07fd60d39fd139c6.tar.gz
gcc-ad24823466a52926eb20b83b07fd60d39fd139c6.tar.bz2
(__objc_block_forward): New function.
(get_imp, objc_msg_lookup): Use different forwarding function when the returning a floating point value. From-SVN: r12371
-rw-r--r--gcc/objc/sendmsg.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/objc/sendmsg.c b/gcc/objc/sendmsg.c
index d3ef66c..97b49fe 100644
--- a/gcc/objc/sendmsg.c
+++ b/gcc/objc/sendmsg.c
@@ -49,6 +49,14 @@ static void __objc_install_dispatch_table_for_class (Class);
/* Forward declare some functions */
static void __objc_init_install_dtable(id, SEL);
+
+/* Various forwarding functions that are used based upon the
+ return type for the selector.
+ __objc_block_forward for structures.
+ __objc_double_forward for floats/doubles.
+ __objc_word_forward for pointers or types that fit in registers.
+ */
+static double __objc_double_forward(id, SEL, ...);
static id __objc_word_forward(id, SEL, ...);
typedef struct { id many[8]; } __big;
#if INVISIBLE_STRUCT_RETURN
@@ -80,6 +88,8 @@ get_imp (Class class, SEL sel)
const char *t = sel->sel_types;
if (t && (*t == '[' || *t == '(' || *t == '{'))
res = (IMP)__objc_block_forward;
+ else if (t && (*t == 'f' || *t == 'd'))
+ res = (IMP)__objc_double_forward;
else
res = (IMP)__objc_word_forward;
}
@@ -116,6 +126,8 @@ objc_msg_lookup(id receiver, SEL op)
const char *t = op->sel_types;
if (t && (*t == '[' || *t == '(' || *t == '{'))
result = (IMP)__objc_block_forward;
+ else if (t && (*t == 'f' || *t == 'd'))
+ result = (IMP)__objc_double_forward;
else
result = (IMP)__objc_word_forward;
}
@@ -458,6 +470,7 @@ search_for_method_in_list (MethodList_t list, SEL op)
static retval_t __objc_forward (id object, SEL sel, arglist_t args);
+/* Forwarding pointers/integers through the normal registers */
static id
__objc_word_forward (id rcv, SEL op, ...)
{
@@ -471,6 +484,21 @@ __objc_word_forward (id rcv, SEL op, ...)
return res;
}
+/* Specific routine for forwarding floats/double because of
+ architectural differences on some processors. i386s for
+ example which uses a floating point stack versus general
+ registers for floating point numbers. This forward routine
+ makes sure that GCC restores the proper return values. */
+static double
+__objc_double_forward (id rcv, SEL op, ...)
+{
+ void *args, *res;
+
+ args = __builtin_apply_args ();
+ res = __objc_forward (rcv, op, args);
+ __builtin_return (res);
+}
+
#if INVISIBLE_STRUCT_RETURN
static __big
#else