summaryrefslogtreecommitdiff
path: root/libobjc/sendmsg.c
diff options
context:
space:
mode:
authorovidiu <ovidiu@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-03 08:49:02 +0000
committerovidiu <ovidiu@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-03 08:49:02 +0000
commite4ea0e73284e7707a43c8fa0630f5bf26a0abde3 (patch)
treec45444560a6907e888e13030f86e427dd5b063c4 /libobjc/sendmsg.c
parent184d4f7221c704eb66c297b17145130c60a3b076 (diff)
downloadgcc-e4ea0e73284e7707a43c8fa0630f5bf26a0abde3.tar.gz
Added __objc_msg_forward, a hook that allows external libraries to
provide a function that returns the real forwarding function. This can alleviate problems __builtin_apply() and friends have on various platforms. (Solution suggested by Helge Hess.) Define gen_rtx_REG. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38650 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libobjc/sendmsg.c')
-rw-r--r--libobjc/sendmsg.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/libobjc/sendmsg.c b/libobjc/sendmsg.c
index 62c8f2850e3..b743829e8f5 100644
--- a/libobjc/sendmsg.c
+++ b/libobjc/sendmsg.c
@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */
/* this is how we hack STRUCT_VALUE to be 1 or 0 */
#define gen_rtx(args...) 1
#define gen_rtx_MEM(args...) 1
+#define gen_rtx_REG(args...) 1
#define rtx int
#if !defined(STRUCT_VALUE) || STRUCT_VALUE == 0
@@ -44,6 +45,11 @@ Boston, MA 02111-1307, USA. */
/* The uninstalled dispatch table */
struct sarray* __objc_uninstalled_dtable = 0; /* !T:MUTEX */
+/* Hook for method forwarding. If it is set, is invoked to return a
+ function that performs the real forwarding. Otherwise the libgcc
+ based functions (__builtin_apply and friends) are used. */
+IMP (*__objc_msg_forward)(SEL) = NULL;
+
/* Send +initialize to class */
static void __objc_send_initialize(Class);
@@ -76,18 +82,27 @@ __inline__
IMP
__objc_get_forward_imp (SEL sel)
{
- const char *t = sel->sel_types;
+ if (__objc_msg_forward)
+ {
+ IMP result;
+ if ((result = __objc_msg_forward (sel)))
+ return result;
+ }
+ else
+ {
+ const char *t = sel->sel_types;
- if (t && (*t == '[' || *t == '(' || *t == '{')
+ if (t && (*t == '[' || *t == '(' || *t == '{')
#ifdef OBJC_MAX_STRUCT_BY_VALUE
- && objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE
+ && objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE
#endif
- )
- return (IMP)__objc_block_forward;
- else if (t && (*t == 'f' || *t == 'd'))
- return (IMP)__objc_double_forward;
- else
- return (IMP)__objc_word_forward;
+ )
+ return (IMP)__objc_block_forward;
+ else if (t && (*t == 'f' || *t == 'd'))
+ return (IMP)__objc_double_forward;
+ else
+ return (IMP)__objc_word_forward;
+ }
}
/* Given a class and selector, return the selector's implementation. */