aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKresten Krab Thorup <krab@gcc.gnu.org>1993-04-27 20:36:53 +0000
committerKresten Krab Thorup <krab@gcc.gnu.org>1993-04-27 20:36:53 +0000
commitd5247e3ea2d8aac62cd61c80c4a68f1efb19e675 (patch)
tree1e50bdfb275719021c180e530315e1fb057eca48
parentc3b80729bb95b2137da7039f489c6de1092ed4ef (diff)
downloadgcc-d5247e3ea2d8aac62cd61c80c4a68f1efb19e675.zip
gcc-d5247e3ea2d8aac62cd61c80c4a68f1efb19e675.tar.gz
gcc-d5247e3ea2d8aac62cd61c80c4a68f1efb19e675.tar.bz2
Changed to use argframe macros
From-SVN: r4253
-rw-r--r--gcc/objc/Makefile.in18
-rw-r--r--gcc/objc/Object.h10
-rw-r--r--gcc/objc/Object.m4
-rw-r--r--gcc/objc/misc.c2
-rw-r--r--gcc/objc/objc.h32
-rw-r--r--gcc/objc/runtime.h2
-rw-r--r--gcc/objc/sendmsg.c11
7 files changed, 26 insertions, 53 deletions
diff --git a/gcc/objc/Makefile.in b/gcc/objc/Makefile.in
index 6b22c68..e4b3bbd 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 6ef6e87..53f0253 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 5f35bd3..3a524dc 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 b9b64ac..915e29d 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 d5eace3..5696937 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 ef6e572..b0a1e16 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 b8ffed6..1c5c663 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);