diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-06-28 16:48:18 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-06-28 16:48:18 -0400 |
commit | ad24823466a52926eb20b83b07fd60d39fd139c6 (patch) | |
tree | 9f6e9f06338f3237f890593e29df3477781c69b9 /gcc | |
parent | 7f5648a54c9d541c0b3180e62402f2bcb8df5cef (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/objc/sendmsg.c | 28 |
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 |