Uninstalled argframe macros
authorKresten Krab Thorup <krab@gcc.gnu.org>
Thu, 29 Apr 1993 07:06:18 +0000 (07:06 +0000)
committerKresten Krab Thorup <krab@gcc.gnu.org>
Thu, 29 Apr 1993 07:06:18 +0000 (07:06 +0000)
From-SVN: r4270

gcc/objc/Makefile.in
gcc/objc/Object.h
gcc/objc/Object.m
gcc/objc/misc.c
gcc/objc/objc.h
gcc/objc/sendmsg.c

index e4b3bbd5952fb0852d74feb8458e2b0c1d0bc717..585b8129c66bc043ad575060bbb388daf9f0b8cc 100644 (file)
@@ -60,12 +60,9 @@ 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 \
-        $(ARGFRAME_H)
+        Object.h Protocol.h mutex.h
 
 # copy objc headers to installation include directory
 copy-headers: $(OBJC_H)
@@ -77,6 +74,19 @@ 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; 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
index 53f0253e8c5d4f1e8152130f99f45fb822000ed4..6ef6e879fa4ca4de616057519a07f1e0d09f62d2 100644 (file)
@@ -52,14 +52,10 @@ 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.
@@ -123,8 +119,8 @@ typedef struct __gnuc_af_frame *af_frame;
 - perform:(SEL)aSel with:anObject1 with:anObject2;
 
         /* Forwarding */
-- forward:(SEL)aSel :(af_frame)argFrame;
-- performv:(SEL)aSel :(af_frame)argFrame;
+- forward:(SEL)aSel :(arglist_t)argFrame;
+- performv:(SEL)aSel :(arglist_t)argFrame;
 
         /* Posing */
 + poseAs:(Class*)aClassObject;
index 3a524dc7bb04c907ad4cc0230b34e9861ec78bfe..5f35bd39df975b08e4c15f8e96589e8f13279028 100644 (file)
@@ -245,12 +245,12 @@ extern int errno;
   return (*msg)(self, aSel, anObject1, anObject2);
 }
 
-- forward:(SEL)aSel :(af_frame)argFrame
+- forward:(SEL)aSel :(arglist_t)argFrame
 {
   return [self doesNotRecognize: aSel];
 }
 
-- performv:(SEL)aSel :(af_frame)argFrame
+- performv:(SEL)aSel :(arglist_t)argFrame
 {
   return objc_msg_sendv(self, aSel, method_get_argsize(0), argFrame);
 }
index 915e29dd28bae1ebf2e0511e607749955e1ee1c2..b9b64ac273c4f6608abaac4f976840c3e52ad8ba 100644 (file)
@@ -26,6 +26,8 @@ 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; */
index 569693781cce7711545563627bc22de842f4cdc5..d5eace390cb160e9d6d8972feca86b9bb74f97e3 100644 (file)
@@ -440,12 +440,36 @@ IMP objc_msg_lookup_super(Super_t super, SEL sel);
 typedef void* retval_t;                /* return value */
 typedef void(*apply_t)(void);  /* function pointer */
 
-#ifndef __AF_FRAME
-typedef struct __gnuc_af_frame *af_frame;
-#define __AF_FRAME
+#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;
+
 #endif
+#endif /* not __object_INCLUDE_GNU */
 
-retval_t objc_msg_sendv(id, SEL, size_t, af_frame);
+retval_t objc_msg_sendv(id, SEL, size_t, arglist_t);
 
 #ifdef __OBJC__
 
index 1c5c6631829afc20d4f1f4b9fdb823af42b58e81..b8ffed626d57354c59604ea0a5a2eadb9437bbf8 100644 (file)
@@ -25,7 +25,6 @@ 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";
@@ -111,13 +110,11 @@ objc_msg_lookup_super (Super_t super, SEL sel)
 }
 
 retval_t
-objc_msg_sendv(id object, SEL op, size_t frame_size, af_frame arg_frame)
+objc_msg_sendv(id object, SEL op, size_t frame_size, arglist_t arg_frame)
 {
-#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);
+#ifdef __objc_frame_receiver
+  __objc_frame_receiver(arg_frame) = object;
+  __objc_frame_selector(arg_frame) = op;
   return __builtin_apply((apply_t)get_imp(object->class_pointer, op),
                         arg_frame,
                         frame_size);