From: Kresten Krab Thorup Date: Tue, 27 Apr 1993 20:36:53 +0000 (+0000) Subject: Changed to use argframe macros X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d5247e3ea2d8aac62cd61c80c4a68f1efb19e675;p=gcc.git Changed to use argframe macros From-SVN: r4253 --- diff --git a/gcc/objc/Makefile.in b/gcc/objc/Makefile.in index 6b22c6862b8..e4b3bbd5952 100644 --- a/gcc/objc/Makefile.in +++ b/gcc/objc/Makefile.in @@ -60,9 +60,12 @@ libobjc.a: $(OBJC_O) $(AR) rc libobjc.a $(OBJC_O) # ranlib is run in the parent directory's makefile. +ARGFRAME_H = argframe.h af-sparc.h + OBJC_H = hash.h list.h sarray.h objc.h \ objc-api.h cache.h \ - Object.h Protocol.h mutex.h + Object.h Protocol.h mutex.h \ + $(ARGFRAME_H) # copy objc headers to installation include directory copy-headers: $(OBJC_H) @@ -74,19 +77,6 @@ copy-headers: $(OBJC_H) chmod a+r $(incinstalldir)/objc; \ done -sendmsg.o: sendmsg.c fflags - $(GCC_FOR_TARGET) `cat fflags` -c $(GCC_CFLAGS) $(SUBDIR_INCLUDES) $(srcdir)/objc/sendmsg.c - -## Next to are for heuristics on forwarding mechanism... -_forward: _forward.c - -$(GCC_FOR_TARGET) -c $(GCC_CFLAGS) $(SUBDIR_INCLUDES) $(srcdir)/objc/_forward.c - -$(GCC_FOR_TARGET) ./_forward.o -o _forward - if [ ! -f ./_forward ]; then touch ./_forward; else true; fi - -fflags: _forward - -rm -f fflags - -if [ -s ./_forward ]; then ./_forward > fflags; else touch fflags; fi - mostlyclean: -rm -f *.o libobjc.a _forward fflags clean: mostlyclean diff --git a/gcc/objc/Object.h b/gcc/objc/Object.h index 6ef6e879fa4..53f0253e8c5 100644 --- a/gcc/objc/Object.h +++ b/gcc/objc/Object.h @@ -52,10 +52,14 @@ typedef char *STR; /* String alias */ @class Protocol; typedef struct objc_typed_stream TypedStream; -typedef void* arglist_t; #endif /* not __objc_INCLUDE_GNU */ +#ifndef __AF_FRAME +typedef struct __gnuc_af_frame *af_frame; +#define __AF_FRAME +#endif + /* * All classes are derived from Object. As such, * this is the overhead tacked onto those objects. @@ -119,8 +123,8 @@ typedef void* arglist_t; - perform:(SEL)aSel with:anObject1 with:anObject2; /* Forwarding */ -- forward:(SEL)aSel :(arglist_t)argFrame; -- performv:(SEL)aSel :(arglist_t)argFrame; +- forward:(SEL)aSel :(af_frame)argFrame; +- performv:(SEL)aSel :(af_frame)argFrame; /* Posing */ + poseAs:(Class*)aClassObject; diff --git a/gcc/objc/Object.m b/gcc/objc/Object.m index 5f35bd39df9..3a524dc7bb0 100644 --- a/gcc/objc/Object.m +++ b/gcc/objc/Object.m @@ -245,12 +245,12 @@ extern int errno; return (*msg)(self, aSel, anObject1, anObject2); } -- forward:(SEL)aSel :(arglist_t)argFrame +- forward:(SEL)aSel :(af_frame)argFrame { return [self doesNotRecognize: aSel]; } -- performv:(SEL)aSel :(arglist_t)argFrame +- performv:(SEL)aSel :(af_frame)argFrame { return objc_msg_sendv(self, aSel, method_get_argsize(0), argFrame); } diff --git a/gcc/objc/misc.c b/gcc/objc/misc.c index b9b64ac273c..915e29dd28b 100644 --- a/gcc/objc/misc.c +++ b/gcc/objc/misc.c @@ -26,8 +26,6 @@ You should have received a copy of the GNU General Public License along with #include "runtime.h" -void objc_error(id object, const char* fmt, va_list); - void (*_objc_error)(id, const char*, va_list) = objc_error; /* id (*_objc_object_alloc)(Class*) = 0; */ /* id (*_objc_object_dispose)(id) = 0; */ diff --git a/gcc/objc/objc.h b/gcc/objc/objc.h index d5eace390cb..569693781cc 100644 --- a/gcc/objc/objc.h +++ b/gcc/objc/objc.h @@ -440,36 +440,12 @@ IMP objc_msg_lookup_super(Super_t super, SEL sel); typedef void* retval_t; /* return value */ typedef void(*apply_t)(void); /* function pointer */ -#ifndef __object_INCLUDE_GNU - -#if defined(REG_ARGS) || defined(STACK_ARGS) - -typedef struct { - char* arg_pointer; -#ifdef STRUCT_RETURN - void* struct_return; -#endif -#ifdef REG_ARGS - void* regs[2]; -#endif -} *arglist_t; - -#ifdef REG_ARGS -#define __objc_frame_receiver(FRAME) (FRAME)->regs[0] -#define __objc_frame_selector(FRAME) ((SEL)(FRAME)->regs[1]) - -#else -#define __objc_frame_receiver(FRAME) ((id*)(FRAME)->arg_pointer)[0] -#define __objc_frame_selector(FRAME) ((SEL*)(FRAME)->arg_pointer)[1] -#endif -#else - -typedef void* arglist_t; - +#ifndef __AF_FRAME +typedef struct __gnuc_af_frame *af_frame; +#define __AF_FRAME #endif -#endif /* not __object_INCLUDE_GNU */ -retval_t objc_msg_sendv(id, SEL, size_t, arglist_t); +retval_t objc_msg_sendv(id, SEL, size_t, af_frame); #ifdef __OBJC__ diff --git a/gcc/objc/runtime.h b/gcc/objc/runtime.h index ef6e572048d..b0a1e163a24 100644 --- a/gcc/objc/runtime.h +++ b/gcc/objc/runtime.h @@ -51,6 +51,8 @@ extern void __objc_register_selectors_from_class(Class*); /* (objc-sel.c) */ extern void __objc_update_dispatch_table_for_class (Class*);/* (objc-msg.c) */ extern void class_add_method_list(Class*, MethodList_t); +void objc_error(id object, const char* fmt, va_list); + /* True when class links has been resolved */ extern BOOL __objc_class_links_resolved; diff --git a/gcc/objc/sendmsg.c b/gcc/objc/sendmsg.c index b8ffed626d5..1c5c6631829 100644 --- a/gcc/objc/sendmsg.c +++ b/gcc/objc/sendmsg.c @@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License along with covered by the GNU General Public License. */ #include "runtime.h" +#include "argframe.h" #ifdef OBJC_SPARSE_LOOKUP const char* __objc_sparse_lookup_id = "Method lookup uses sparse arrays"; @@ -110,11 +111,13 @@ objc_msg_lookup_super (Super_t super, SEL sel) } retval_t -objc_msg_sendv(id object, SEL op, size_t frame_size, arglist_t arg_frame) +objc_msg_sendv(id object, SEL op, size_t frame_size, af_frame arg_frame) { -#ifdef __objc_frame_receiver - __objc_frame_receiver(arg_frame) = object; - __objc_frame_selector(arg_frame) = op; +#ifndef __ARGFRAME_DOES_NOT_WORK + af_cum cum; + af_start (cum, arg_frame); + af_put (arg_frame, cum, id, object); + af_put (arg_frame, cum, SEL, op); return __builtin_apply((apply_t)get_imp(object->class_pointer, op), arg_frame, frame_size);