This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[libobjc] Rewrite message forwarding to use libffi


libobjc has for some time had FIXME:s about not using __builtin_apply et al and not including tm.h. This patch removes some of these FIXME:s by rewriting the message forwarding code in libobjc to use libffi instead.

Essentially. the forwarding code from sendmsg.c is removed, except for the handling of the forwarding hook. The forwarding hook is set to __objc_default_forward by default, which is implemented in a new file forwarding.c along with helper functions, objc_msg_sendv, and three forwarding related methods from encoding.c.

Some specific questions about this part:

What year should I put in the copyright header for forwarding.c? The file is new, but parts of the contents are based on functions in other (older) files in libobjc.

What ffi type should I map long long ints to? ffi has macros for all other basic int types, but not for long long ints. Currently, I assume that long long ints are always 64 bits and map to ffi_type_[su]int64.


After all this, libobjc no longer uses __builtin_apply, __builtin_apply_args, or __builtin_return. sendmsg.c no longer includes tm.h or coretypes.h (but they are still included from encoding.c and thr-objc.c; as far as I can tell, this patch doesn't let us remove those includes).


The patch also includes makefile/configure changes by Andrew Pinski that let libobjc use libffi. It also depends on and includes his ltcf-* patch.

I've tested this on i686-pc-linux-gnu with a plain 'make' and 'make check-objc'. Bootstrap with java would be needed for the makefile/configure parts, but fails here on a clean tree. Hopefully, Andrew Pinski can test that. Anyway, there are no new failures in the objc testsuite because it doesn't test forwarding at all.

The attached forwarding.tar.gz includes a bunch of new tests, intended to be placed in gcc/testsuite/objc.dg/forwarding/, that I used to test this. (They probably need to cleaned up a bit. a2_array-1.m and a_array-1.m started failing when I updated from a 20040902 snapshot, haven't looked at why yet. Some of them should be XFAIL:ed.)

I have attached results for the new tests for gcc 2.95, clean tree, and patched tree. Some tests (e.g. r_struct-1.m) PASS with 2.95, FAIL with a clean tree, and PASS with the patch, so this could qualify as a regression fix.

Unfortunately, the patch also causes four new failures compared to a clean tree. a_long_double-1.m fails because the objc frontend encodes 'long double' the same as 'double'. This could be fixed easily by giving 'long double' its own encoding. a_struct-3.m fails because it has a struct with an array. a-struct-4.m fails because it has a struct with a bitfield. a-union-1.m fails because it has a union. libffi doesn't support arrays, bitfields, or unions, so there's no clean way I can solve this. I could add some hacks to get it to work on ix86, though (presumably, __builtin_apply got lucky in these cases; I've seen them fail on ix86 with other versions of libobjc with the __builtin_apply-based code).

I don't know how this will affect other platforms. I'd expect the ffi-based forwarding to work just as well on all platforms supported by libffi, but I don't know what to expect from __builtin_apply on other platforms, or if there are platforms unsupported by libffi where __builtin_apply works well. However, from what I understand, __builtin_apply is pretty evil. :)

Mark: Andrew told me to tell you that this is a regression, that rewriting libobjc to use libffi is the easiest way of fixing it, and that he's approved the libobjc parts.

OK for mainline?

- Alexander Malmberg

toplevel ChangeLog:
2004-12-12  Andrew Pinski  <pinskia@physics.uc.edu>
	* configure.in (libgcj): Remove target-libffi.
	(target_libraries): But add it here.
	Every target where $(libgcj) was disable also disable
	target-libffi and target-libobjc except for i?86-*-mingw32*.
	* configure: Regenerate.
	* Makefile.def (all-target-libobjc): Depend on
	all-target-libffi.
	* Makefile.in: Regenerate.

libobjc/ChangeLog:
2004-12-12  Alexander Malmberg  <alexander@malmberg.org>
	    Andrew Pinski  <pinskia@physics.uc.edu>

	* Makefile.in (LIBFFI): Define.
	(LIBFFIINCS): Define.
	(ALL_CFLAGS): Add LIBFFIINCS.
	(libobjc$(libext).la): Add $(LIBFFI) to the link line.
	(libobjc_gc$(libext).la): Likewise.
	* configure.ac (--with-libffi): New option. Have LIBFFI and
	LIBFFIINCS be substituted.
	* configure: Regenerate.
	* forwarding.c: New file.
	* encoding.c (method_get_next_argument)
	(method_get_first_argument, method_get_nth_argument): Move to
	forwarding.c.
	* init.c (__objc_exec_class): Call __objc_init_forwarding when
	initializing the runtime.
	* sendmsg.c: Don't include tm.h or coretypes.h.
	(gen_rtx, gen_rtx_MEM, gen_rtx_REG, rtx)
	(INVISIBLE_STRUCT_RETURN, __objc_double_forward)
	(__objc_word_forward, __big, __objc_block_forward)
	(__objc_forward): Remove.
	(__objc_default_forward): Declare.
	(__objc_msg_forward) Initialize to __objc_default_forward.
	(__objc_get_forward_imp): Remove old forwarding code. If the
	forwarding callback isn't set, call objc_error.
	(method_get_sizeof_arguments): Remove declaration.
	(objc_msg_sendv): Move to forwarding.c.
	* objc/objc-api.h: Define OBJC_ERR_FORWARDING.
	Update comment about __objc_msg_forward.
	* objc/objc.h (union arglist): Change to an opaque struct.
	* objc/runtime.h (__objc_init_forwarding): Declare.
? gcc/testsuite/objc.dg/forwarding
Index: Makefile.def
===================================================================
RCS file: /cvsroot/gcc/gcc/Makefile.def,v
retrieving revision 1.42
diff -u -r1.42 Makefile.def
--- Makefile.def	8 Dec 2004 20:25:58 -0000	1.42
+++ Makefile.def	12 Dec 2004 00:09:42 -0000
@@ -436,6 +436,7 @@
 dependencies = { module=all-target-libjava; on=all-target-qthreads; };
 dependencies = { module=all-target-libjava; on=all-target-libffi; };
 dependencies = { module=all-target-libobjc; on=all-target-libiberty; };
+dependencies = { module=all-target-libobjc; on=all-target-libffi; };
 dependencies = { module=all-target-libstdc++-v3; on=all-target-libiberty; };
 
 // Target modules in the 'src' repository.
Index: Makefile.in
===================================================================
RCS file: /cvsroot/gcc/gcc/Makefile.in,v
retrieving revision 1.250
diff -u -r1.250 Makefile.in
--- Makefile.in	8 Dec 2004 20:25:58 -0000	1.250
+++ Makefile.in	12 Dec 2004 00:09:43 -0000
@@ -35501,6 +35501,7 @@
 all-target-libjava: maybe-all-target-qthreads
 all-target-libjava: maybe-all-target-libffi
 all-target-libobjc: maybe-all-target-libiberty
+all-target-libobjc: maybe-all-target-libffi
 all-target-libstdc++-v3: maybe-all-target-libiberty
 all-target-libgloss: maybe-configure-target-newlib
 all-target-winsup: maybe-all-target-libiberty
Index: configure
===================================================================
RCS file: /cvsroot/gcc/gcc/configure,v
retrieving revision 1.200
diff -u -r1.200 configure
--- configure	3 Dec 2004 10:44:36 -0000	1.200
+++ configure	12 Dec 2004 00:09:44 -0000
@@ -917,11 +917,11 @@
 host_tools="texinfo byacc flex bison binutils gas ld fixincludes gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar"
 
 # libgcj represents the runtime libraries only used by gcj.
-libgcj="target-libffi \
-	target-boehm-gc \
+libgcj="target-boehm-gc \
 	target-zlib \
 	target-qthreads \
 	target-libjava"
+	 
 
 # these libraries are built for the target environment, and are built after
 # the host libraries and the host tools (which may be a cross compiler)
@@ -931,9 +931,10 @@
 		target-newlib \
 		target-libstdc++-v3 \
 		target-libmudflap \
+		target-libobjc \
 		target-libgfortran \
 		${libgcj} \
-		target-libobjc \
+		target-libffi \
 		target-libada"
 
 # these tools are built using the target libraries, and are intended to
@@ -1074,7 +1075,7 @@
     noconfigdirs="$noconfigdirs tcl expect dejagnu make texinfo bison patch flex byacc send-pr gprof uudecode dejagnu diff guile perl itcl gnuserv gettext"
     ;;
   i[3456789]86-*-go32* | i[3456789]86-*-msdosdjgpp*)
-    noconfigdirs="$noconfigdirs tcl tk expect dejagnu send-pr uudecode guile itcl gnuserv libffi"
+    noconfigdirs="$noconfigdirs tcl tk expect dejagnu send-pr uudecode guile itcl gnuserv target-libffi target-libobjc"
     ;;
   i[3456789]86-*-mingw32*)
     # noconfigdirs="tcl tk expect dejagnu make texinfo bison patch flex byacc send-pr uudecode dejagnu diff guile perl itcl gnuserv"
@@ -1155,17 +1156,17 @@
 
 case "${target}" in
   *-*-chorusos)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
     ;;
   *-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-freebsd[12] | *-*-freebsd[12].* | *-*-freebsd*aout*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-freebsd*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
@@ -1179,14 +1180,14 @@
       i*86-*-*) ;;
       alpha*-*-*) ;;
       *)
-	noconfigdirs="$noconfigdirs ${libgcj}"
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
 	;;
     esac
     ;;
   *-*-kaos*)
     # Remove unsupported stuff on all kaOS configurations.
-    skipdirs="target-libiberty ${libgcj} target-libstdc++-v3 target-librx"
-    skipdirs="$skipdirs target-libobjc target-examples target-groff target-gperf"
+    skipdirs="target-libiberty ${libgcj} target-libffi target-libobjc target-libstdc++-v3 target-librx"
+    skipdirs="$skipdirs target-examples target-groff target-gperf"
     skipdirs="$skipdirs zlib fastjar target-libjava target-boehm-gc target-zlib"
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
@@ -1199,21 +1200,21 @@
       i*86-*-netbsdelf*) ;;
       arm*-*-netbsdelf*) ;;
       *)
-	noconfigdirs="$noconfigdirs ${libgcj}"
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
 	;;
     esac
     ;;
   *-*-netware*)
-    noconfigdirs="$noconfigdirs target-newlib target-libiberty target-libgloss ${libgcj} target-libmudflap"
+    noconfigdirs="$noconfigdirs target-newlib target-libiberty target-libgloss ${libgcj} target-libffi target-libobjc target-libmudflap"
     ;;
   *-*-rtems*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-uclinux*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-vxworks*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj} target-libffi target-libobjc"
     ;;
   alpha*-dec-osf*)
     # ld works, but does not support shared libraries.
@@ -1222,7 +1223,7 @@
     noconfigdirs="$noconfigdirs gas ld fileutils target-newlib target-libgloss"
     ;;
   alpha*-*-*vms*)
-    noconfigdirs="$noconfigdirs gdb ld target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb ld target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   alpha*-*-linux*)
     # newlib is not 64 bit ready
@@ -1230,16 +1231,16 @@
     ;;
   alpha*-*-*)
     # newlib is not 64 bit ready
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   am33_2.0-*-linux*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;
   sh-*-linux*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;    
   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     noconfigdirs="$noconfigdirs target-examples"
     noconfigdirs="$noconfigdirs target-libiberty texinfo send-pr"
     noconfigdirs="$noconfigdirs tcl tk itcl libgui sim"
@@ -1254,66 +1255,66 @@
     esac
     ;;
   arc-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   arm-semi-aof )
     ;;
   arm-*-coff | strongarm-*-coff | xscale-*-coff)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
-    noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+    noconfigdirs="$noconfigdirs target-libffi target-libobjc target-qthreads"
     ;;
   arm*-*-symbianelf*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-libiberty"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-libiberty"
     ;;
   arm-*-pe*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-coff)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-elf)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-pe)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   arm-*-riscix*)
-    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   avr-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   c4x-*-* | tic4x-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   c54x*-*-* | tic54x-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} gcc gdb newlib"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc gcc gdb newlib"
     ;;
   cris-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;
   crx-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj} target-libffi target-libobjc"
     ;;
   d10v-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   d30v-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   fr30-*-elf*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   frv-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   h8300*-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   h8500-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   hppa1.1-*-osf* | hppa1.1-*-bsd* )
     ;;
@@ -1329,15 +1330,15 @@
   hppa*-*-lites* | \
   hppa*-*-openbsd* | \
   hppa*64*-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   hppa*-*-*)
     # According to Alexandre Oliva <aoliva@redhat.com>, libjava won't
     # build on HP-UX 10.20.
-    noconfigdirs="$noconfigdirs ld shellutils ${libgcj}"
+    noconfigdirs="$noconfigdirs ld shellutils ${libgcj} target-libffi target-libobjc"
     ;;
   i960-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   ia64*-*-elf*)
     # No gdb support yet.
@@ -1345,19 +1346,19 @@
     ;;
   ia64*-**-hpux*)
     # No gdb or ld support yet.
-    noconfigdirs="$noconfigdirs ${libgcj} readline mmalloc libgui itcl gdb ld"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc readline mmalloc libgui itcl gdb ld"
     ;;
   i370-*-opened*)
     ;;
   i[3456789]86-*-coff | i[3456789]86-*-elf)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   i[3456789]86-*-linux*)
     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
     # not build java stuff by default.
     case "${target}" in
       *-*-*libc1*)
-	noconfigdirs="$noconfigdirs ${libgcj}";;
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc";;
     esac
 
     # This section makes it possible to build newlib natively on linux.
@@ -1403,36 +1404,36 @@
   i[3456789]86-*-uwin* | i[3456789]86-*-interix* )
     ;;
   i[3456789]86-*-pe)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[3456789]86-*-sco3.2v5*)
     # The linker does not yet know about weak symbols in COFF,
     # and is not configured to handle mixed ELF and COFF.
-    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[3456789]86-*-sco*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[3456789]86-*-solaris2*)
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   i[3456789]86-*-sysv4*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[3456789]86-*-beos*)
-    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   m32r-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-*-elf*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-*-coff*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   mcore-*-pe*)
   # The EPOC C++ environment does not support exceptions or rtti,
@@ -1440,50 +1441,50 @@
     noconfigdirs="$noconfigdirs target-libstdc++-v3"
     ;;
   mmix-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb libgloss target-libgfortran"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb libgloss target-libgfortran"
     ;;
   mn10200-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   mn10300-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-aix*)
     # copied from rs6000-*-* entry
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc*-*-winnt* | powerpc*-*-pe* | ppc*-*-pe)
     target_configdirs="$target_configdirs target-winsup"
-    noconfigdirs="$noconfigdirs gdb tcl tk make expect target-libgloss itcl gnuserv ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb tcl tk make expect target-libgloss itcl gnuserv ${libgcj} target-libffi target-libobjc"
     # always build newlib.
     skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'`
     ;;
     # This is temporary until we can link against shared libraries
   powerpcle-*-solaris*)
-    noconfigdirs="$noconfigdirs gdb sim make tcl tk expect itcl gnuserv ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb sim make tcl tk expect itcl gnuserv ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-beos*)
-    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-eabi)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-eabi* | powerpcle-*-eabi* | powerpc-*-rtems* )
     ;;
   rs6000-*-lynxos*)
-    noconfigdirs="$noconfigdirs target-newlib gprof ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib gprof ${libgcj} target-libffi target-libobjc"
     ;;
   rs6000-*-aix*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   rs6000-*-*)
-    noconfigdirs="$noconfigdirs gprof ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-apollo-*)
-    noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-irix5*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-irix6*)
     # Linking libjava exceeds command-line length limits on at least
@@ -1493,13 +1494,13 @@
     noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
     ;;
   mips*-dec-bsd*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-bsd*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mipstx39-*-*)
-    noconfigdirs="$noconfigdirs gprof ${libgcj}"   # same as generic mips
+    noconfigdirs="$noconfigdirs gprof ${libgcj} target-libffi target-libobjc"   # same as generic mips
     ;;
   mips64*-*-linux*)
     noconfigdirs="$noconfigdirs target-newlib ${libgcj}"
@@ -1545,37 +1546,37 @@
   sparc-*-solaris* | sparc64-*-solaris* | sparcv9-*-solaris*)
     ;;
   v810-*-*)
-    noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850e-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850ea-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   vax-*-vms)
-    noconfigdirs="$noconfigdirs bfd binutils gdb ld target-newlib opcodes target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs bfd binutils gdb ld target-newlib opcodes target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   vax-*-*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   xtensa-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   ip2k-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
   *-*-lynxos*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;; 
   *-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
 esac
 
@@ -1797,7 +1798,7 @@
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1801: checking for $ac_word" >&5
+echo "configure:1802: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1827,7 +1828,7 @@
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1831: checking for $ac_word" >&5
+echo "configure:1832: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1878,7 +1879,7 @@
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1882: checking for $ac_word" >&5
+echo "configure:1883: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1910,7 +1911,7 @@
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1914: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1915: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1921,12 +1922,12 @@
 
 cat > conftest.$ac_ext << EOF
 
-#line 1925 "configure"
+#line 1926 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1930: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1952,12 +1953,12 @@
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1956: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1957: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1961: checking whether we are using GNU C" >&5
+echo "configure:1962: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1966,7 +1967,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1970: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1971: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1985,7 +1986,7 @@
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1989: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1990: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2052,7 +2053,7 @@
 # Extract the first word of "${ac_tool_prefix}gnatbind", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gnatbind; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2056: checking for $ac_word" >&5
+echo "configure:2057: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2084,7 +2085,7 @@
   # Extract the first word of "gnatbind", so it can be a program name with args.
 set dummy gnatbind; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2088: checking for $ac_word" >&5
+echo "configure:2089: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2117,7 +2118,7 @@
 fi
 
 echo $ac_n "checking whether compiler driver understands Ada""... $ac_c" 1>&6
-echo "configure:2121: checking whether compiler driver understands Ada" >&5
+echo "configure:2122: checking whether compiler driver understands Ada" >&5
 if eval "test \"`echo '$''{'acx_cv_cc_gcc_supports_ada'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2150,7 +2151,7 @@
 fi
 
 echo $ac_n "checking how to compare bootstrapped objects""... $ac_c" 1>&6
-echo "configure:2154: checking how to compare bootstrapped objects" >&5
+echo "configure:2155: checking how to compare bootstrapped objects" >&5
 if eval "test \"`echo '$''{'gcc_cv_prog_cmp_skip'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2248,9 +2249,9 @@
 CFLAGS="$CFLAGS $gmpinc"
 # Check GMP actually works
 echo $ac_n "checking for correct version of gmp.h""... $ac_c" 1>&6
-echo "configure:2252: checking for correct version of gmp.h" >&5
+echo "configure:2253: checking for correct version of gmp.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2254 "configure"
+#line 2255 "configure"
 #include "confdefs.h"
 #include "gmp.h"
 int main() {
@@ -2261,7 +2262,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2266: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -2274,12 +2275,12 @@
 
 if test x"$have_gmp" = xyes; then
   echo $ac_n "checking for MPFR""... $ac_c" 1>&6
-echo "configure:2278: checking for MPFR" >&5
+echo "configure:2279: checking for MPFR" >&5
 
   saved_LIBS="$LIBS"
   LIBS="$LIBS $gmplibs"
   cat > conftest.$ac_ext <<EOF
-#line 2283 "configure"
+#line 2284 "configure"
 #include "confdefs.h"
 #include <gmp.h>
 #include <mpfr.h>
@@ -2287,7 +2288,7 @@
 mpfr_t n; mpfr_init(n);
 ; return 0; }
 EOF
-if { (eval echo configure:2291: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -2774,7 +2775,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2778: checking for $ac_word" >&5
+echo "configure:2779: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_BISON'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2809,7 +2810,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2813: checking for $ac_word" >&5
+echo "configure:2814: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2844,7 +2845,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2848: checking for $ac_word" >&5
+echo "configure:2849: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_M4'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2879,7 +2880,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2883: checking for $ac_word" >&5
+echo "configure:2884: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_FLEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2914,7 +2915,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2918: checking for $ac_word" >&5
+echo "configure:2919: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2949,7 +2950,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2953: checking for $ac_word" >&5
+echo "configure:2954: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_MAKEINFO'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3595,7 +3596,7 @@
   # Extract the first word of "${ncn_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3599: checking for $ac_word" >&5
+echo "configure:3600: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3628,7 +3629,7 @@
     # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3632: checking for $ac_word" >&5
+echo "configure:3633: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3667,7 +3668,7 @@
   # Extract the first word of "${ncn_tool_prefix}as", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}as; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3671: checking for $ac_word" >&5
+echo "configure:3672: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3700,7 +3701,7 @@
     # Extract the first word of "as", so it can be a program name with args.
 set dummy as; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3704: checking for $ac_word" >&5
+echo "configure:3705: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AS'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3739,7 +3740,7 @@
   # Extract the first word of "${ncn_tool_prefix}dlltool", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}dlltool; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3743: checking for $ac_word" >&5
+echo "configure:3744: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3772,7 +3773,7 @@
     # Extract the first word of "dlltool", so it can be a program name with args.
 set dummy dlltool; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3776: checking for $ac_word" >&5
+echo "configure:3777: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_DLLTOOL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3811,7 +3812,7 @@
   # Extract the first word of "${ncn_tool_prefix}ld", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3815: checking for $ac_word" >&5
+echo "configure:3816: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3844,7 +3845,7 @@
     # Extract the first word of "ld", so it can be a program name with args.
 set dummy ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3848: checking for $ac_word" >&5
+echo "configure:3849: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3883,7 +3884,7 @@
   # Extract the first word of "${ncn_tool_prefix}nm", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}nm; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3887: checking for $ac_word" >&5
+echo "configure:3888: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3916,7 +3917,7 @@
     # Extract the first word of "nm", so it can be a program name with args.
 set dummy nm; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3920: checking for $ac_word" >&5
+echo "configure:3921: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_NM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3955,7 +3956,7 @@
   # Extract the first word of "${ncn_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3959: checking for $ac_word" >&5
+echo "configure:3960: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3988,7 +3989,7 @@
     # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3992: checking for $ac_word" >&5
+echo "configure:3993: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4027,7 +4028,7 @@
   # Extract the first word of "${ncn_tool_prefix}windres", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4031: checking for $ac_word" >&5
+echo "configure:4032: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4060,7 +4061,7 @@
     # Extract the first word of "windres", so it can be a program name with args.
 set dummy windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4064: checking for $ac_word" >&5
+echo "configure:4065: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_WINDRES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4099,7 +4100,7 @@
   # Extract the first word of "${ncn_tool_prefix}objcopy", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}objcopy; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4103: checking for $ac_word" >&5
+echo "configure:4104: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4132,7 +4133,7 @@
     # Extract the first word of "objcopy", so it can be a program name with args.
 set dummy objcopy; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4136: checking for $ac_word" >&5
+echo "configure:4137: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJCOPY'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4171,7 +4172,7 @@
   # Extract the first word of "${ncn_tool_prefix}objdump", so it can be a program name with args.
 set dummy ${ncn_tool_prefix}objdump; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4175: checking for $ac_word" >&5
+echo "configure:4176: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4204,7 +4205,7 @@
     # Extract the first word of "objdump", so it can be a program name with args.
 set dummy objdump; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4208: checking for $ac_word" >&5
+echo "configure:4209: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJDUMP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4250,7 +4251,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4254: checking for $ac_word" >&5
+echo "configure:4255: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4283,7 +4284,7 @@
     # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4287: checking for $ac_word" >&5
+echo "configure:4288: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4322,7 +4323,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}as", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}as; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4326: checking for $ac_word" >&5
+echo "configure:4327: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4355,7 +4356,7 @@
     # Extract the first word of "as", so it can be a program name with args.
 set dummy as; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4359: checking for $ac_word" >&5
+echo "configure:4360: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4394,7 +4395,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}dlltool", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}dlltool; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4398: checking for $ac_word" >&5
+echo "configure:4399: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4427,7 +4428,7 @@
     # Extract the first word of "dlltool", so it can be a program name with args.
 set dummy dlltool; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4431: checking for $ac_word" >&5
+echo "configure:4432: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4466,7 +4467,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}ld", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4470: checking for $ac_word" >&5
+echo "configure:4471: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4499,7 +4500,7 @@
     # Extract the first word of "ld", so it can be a program name with args.
 set dummy ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4503: checking for $ac_word" >&5
+echo "configure:4504: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4538,7 +4539,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}nm", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}nm; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4542: checking for $ac_word" >&5
+echo "configure:4543: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4571,7 +4572,7 @@
     # Extract the first word of "nm", so it can be a program name with args.
 set dummy nm; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4575: checking for $ac_word" >&5
+echo "configure:4576: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4610,7 +4611,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4614: checking for $ac_word" >&5
+echo "configure:4615: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4643,7 +4644,7 @@
     # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4647: checking for $ac_word" >&5
+echo "configure:4648: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4682,7 +4683,7 @@
   # Extract the first word of "${ncn_target_tool_prefix}windres", so it can be a program name with args.
 set dummy ${ncn_target_tool_prefix}windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4686: checking for $ac_word" >&5
+echo "configure:4687: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4715,7 +4716,7 @@
     # Extract the first word of "windres", so it can be a program name with args.
 set dummy windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4719: checking for $ac_word" >&5
+echo "configure:4720: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4800,7 +4801,7 @@
 NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target}
 
 echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:4804: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:4805: checking whether to enable maintainer-specific portions of Makefiles" >&5
 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
   enableval="$enable_maintainer_mode"
@@ -4847,7 +4848,7 @@
 # gcc for stageN-gcc and stagePREV-gcc for stage(N-1).  In case this is not
 # possible, however, we can resort to mv.
 echo $ac_n "checking if symbolic links between directories work""... $ac_c" 1>&6
-echo "configure:4851: checking if symbolic links between directories work" >&5
+echo "configure:4852: checking if symbolic links between directories work" >&5
 if eval "test \"`echo '$''{'gcc_cv_prog_ln_s_dir'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
Index: configure.in
===================================================================
RCS file: /cvsroot/gcc/gcc/configure.in,v
retrieving revision 1.337
diff -u -r1.337 configure.in
--- configure.in	3 Dec 2004 10:44:37 -0000	1.337
+++ configure.in	12 Dec 2004 00:09:44 -0000
@@ -151,11 +151,11 @@
 host_tools="texinfo byacc flex bison binutils gas ld fixincludes gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar"
 
 # libgcj represents the runtime libraries only used by gcj.
-libgcj="target-libffi \
-	target-boehm-gc \
+libgcj="target-boehm-gc \
 	target-zlib \
 	target-qthreads \
 	target-libjava"
+	 
 
 # these libraries are built for the target environment, and are built after
 # the host libraries and the host tools (which may be a cross compiler)
@@ -165,9 +165,10 @@
 		target-newlib \
 		target-libstdc++-v3 \
 		target-libmudflap \
+		target-libobjc \
 		target-libgfortran \
 		${libgcj} \
-		target-libobjc \
+		target-libffi \
 		target-libada"
 
 # these tools are built using the target libraries, and are intended to
@@ -287,7 +288,7 @@
     noconfigdirs="$noconfigdirs tcl expect dejagnu make texinfo bison patch flex byacc send-pr gprof uudecode dejagnu diff guile perl itcl gnuserv gettext"
     ;;
   i[[3456789]]86-*-go32* | i[[3456789]]86-*-msdosdjgpp*)
-    noconfigdirs="$noconfigdirs tcl tk expect dejagnu send-pr uudecode guile itcl gnuserv libffi"
+    noconfigdirs="$noconfigdirs tcl tk expect dejagnu send-pr uudecode guile itcl gnuserv target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-mingw32*)
     # noconfigdirs="tcl tk expect dejagnu make texinfo bison patch flex byacc send-pr uudecode dejagnu diff guile perl itcl gnuserv"
@@ -364,17 +365,17 @@
 
 case "${target}" in
   *-*-chorusos)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
     ;;
   *-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-freebsd[[12]] | *-*-freebsd[[12]].* | *-*-freebsd*aout*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-freebsd*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
@@ -388,14 +389,14 @@
       i*86-*-*) ;;
       alpha*-*-*) ;;
       *)
-	noconfigdirs="$noconfigdirs ${libgcj}"
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
 	;;
     esac
     ;;
   *-*-kaos*)
     # Remove unsupported stuff on all kaOS configurations.
-    skipdirs="target-libiberty ${libgcj} target-libstdc++-v3 target-librx"
-    skipdirs="$skipdirs target-libobjc target-examples target-groff target-gperf"
+    skipdirs="target-libiberty ${libgcj} target-libffi target-libobjc target-libstdc++-v3 target-librx"
+    skipdirs="$skipdirs target-examples target-groff target-gperf"
     skipdirs="$skipdirs zlib fastjar target-libjava target-boehm-gc target-zlib"
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
@@ -408,21 +409,21 @@
       i*86-*-netbsdelf*) ;;
       arm*-*-netbsdelf*) ;;
       *)
-	noconfigdirs="$noconfigdirs ${libgcj}"
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
 	;;
     esac
     ;;
   *-*-netware*)
-    noconfigdirs="$noconfigdirs target-newlib target-libiberty target-libgloss ${libgcj} target-libmudflap"
+    noconfigdirs="$noconfigdirs target-newlib target-libiberty target-libgloss ${libgcj} target-libffi target-libobjc target-libmudflap"
     ;;
   *-*-rtems*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-uclinux*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-vxworks*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj} target-libffi target-libobjc"
     ;;
   alpha*-dec-osf*)
     # ld works, but does not support shared libraries.
@@ -431,7 +432,7 @@
     noconfigdirs="$noconfigdirs gas ld fileutils target-newlib target-libgloss"
     ;;
   alpha*-*-*vms*)
-    noconfigdirs="$noconfigdirs gdb ld target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb ld target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   alpha*-*-linux*)
     # newlib is not 64 bit ready
@@ -439,16 +440,16 @@
     ;;
   alpha*-*-*)
     # newlib is not 64 bit ready
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   am33_2.0-*-linux*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;
   sh-*-linux*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;    
   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     noconfigdirs="$noconfigdirs target-examples"
     noconfigdirs="$noconfigdirs target-libiberty texinfo send-pr"
     noconfigdirs="$noconfigdirs tcl tk itcl libgui sim"
@@ -463,66 +464,66 @@
     esac
     ;;
   arc-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   arm-semi-aof )
     ;;
   arm-*-coff | strongarm-*-coff | xscale-*-coff)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
-    noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+    noconfigdirs="$noconfigdirs target-libffi target-libobjc target-qthreads"
     ;;
   arm*-*-symbianelf*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-libiberty"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-libiberty"
     ;;
   arm-*-pe*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-coff)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-elf)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   thumb-*-pe)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   arm-*-riscix*)
-    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   avr-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   c4x-*-* | tic4x-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   c54x*-*-* | tic54x-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} gcc gdb newlib"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc gcc gdb newlib"
     ;;
   cris-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc target-newlib target-libgloss"
     ;;
   crx-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-mudflap ${libgcj} target-libffi target-libobjc"
     ;;
   d10v-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   d30v-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   fr30-*-elf*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   frv-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   h8300*-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   h8500-*-*)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   hppa1.1-*-osf* | hppa1.1-*-bsd* )
     ;;
@@ -538,15 +539,15 @@
   hppa*-*-lites* | \
   hppa*-*-openbsd* | \
   hppa*64*-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   hppa*-*-*)
     # According to Alexandre Oliva <aoliva@redhat.com>, libjava won't
     # build on HP-UX 10.20.
-    noconfigdirs="$noconfigdirs ld shellutils ${libgcj}"
+    noconfigdirs="$noconfigdirs ld shellutils ${libgcj} target-libffi target-libobjc"
     ;;
   i960-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb"
     ;;
   ia64*-*-elf*)
     # No gdb support yet.
@@ -554,19 +555,19 @@
     ;;
   ia64*-**-hpux*)
     # No gdb or ld support yet.
-    noconfigdirs="$noconfigdirs ${libgcj} readline mmalloc libgui itcl gdb ld"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc readline mmalloc libgui itcl gdb ld"
     ;;
   i370-*-opened*)
     ;;
   i[[3456789]]86-*-coff | i[[3456789]]86-*-elf)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-linux*)
     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
     # not build java stuff by default.
     case "${target}" in
       *-*-*libc1*)
-	noconfigdirs="$noconfigdirs ${libgcj}";;
+	noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc";;
     esac
 
     # This section makes it possible to build newlib natively on linux.
@@ -612,36 +613,36 @@
   i[[3456789]]86-*-uwin* | i[[3456789]]86-*-interix* )
     ;;
   i[[3456789]]86-*-pe)
-    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-sco3.2v5*)
     # The linker does not yet know about weak symbols in COFF,
     # and is not configured to handle mixed ELF and COFF.
-    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-sco*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-solaris2*)
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   i[[3456789]]86-*-sysv4*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   i[[3456789]]86-*-beos*)
-    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   m32r-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-*-elf*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-*-coff*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   mcore-*-pe*)
   # The EPOC C++ environment does not support exceptions or rtti,
@@ -649,50 +650,50 @@
     noconfigdirs="$noconfigdirs target-libstdc++-v3"
     ;;
   mmix-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj} gdb libgloss target-libgfortran"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc gdb libgloss target-libgfortran"
     ;;
   mn10200-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   mn10300-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-aix*)
     # copied from rs6000-*-* entry
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc*-*-winnt* | powerpc*-*-pe* | ppc*-*-pe)
     target_configdirs="$target_configdirs target-winsup"
-    noconfigdirs="$noconfigdirs gdb tcl tk make expect target-libgloss itcl gnuserv ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb tcl tk make expect target-libgloss itcl gnuserv ${libgcj} target-libffi target-libobjc"
     # always build newlib.
     skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'`
     ;;
     # This is temporary until we can link against shared libraries
   powerpcle-*-solaris*)
-    noconfigdirs="$noconfigdirs gdb sim make tcl tk expect itcl gnuserv ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb sim make tcl tk expect itcl gnuserv ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-beos*)
-    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-eabi)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   powerpc-*-eabi* | powerpcle-*-eabi* | powerpc-*-rtems* )
     ;;
   rs6000-*-lynxos*)
-    noconfigdirs="$noconfigdirs target-newlib gprof ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib gprof ${libgcj} target-libffi target-libobjc"
     ;;
   rs6000-*-aix*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   rs6000-*-*)
-    noconfigdirs="$noconfigdirs gprof ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof ${libgcj} target-libffi target-libobjc"
     ;;
   m68k-apollo-*)
-    noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-irix5*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-irix6*)
     # Linking libjava exceeds command-line length limits on at least
@@ -702,13 +703,13 @@
     noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
     ;;
   mips*-dec-bsd*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mips*-*-bsd*)
-    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   mipstx39-*-*)
-    noconfigdirs="$noconfigdirs gprof ${libgcj}"   # same as generic mips
+    noconfigdirs="$noconfigdirs gprof ${libgcj} target-libffi target-libobjc"   # same as generic mips
     ;;
   mips64*-*-linux*)
     noconfigdirs="$noconfigdirs target-newlib ${libgcj}"
@@ -754,37 +755,37 @@
   sparc-*-solaris* | sparc64-*-solaris* | sparcv9-*-solaris*)
     ;;
   v810-*-*)
-    noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850e-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   v850ea-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   vax-*-vms)
-    noconfigdirs="$noconfigdirs bfd binutils gdb ld target-newlib opcodes target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs bfd binutils gdb ld target-newlib opcodes target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   vax-*-*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;;
   xtensa-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
   ip2k-*-*)
-    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+    noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj} target-libffi target-libobjc"
     ;;
   *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
   *-*-lynxos*)
-    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj} target-libffi target-libobjc"
     ;; 
   *-*-*)
-    noconfigdirs="$noconfigdirs ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj} target-libffi target-libobjc"
     ;;
 esac
 
Index: ltcf-c.sh
===================================================================
RCS file: /cvsroot/gcc/gcc/ltcf-c.sh,v
retrieving revision 1.21
diff -u -r1.21 ltcf-c.sh
--- ltcf-c.sh	2 Oct 2004 16:33:06 -0000	1.21
+++ ltcf-c.sh	12 Dec 2004 00:09:44 -0000
@@ -418,7 +418,6 @@
     hardcode_direct=no
     hardcode_automatic=yes
     hardcode_shlibpath_var=unsupported
-    whole_archive_flag_spec='-all_load $convenience'
     link_all_deplibs=yes
     ;;
 
Index: ltcf-gcj.sh
===================================================================
RCS file: /cvsroot/gcc/gcc/ltcf-gcj.sh,v
retrieving revision 1.14
diff -u -r1.14 ltcf-gcj.sh
--- ltcf-gcj.sh	27 Apr 2004 06:14:30 -0000	1.14
+++ ltcf-gcj.sh	12 Dec 2004 00:09:44 -0000
@@ -416,7 +416,6 @@
     hardcode_direct=no
     hardcode_automatic=yes
     hardcode_shlibpath_var=unsupported
-    whole_archive_flag_spec='-all_load $convenience'
     link_all_deplibs=yes
     ;;
 
Index: libobjc/Makefile.in
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/Makefile.in,v
retrieving revision 1.44
diff -u -r1.44 Makefile.in
--- libobjc/Makefile.in	20 Oct 2004 01:26:37 -0000	1.44
+++ libobjc/Makefile.in	12 Dec 2004 00:09:47 -0000
@@ -39,6 +39,8 @@
 toolexecdir = @toolexecdir@
 # Toolexecdir is used only by toolexeclibdir
 toolexeclibdir = @toolexeclibdir@
+LIBFFI = @LIBFFI@
+LIBFFIINCS = @LIBFFIINCS@
 
 includedirname = @includedirname@
 libext = @libext@
@@ -56,6 +58,7 @@
 MULTIDO = true
 MULTICLEAN = true
 
+
 # Not configured per top-level version, since that doesn't get passed
 # down at configure time, but overrridden by the top-level install
 # target.
@@ -73,7 +76,7 @@
 WARN_CFLAGS = -W -Wall -Wwrite-strings -Wstrict-prototypes
 GTHREAD_FLAGS=@GTHREAD_FLAGS@
 ALL_CFLAGS = -I. -I$(srcdir) $(CPPFLAGS) $(DEFS) $(CFLAGS) $(WARN_CFLAGS) \
-	$(GTHREAD_FLAGS) -DIN_GCC -DIN_TARGET_LIBS -fno-strict-aliasing
+	$(GTHREAD_FLAGS) -DIN_GCC -DIN_TARGET_LIBS -fno-strict-aliasing $(LIBFFIINCS)
 
 # Libtool
 # The following strings describe the version of the obj-C library 
@@ -145,13 +148,15 @@
 OBJS =    archive.lo class.lo encoding.lo gc.lo hash.lo init.lo linking.lo \
 	  misc.lo nil_method.lo NXConstStr.lo Object.lo objects.lo \
 	  Protocol.lo sarray.lo selector.lo sendmsg.lo thr.lo \
-	  $(OBJC_THREAD_FILE).lo exception.lo
+	  $(OBJC_THREAD_FILE).lo exception.lo \
+	  forwarding.lo
 
 OBJS_GC = archive_gc.lo class_gc.lo encoding_gc.lo gc_gc.lo hash_gc.lo \
 	  init_gc.lo linking_gc.lo misc_gc.lo nil_method_gc.lo \
 	  NXConstStr_gc.lo Object_gc.lo objects_gc.lo Protocol_gc.lo \
 	  sarray_gc.lo selector_gc.lo sendmsg_gc.lo thr_gc.lo \
-	  $(OBJC_THREAD_FILE)_gc.lo exception_gc.lo
+	  $(OBJC_THREAD_FILE)_gc.lo exception_gc.lo \
+	  forwarding_gc.lo
 
 runtime-info.h: 
 	echo "" > tmp-runtime.m
@@ -171,6 +176,10 @@
 	$(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
 		$(INCLUDES) $<
 
+forwarding_gc.lo: forwarding.c
+	$(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
+		$(INCLUDES) $<
+
 gc.lo: gc.c
 	$(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(INCLUDES) $<
 
@@ -264,12 +273,12 @@
 doc: info dvi html
 
 libobjc$(libext).la: $(OBJS)
-	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS) \
+	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS) $(LIBFFI) \
 		-rpath $(toolexeclibdir) \
 		-version-info $(LIBOBJC_VERSION)
 
 libobjc_gc$(libext).la: $(OBJS_GC)
-	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) \
+	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) $(LIBFFI) \
 		-rpath $(toolexeclibdir) \
 		-version-info $(LIBOBJC_GC_VERSION)
 
Index: libobjc/configure
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/configure,v
retrieving revision 1.56
diff -u -r1.56 configure
--- libobjc/configure	2 Dec 2004 11:05:04 -0000	1.56
+++ libobjc/configure	12 Dec 2004 00:09:47 -0000
@@ -309,7 +309,7 @@
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS VERSION OBJC_BOEHM_GC toplevel_srcdir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical glibcpp_srcdir gcc_version_trigger gcc_version_full gcc_version toolexecdir toolexeclibdir includedirname libext CC ac_ct_CC EXEEXT OBJEXT CFLAGS AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S STRIP ac_ct_STRIP LIBTOOL SET_MAKE CPP CPPFLAGS EGREP GTHREAD_FLAGS LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS VERSION OBJC_BOEHM_GC toplevel_srcdir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical glibcpp_srcdir gcc_version_trigger gcc_version_full gcc_version toolexecdir toolexeclibdir includedirname libext LIBFFI LIBFFIINCS CC ac_ct_CC EXEEXT OBJEXT CFLAGS AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S STRIP ac_ct_STRIP LIBTOOL SET_MAKE CPP CPPFLAGS EGREP GTHREAD_FLAGS LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -854,6 +854,7 @@
   --with-target-subdir=SUBDIR
                            configuring in a subdirectory
   --with-cross-host=HOST  configuring with a cross compiler
+  --without-libffi        don't use libffi
   --with-gnu-ld           assume the C compiler uses GNU ld default=no
   --with-pic              try to use only PIC/non-PIC objects default=use both
 
@@ -1615,6 +1616,32 @@
           ac_config_headers="$ac_config_headers config.h"
 
 
+# See if the user wants to configure without libffi.  Some
+# architectures don't support it, and default values are set in
+# configure.host.
+
+# Check whether --with-libffi or --without-libffi was given.
+if test "${with_libffi+set}" = set; then
+  withval="$with_libffi"
+  :
+else
+  with_libffi=${with_libffi_default-yes}
+fi;
+
+LIBFFI=
+LIBFFIINCS=
+if test "$with_libffi" != no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_LIBFFI 1
+_ACEOF
+
+   LIBFFI=../libffi/libffi_convenience.la
+   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include'
+fi
+
+
+
 # --------
 # Programs
 # --------
@@ -3675,7 +3702,7 @@
 case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 3678 "configure"' > conftest.$ac_ext
+  echo '#line 3705 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -5110,7 +5137,7 @@
   :
 else
   cat > conftest.$ac_ext << EOF
-#line 5113 "configure"
+#line 5140 "configure"
 @interface Frob
 @end
 @implementation Frob
@@ -5838,6 +5865,8 @@
 s,@toolexeclibdir@,$toolexeclibdir,;t t
 s,@includedirname@,$includedirname,;t t
 s,@libext@,$libext,;t t
+s,@LIBFFI@,$LIBFFI,;t t
+s,@LIBFFIINCS@,$LIBFFIINCS,;t t
 s,@CC@,$CC,;t t
 s,@ac_ct_CC@,$ac_ct_CC,;t t
 s,@EXEEXT@,$EXEEXT,;t t
Index: libobjc/configure.ac
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/configure.ac,v
retrieving revision 1.12
diff -u -r1.12 configure.ac
--- libobjc/configure.ac	2 Dec 2004 11:05:06 -0000	1.12
+++ libobjc/configure.ac	12 Dec 2004 00:09:47 -0000
@@ -165,6 +165,25 @@
 
 AC_CONFIG_HEADERS(config.h)
 
+# See if the user wants to configure without libffi.  Some
+# architectures don't support it, and default values are set in
+# configure.host.
+AC_ARG_WITH(libffi,
+  AS_HELP_STRING([--without-libffi],
+                 [don't use libffi]),
+  [:],
+  [with_libffi=${with_libffi_default-yes}])
+  
+LIBFFI=
+LIBFFIINCS=
+if test "$with_libffi" != no; then
+   AC_DEFINE(USE_LIBFFI, 1, [Define if we're to use libffi.])
+   LIBFFI=../libffi/libffi_convenience.la
+   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include'
+fi
+AC_SUBST(LIBFFI)
+AC_SUBST(LIBFFIINCS)
+
 # --------
 # Programs
 # --------
Index: libobjc/encoding.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/encoding.c,v
retrieving revision 1.24
diff -u -r1.24 encoding.c
--- libobjc/encoding.c	16 Sep 2004 08:35:01 -0000	1.24
+++ libobjc/encoding.c	12 Dec 2004 00:09:47 -0000
@@ -619,88 +619,6 @@
   return atoi (type);
 }
 
-/*
-  Return a pointer to the next argument of ARGFRAME.  type points to
-  the last argument.  Typical use of this look like:
-
-  {
-    char *datum, *type;
-    for (datum = method_get_first_argument (method, argframe, &type);
-         datum; datum = method_get_next_argument (argframe, &type))
-      {
-        unsigned flags = objc_get_type_qualifiers (type);
-        type = objc_skip_type_qualifiers (type);
-	if (*type != _C_PTR)
-          [portal encodeData: datum ofType: type];
-	else
-	  {
-	    if ((flags & _F_IN) == _F_IN)
-              [portal encodeData: *(char **) datum ofType: ++type];
-	  }
-      }
-  }
-*/
-
-char *
-method_get_next_argument (arglist_t argframe, const char **type)
-{
-  const char *t = objc_skip_argspec (*type);
-
-  if (*t == '\0')
-    return 0;
-
-  *type = t;
-  t = objc_skip_typespec (t);
-
-  if (*t == '+')
-    return argframe->arg_regs + atoi (++t);
-  else
-    return argframe->arg_ptr + atoi (t);
-}
-
-/*
-  Return a pointer to the value of the first argument of the method
-  described in M with the given argumentframe ARGFRAME.  The type
-  is returned in TYPE.  type must be passed to successive calls of
-  method_get_next_argument.
-*/
-char *
-method_get_first_argument (struct objc_method *m,
-			   arglist_t argframe,
-			   const char **type)
-{
-  *type = m->method_types;
-  return method_get_next_argument (argframe, type);
-}
-
-/*
-   Return a pointer to the ARGth argument of the method
-   M from the frame ARGFRAME.  The type of the argument
-   is returned in the value-result argument TYPE
-*/
-
-char *
-method_get_nth_argument (struct objc_method *m,
-			 arglist_t argframe, int arg,
-			 const char **type)
-{
-  const char *t = objc_skip_argspec (m->method_types);
-
-  if (arg > method_get_number_of_arguments (m))
-    return 0;
-
-  while (arg--)
-    t = objc_skip_argspec (t);
-
-  *type = t;
-  t = objc_skip_typespec (t);
-
-  if (*t == '+')
-    return argframe->arg_regs + atoi (++t);
-  else
-    return argframe->arg_ptr + atoi (t);
-}
-
 unsigned
 objc_get_type_qualifiers (const char *type)
 {
Index: libobjc/forwarding.c
===================================================================
RCS file: libobjc/forwarding.c
diff -N libobjc/forwarding.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libobjc/forwarding.c	12 Dec 2004 00:09:47 -0000
@@ -0,0 +1,466 @@
+/* GNU Objective C Runtime message lookup 
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2, or (at your option) any later version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+details.
+
+You should have received a copy of the GNU General Public License along with
+GCC; see the file COPYING.  If not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, if you link this library with files compiled with
+   GCC to produce an executable, this does not cause the resulting executable
+   to be covered by the GNU General Public License. This exception does not
+   however invalidate any other reasons why the executable file might be
+   covered by the GNU General Public License.  */
+
+
+#include "tconfig.h"
+#include "runtime.h"
+#include "encoding.h"
+
+#include <ffi.h>
+
+#include <stdlib.h>
+
+
+typedef struct objc_closure
+{
+  ffi_closure closure;
+  ffi_cif cif;
+  ffi_type *atypes[];
+} objc_closure_t;
+
+struct arglist
+{
+  objc_closure_t *closure;
+  void *ret;
+  void **args;
+};
+
+static cache_ptr closure_table; /* !T:MUTEX */
+
+static void forwarder (ffi_cif *cif, void *ret, void **args, void *user);
+
+
+void
+__objc_init_forwarding (void)
+{
+  closure_table
+    = hash_new (32,
+		(hash_func_type) hash_string,
+		(compare_func_type) compare_strings);
+}
+
+
+static ffi_type *
+build_ffi_type (const char **t, int level)
+{
+  const char *type = *t;
+
+  if (!level)
+    *t = objc_skip_argspec (*t);
+  else
+    *t = objc_skip_typespec (*t);
+  
+  /* Skip the variable name if any.  */
+  if (*type == '"')
+    {
+      for (type++; *type++ != '"';)
+	/* do nothing */;
+    }
+
+  /* Skip any qualifiers.  */
+  type = objc_skip_type_qualifiers (type);
+
+  switch (*type++)
+  {
+  case _C_CLASS:
+  case _C_SEL:
+  case _C_ATOM: /* ? */
+  case _C_CHARPTR:
+  case _C_ID:
+  case _C_PTR:
+    return &ffi_type_pointer;
+
+  case _C_CHR:
+    return &ffi_type_schar;
+
+  case _C_UCHR:
+    return &ffi_type_uchar;
+
+  case _C_SHT:
+    return &ffi_type_sshort;
+
+  case _C_USHT:
+    return &ffi_type_ushort;
+
+  case _C_INT:
+    return &ffi_type_sint;
+
+  case _C_UINT:
+    return &ffi_type_uint;
+
+  case _C_LNG:
+    return &ffi_type_slong;
+
+  case _C_ULNG:
+    return &ffi_type_ulong;
+
+  case _C_LNG_LNG:
+    return &ffi_type_sint64; /* ? */
+
+  case _C_ULNG_LNG:
+    return &ffi_type_uint64; /* ? */
+
+  case _C_FLT:
+    return &ffi_type_float;
+
+  case _C_DBL:
+    return &ffi_type_double;
+
+  case _C_VOID:
+    return &ffi_type_void;
+
+  case _C_ARY_B:
+    if (!level)
+      {
+	while (*type != _C_ARY_E)
+	  type++;
+	return &ffi_type_pointer;
+      }
+    else
+      {
+	objc_error (nil, OBJC_ERR_BAD_TYPE,
+		    "forwarding can't handle arrays in structs\n");
+	return NULL;
+      }
+
+  case _C_STRUCT_B:
+    {
+      ffi_type *ft = objc_malloc (sizeof (ffi_type));
+      ffi_type *ft2;
+      int num;
+      ft->type = FFI_TYPE_STRUCT;
+      ft->elements = NULL;
+      num = 0;
+
+      while (*type != '=')
+	type++;
+
+      type++;
+      while (*type != _C_STRUCT_E)
+	{
+	  ft2 = build_ffi_type (&type, 1);
+	  ft->elements = objc_realloc (ft->elements,
+				       num * sizeof (ffi_type *));
+	  ft->elements[num++] = ft2;
+	}
+      type++;
+      ft->elements = objc_realloc (ft->elements, num * sizeof (ffi_type *));
+      ft->elements[num] = NULL;
+      return ft;
+    }
+
+  default:
+    type--;
+    objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
+    return NULL;
+  }
+}
+
+static int
+number_of_arguments (const char *type)
+{
+  int i = 0;
+  while (*type)
+    {
+      type = objc_skip_argspec (type);
+      i += 1;
+    }
+  return i - 1;
+}
+
+static objc_closure_t *
+closure_for_type (const char *type)
+{
+  const char *key = type;
+  objc_closure_t *c;
+  ffi_type *rtype;
+  int num_args;
+  int i;
+
+  objc_mutex_lock (__objc_runtime_mutex);
+  c = hash_value_for_key (closure_table, key);
+  if (c)
+    {
+      objc_mutex_unlock (__objc_runtime_mutex);
+      return c;
+    }
+
+  num_args = number_of_arguments (type);
+
+  c = (objc_closure_t *) objc_malloc (sizeof (objc_closure_t)
+				      + sizeof (ffi_type *) * num_args);
+
+  rtype = build_ffi_type (&type, 0);
+  for (i = 0; i < num_args; i++)
+    {
+      c->atypes[i] = build_ffi_type (&type, 0);
+    }
+
+  if (ffi_prep_cif (&c->cif, FFI_DEFAULT_ABI, num_args, rtype, c->atypes))
+    {
+      objc_mutex_unlock (__objc_runtime_mutex);
+      objc_error (nil, OBJC_ERR_FORWARDING, "ffi_prep_cif failed\n");
+      return NULL;
+    }
+
+  if (ffi_prep_closure (&c->closure, &c->cif, forwarder, c))
+    {
+      objc_mutex_unlock (__objc_runtime_mutex);
+      objc_error (nil, OBJC_ERR_FORWARDING, "ffi_prep_closure failed\n");
+      return NULL;
+    }
+
+  hash_add (&closure_table, key, c);
+  objc_mutex_unlock (__objc_runtime_mutex);
+
+  return c;
+}
+
+
+retval_t
+objc_msg_sendv (id object, SEL op, arglist_t af)
+{
+  IMP imp;
+
+  imp = objc_msg_lookup (object, op);
+
+  /* Set the hidden self and _cmd arguments to object and op
+     respectively.  */
+  memcpy (af->args[0], &object, sizeof (id));
+  memcpy (af->args[1], &op, sizeof (SEL));
+
+  ffi_call (&af->closure->cif, (void (*)()) imp, af->ret, af->args);
+
+  return af->ret;
+}
+
+
+static void
+forwarder (ffi_cif *cif, void *ret, void **args, void *user)
+{
+  objc_closure_t *c = (objc_closure_t *) user;
+  id object;
+  SEL sel;
+  struct arglist a;
+
+  (void) cif;
+
+  a.closure = c;
+  a.ret = ret;
+  a.args = args;
+
+  memcpy (&object, args[0], sizeof (id));
+  memcpy (&sel, args[1], sizeof (SEL));
+
+  static SEL frwd_sel = 0;                      /* !T:SAFE2 */
+  SEL err_sel;
+
+  /* First see if the object responds to forward::.  */
+  if (!frwd_sel)
+    frwd_sel = sel_get_any_uid ("forward::");
+
+  if (__objc_responds_to (object, frwd_sel))
+    {
+      retval_t (*imp) (id, SEL, SEL, arglist_t);
+      imp = (retval_t (*)(id, SEL, SEL, arglist_t))
+	get_imp (object->class_pointer, frwd_sel);
+      (*imp) (object, frwd_sel, sel, &a);
+      return;
+    }
+
+  /* If the object doesn't respond to forward::, try doesNotRecognize:.  */
+  err_sel = sel_get_any_uid ("doesNotRecognize:");
+  if (__objc_responds_to (object, err_sel))
+    {
+      id (*imp) (id, SEL, SEL);
+      imp = (id (*) (id, SEL, SEL))
+	get_imp (object->class_pointer, err_sel);
+      (*imp) (object, err_sel, sel);
+      return;
+    }
+  
+  /* The object doesn't respond to forward:: or doesNotRecognize:.
+     Try error:. */
+  {
+    char msg[256 + strlen ((const char *) sel_get_name (sel))
+             + strlen ((const char *) object->class_pointer->name)];
+
+    sprintf (msg, "(%s) %s does not recognize %s",
+	     (CLS_ISMETA (object->class_pointer)
+	      ? "class"
+	      : "instance" ),
+             object->class_pointer->name, sel_get_name (sel));
+
+    err_sel = sel_get_any_uid ("error:");
+    if (__objc_responds_to (object, err_sel))
+      {
+	id (*imp) (id, SEL, const char *, ...);
+	imp = (id (*) (id, SEL, const char *, ...))
+	  get_imp (object->class_pointer, err_sel);
+	(*imp) (object, sel_get_any_uid ("error:"), msg);
+	return;
+      }
+
+    /* The object doesn't respond to doesNotRecognize: or error:.
+       Therefore, a default action is taken.  */
+    objc_error (object, OBJC_ERR_UNIMPLEMENTED, "%s\n", msg);
+    return;
+  }
+}
+
+
+IMP
+__objc_default_forward (SEL sel)
+{
+  const char *type;
+  objc_closure_t *c;
+
+  type = sel_get_type (sel);
+  if (!type)
+    {
+      /* If the selector doesn't have any type information, grab a random
+	 typed selector with the same name.  Hopefully, there'll only be
+	 on (or, if there are several, their types will be mostly
+	 compatible).  */
+      sel = sel_get_any_typed_uid (sel_get_name (sel));
+      type = sel_get_type (sel);
+      if (!type)
+	{
+	  /* Still no type info.  Assume return type id and no arguments.
+	     TODO: Could get the number of arguments from the selector
+	     name.  */
+	  type = "@0@0:0";
+	}
+    }
+  c = closure_for_type (type);
+  if (!c)
+    {
+      /* closure_for_type will already have called objc_error.  */
+      return NULL;
+    }
+
+  return (IMP)&c->closure;
+}
+
+
+/*
+  Return a pointer to the next argument of ARGFRAME.  type points to
+  the last argument.  Typical use of this look like:
+
+  {
+    char *datum, *type;
+    for (datum = method_get_first_argument (method, argframe, &type);
+         datum; datum = method_get_next_argument (argframe, &type))
+      {
+        unsigned flags = objc_get_type_qualifiers (type);
+        type = objc_skip_type_qualifiers (type);
+	if (*type != _C_PTR)
+          [portal encodeData: datum ofType: type];
+	else
+	  {
+	    if ((flags & _F_IN) == _F_IN)
+              [portal encodeData: *(char **) datum ofType: ++type];
+	  }
+      }
+  }
+*/
+
+char *
+method_get_next_argument (arglist_t argframe, const char **type)
+{
+  const char *t = objc_skip_argspec (*type);
+  int i;
+
+  if (*t == '\0')
+    return 0;
+
+  *type = t;
+
+  /* Pre-ffi code used the offset encoded in type to construct a pointer to
+     somewhere inside the stack frame (or buffer of saved register values).
+     This offset was encoded right after the typespec, so the type pointer
+     was all we needed to get the offset for the 'next' argument.
+
+     With ffi, we already have an array of pointers to all the arguments.
+     However, we don't know the index of the 'next' argument.  We can't store
+     it in type since callers expect it to point inside the encoded type
+     string.  We can't store it in argframe since there could, in theory,
+     be several simultaneous callers enumerating the arguments.  We don't
+     know where the encoded type string begins, so we can't just count
+     the number of arguments before the 'next' argument.
+
+     Fortunately, we know the number of arguments, and the type string is
+     nul-terminated.  Thus, we count the number of arguments _after_ the
+     'next' argument and calculate the index from that.  Yuck.  */
+  i = argframe->closure->cif.nargs;
+  while (*t)
+    {
+      t = objc_skip_argspec (t);
+      i--;
+    }
+
+  return argframe->args[i];
+}
+
+/*
+  Return a pointer to the value of the first argument of the method
+  described in M with the given argumentframe ARGFRAME.  The type
+  is returned in TYPE.  type must be passed to successive calls of
+  method_get_next_argument.
+*/
+char *
+method_get_first_argument (struct objc_method *m,
+			   arglist_t argframe,
+			   const char **type)
+{
+  *type = m->method_types;
+  return method_get_next_argument (argframe, type);
+}
+
+/*
+   Return a pointer to the ARGth argument of the method
+   M from the frame ARGFRAME.  The type of the argument
+   is returned in the value-result argument TYPE
+*/
+
+char *
+method_get_nth_argument (struct objc_method *m,
+			 arglist_t argframe, int arg,
+			 const char **type)
+{
+  const char *t = objc_skip_argspec (m->method_types);
+  int i;
+
+  if ((unsigned) arg >= argframe->closure->cif.nargs)
+    return 0;
+
+  i = arg;
+  while (i--)
+    t = objc_skip_argspec (t);
+
+  *type = t;
+  return argframe->args[arg];
+}
+
Index: libobjc/init.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/init.c,v
retrieving revision 1.9
diff -u -r1.9 init.c
--- libobjc/init.c	23 May 2003 20:25:39 -0000	1.9
+++ libobjc/init.c	12 Dec 2004 00:09:47 -0000
@@ -537,6 +537,7 @@
       __objc_init_selector_tables ();
       __objc_init_class_tables ();
       __objc_init_dispatch_tables ();
+      __objc_init_forwarding ();
       __objc_class_tree_list = list_cons (NULL, __objc_class_tree_list);
       __objc_load_methods
 	  = hash_new (128, (hash_func_type)hash_ptr, compare_ptrs);
Index: libobjc/sendmsg.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/sendmsg.c,v
retrieving revision 1.13
diff -u -r1.13 sendmsg.c
--- libobjc/sendmsg.c	25 May 2004 19:10:52 -0000	1.13
+++ libobjc/sendmsg.c	12 Dec 2004 00:09:48 -0000
@@ -25,37 +25,22 @@
    however invalidate any other reasons why the executable file might be
    covered by the GNU General Public License.  */
 
-/* FIXME: This file has no business including tm.h.  */
-/* FIXME: This should be using libffi instead of __builtin_apply
-   and friends.  */
-
 #include "tconfig.h"
-#include "coretypes.h"
-#include "tm.h"
 #include "runtime.h"
 #include "sarray.h"
 #include "encoding.h"
 #include "runtime-info.h"
 
-/* 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
-#define INVISIBLE_STRUCT_RETURN 1
-#else
-#define INVISIBLE_STRUCT_RETURN 0
-#endif
 
 /* 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;
+IMP __objc_default_forward (SEL sel);
+
+/* Hook for method forwarding.  If it is set, it is invoked to return
+   a function that performs the real forwarding.  Otherwise the libffi
+   based functions are used.  */
+IMP (*__objc_msg_forward) (SEL) = __objc_default_forward;
 
 /* Send +initialize to class */
 static void __objc_send_initialize (Class);
@@ -65,21 +50,6 @@
 /* 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 
-static __big 
-#else
-static id
-#endif
-__objc_block_forward (id, SEL, ...);
 static Method_t search_for_method_in_hierarchy (Class class, SEL sel);
 Method_t search_for_method_in_list (MethodList_t list, SEL op);
 id nil_method (id, SEL);
@@ -98,22 +68,8 @@
         return result;
     }
 
-  /* In all other cases, use the default forwarding functions built using
-   * __builtin_apply and friends.  */
-    {
-      const char *t = sel->sel_types;
-
-      if (t && (*t == '[' || *t == '(' || *t == '{')
-#ifdef 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;
-    }
+  objc_error (nil, OBJC_ERR_FORWARDING, "forwarding callback isn't set\n");
+  return NULL;
 }
 
 /* Given a class and selector, return the selector's implementation.  */
@@ -256,20 +212,6 @@
     return (IMP)nil_method;
 }
 
-int method_get_sizeof_arguments (Method *);
-
-retval_t
-objc_msg_sendv (id object, SEL op, arglist_t arg_frame)
-{
-  Method *m = class_get_instance_method (object->class_pointer, op);
-  const char *type;
-  *((id *) method_get_first_argument (m, arg_frame, &type)) = object;
-  *((SEL *) method_get_next_argument (arg_frame, &type)) = op;
-  return __builtin_apply ((apply_t) m->method_imp, 
-			  arg_frame,
-			  method_get_sizeof_arguments (m));
-}
-
 void
 __objc_init_dispatch_tables ()
 {
@@ -552,114 +494,6 @@
   return NULL;
 }
 
-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, ...)
-{
-  void *args, *res;
-
-  args = __builtin_apply_args ();
-  res = __objc_forward (rcv, op, args);
-  if (res)
-    __builtin_return (res);
-  else
-    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
-static id
-#endif
-__objc_block_forward (id rcv, SEL op, ...)
-{
-  void *args, *res;
-
-  args = __builtin_apply_args ();
-  res = __objc_forward (rcv, op, args);
-  if (res)
-    __builtin_return (res);
-  else
-#if INVISIBLE_STRUCT_RETURN
-    return (__big) {{0, 0, 0, 0, 0, 0, 0, 0}};
-#else
-    return nil;
-#endif
-}
-
-
-/* This function is installed in the dispatch table for all methods which are
-   not implemented.  Thus, it is called when a selector is not recognized. */
-static retval_t
-__objc_forward (id object, SEL sel, arglist_t args)
-{
-  IMP imp;
-  static SEL frwd_sel = 0;                      /* !T:SAFE2 */
-  SEL err_sel;
-
-  /* first try if the object understands forward:: */
-  if (! frwd_sel)
-    frwd_sel = sel_get_any_uid ("forward::");
-
-  if (__objc_responds_to (object, frwd_sel))
-    {
-      imp = get_imp (object->class_pointer, frwd_sel);
-      return (*imp) (object, frwd_sel, sel, args);
-    }
-
-  /* If the object recognizes the doesNotRecognize: method then we're going
-     to send it. */
-  err_sel = sel_get_any_uid ("doesNotRecognize:");
-  if (__objc_responds_to (object, err_sel))
-    {
-      imp = get_imp (object->class_pointer, err_sel);
-      return (*imp) (object, err_sel, sel);
-    }
-  
-  /* The object doesn't recognize the method.  Check for responding to
-     error:.  If it does then sent it. */
-  {
-    char msg[256 + strlen ((const char *) sel_get_name (sel))
-             + strlen ((const char *) object->class_pointer->name)];
-
-    sprintf (msg, "(%s) %s does not recognize %s",
-	     (CLS_ISMETA (object->class_pointer)
-	      ? "class"
-	      : "instance" ),
-             object->class_pointer->name, sel_get_name (sel));
-
-    err_sel = sel_get_any_uid ("error:");
-    if (__objc_responds_to (object, err_sel))
-      {
-	imp = get_imp (object->class_pointer, err_sel);
-	return (*imp) (object, sel_get_any_uid ("error:"), msg);
-      }
-
-    /* The object doesn't respond to doesNotRecognize: or error:;  Therefore,
-       a default action is taken. */
-    objc_error (object, OBJC_ERR_UNIMPLEMENTED, "%s\n", msg);
-
-    return 0;
-  }
-}
-
 void
 __objc_print_dtable_stats ()
 {
Index: libobjc/objc/objc-api.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/objc/objc-api.h,v
retrieving revision 1.12
diff -u -r1.12 objc-api.h
--- libobjc/objc/objc-api.h	13 Aug 2004 22:23:58 -0000	1.12
+++ libobjc/objc/objc-api.h	12 Dec 2004 00:09:48 -0000
@@ -137,6 +137,8 @@
 
 #define OBJC_ERR_BAD_STATE 40          /* Bad thread state */
 
+#define OBJC_ERR_FORWARDING 50         /* Forwarding failed */
+
 /*
 ** Set this variable nonzero to print a line describing each
 ** message that is sent.  (this is currently disabled)
@@ -429,9 +431,8 @@
 objc_EXPORT void (*_objc_free)(void *);
 
 /*
-**  Hook for method forwarding. This makes it easy to substitute a
-**  library, such as ffcall, that implements closures, thereby avoiding
-**  gcc's __builtin_apply problems.
+**  Hook for method forwarding.  This makes it easy to substitute a
+**  library, such as ffcall, that implements closures.
 */
 objc_EXPORT IMP (*__objc_msg_forward)(SEL);
 
Index: libobjc/objc/objc.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/objc/objc.h,v
retrieving revision 1.5
diff -u -r1.5 objc.h
--- libobjc/objc/objc.h	13 Aug 2004 02:06:37 -0000	1.5
+++ libobjc/objc/objc.h	12 Dec 2004 00:09:48 -0000
@@ -148,12 +148,8 @@
 @class Protocol;
 #endif 
 
-typedef void* retval_t;		/* return value */
-typedef void(*apply_t)(void);	/* function pointer */
-typedef union arglist {
-  char *arg_ptr;
-  char arg_regs[sizeof (char*)];
-} *arglist_t;			/* argument frame */
+typedef void *retval_t;		/* return value */
+typedef struct arglist *arglist_t;		/* argument frame */
 
 
 IMP objc_msg_lookup(id receiver, SEL op);
Index: libobjc/objc/runtime.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/objc/runtime.h,v
retrieving revision 1.8
diff -u -r1.8 runtime.h
--- libobjc/objc/runtime.h	13 Aug 2004 22:23:58 -0000	1.8
+++ libobjc/objc/runtime.h	12 Dec 2004 00:09:48 -0000
@@ -50,6 +50,7 @@
 extern void __objc_init_selector_tables(void); /* (objc-sel.c) */
 extern void __objc_init_class_tables(void);    /* (objc-class.c) */
 extern void __objc_init_dispatch_tables(void); /* (objc-dispatch.c) */
+extern void __objc_init_forwarding(void);      /* (forwarding.c) */
 extern void __objc_install_premature_dtable(Class); /* (objc-dispatch.c) */
 extern void __objc_resolve_class_links(void);  /* (objc-class.c) */
 extern void __objc_register_selectors_from_class(Class); /* (objc-sel.c) */

Attachment: forwarding.tar.gz
Description: application/gunzip

Running /usr/local/src/gcc/cvs/gcc/gcc/testsuite/objc.dg/forwarding/forwarding.exp ...
PASS: objc.dg/forwarding/a2_array-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_array-1.m execution test
PASS: objc.dg/forwarding/a2_char.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_char.m execution test
PASS: objc.dg/forwarding/a2_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_double-1.m execution test
PASS: objc.dg/forwarding/a2_float-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_float-1.m execution test
PASS: objc.dg/forwarding/a2_int-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_int-1.m execution test
PASS: objc.dg/forwarding/a2_int-2.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_int-2.m execution test
PASS: objc.dg/forwarding/a2_long_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_double-1.m execution test
PASS: objc.dg/forwarding/a2_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_int.m execution test
PASS: objc.dg/forwarding/a2_long_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_long_int.m execution test
PASS: objc.dg/forwarding/a2_short.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_short.m execution test
PASS: objc.dg/forwarding/a2_struct-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-1.m execution test
PASS: objc.dg/forwarding/a2_struct-2.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-2.m execution test
PASS: objc.dg/forwarding/a2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-3.m execution test
PASS: objc.dg/forwarding/a2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-4.m execution test
PASS: objc.dg/forwarding/a2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_union-1.m execution test
PASS: objc.dg/forwarding/a_array-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_array-1.m execution test
PASS: objc.dg/forwarding/a_char.m (test for excess errors)
PASS: objc.dg/forwarding/a_char.m execution test
PASS: objc.dg/forwarding/a_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_double-1.m execution test
PASS: objc.dg/forwarding/a_float-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_float-1.m execution test
PASS: objc.dg/forwarding/a_int-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-1.m execution test
PASS: objc.dg/forwarding/a_int-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-2.m execution test
PASS: objc.dg/forwarding/a_long_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_double-1.m execution test
PASS: objc.dg/forwarding/a_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_int.m execution test
PASS: objc.dg/forwarding/a_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_long_int.m execution test
PASS: objc.dg/forwarding/a_short.m (test for excess errors)
PASS: objc.dg/forwarding/a_short.m execution test
PASS: objc.dg/forwarding/a_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-1.m execution test
PASS: objc.dg/forwarding/a_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-2.m execution test
PASS: objc.dg/forwarding/a_struct-3.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-3.m execution test
PASS: objc.dg/forwarding/a_struct-4.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-4.m execution test
PASS: objc.dg/forwarding/a_union-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_union-1.m execution test
PASS: objc.dg/forwarding/get_arg-1.m (test for excess errors)
FAIL: objc.dg/forwarding/get_arg-1.m execution test
PASS: objc.dg/forwarding/get_arg-2.m (test for excess errors)
FAIL: objc.dg/forwarding/get_arg-2.m execution test
PASS: objc.dg/forwarding/leak-1.m (test for excess errors)
PASS: objc.dg/forwarding/leak-1.m execution test
PASS: objc.dg/forwarding/missing_type-1.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-1.m execution test
PASS: objc.dg/forwarding/missing_type-2.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-2.m execution test
PASS: objc.dg/forwarding/missing_type-3.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-3.m execution test
PASS: objc.dg/forwarding/r2_char.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_char.m execution test
PASS: objc.dg/forwarding/r2_double.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_double.m execution test
PASS: objc.dg/forwarding/r2_float.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_float.m execution test
PASS: objc.dg/forwarding/r2_id-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_id-1.m execution test
PASS: objc.dg/forwarding/r2_id-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_id-2.m execution test
PASS: objc.dg/forwarding/r2_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_int.m execution test
PASS: objc.dg/forwarding/r2_long_double.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_double.m execution test
PASS: objc.dg/forwarding/r2_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_int.m execution test
PASS: objc.dg/forwarding/r2_long_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_long_int.m execution test
PASS: objc.dg/forwarding/r2_ptr-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-2.m execution test
PASS: objc.dg/forwarding/r2_ptr-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-3.m execution test
PASS: objc.dg/forwarding/r2_ptr-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-4.m execution test
PASS: objc.dg/forwarding/r2_ptr.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr.m execution test
PASS: objc.dg/forwarding/r2_short.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_short.m execution test
PASS: objc.dg/forwarding/r2_struct-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-1.m execution test
PASS: objc.dg/forwarding/r2_struct-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-2.m execution test
PASS: objc.dg/forwarding/r2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-3.m execution test
PASS: objc.dg/forwarding/r2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-4.m execution test
PASS: objc.dg/forwarding/r2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_union-1.m execution test
PASS: objc.dg/forwarding/r2_void.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_void.m execution test
PASS: objc.dg/forwarding/r_char.m (test for excess errors)
PASS: objc.dg/forwarding/r_char.m execution test
PASS: objc.dg/forwarding/r_double.m (test for excess errors)
PASS: objc.dg/forwarding/r_double.m execution test
PASS: objc.dg/forwarding/r_float.m (test for excess errors)
PASS: objc.dg/forwarding/r_float.m execution test
PASS: objc.dg/forwarding/r_id-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-1.m execution test
PASS: objc.dg/forwarding/r_id-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-2.m execution test
PASS: objc.dg/forwarding/r_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_int.m execution test
PASS: objc.dg/forwarding/r_long_double.m (test for excess errors)
FAIL: objc.dg/forwarding/r_long_double.m execution test
PASS: objc.dg/forwarding/r_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_int.m execution test
PASS: objc.dg/forwarding/r_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_long_int.m execution test
PASS: objc.dg/forwarding/r_ptr-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-2.m execution test
PASS: objc.dg/forwarding/r_ptr-3.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-3.m execution test
PASS: objc.dg/forwarding/r_ptr-4.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-4.m execution test
PASS: objc.dg/forwarding/r_ptr.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr.m execution test
PASS: objc.dg/forwarding/r_short.m (test for excess errors)
PASS: objc.dg/forwarding/r_short.m execution test
PASS: objc.dg/forwarding/r_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-1.m execution test
PASS: objc.dg/forwarding/r_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-2.m execution test
PASS: objc.dg/forwarding/r_struct-3.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-3.m execution test
PASS: objc.dg/forwarding/r_struct-4.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-4.m execution test
PASS: objc.dg/forwarding/r_union-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_union-1.m execution test
PASS: objc.dg/forwarding/r_void.m (test for excess errors)
PASS: objc.dg/forwarding/r_void.m execution test
Running /usr/local/src/gcc/clean-cvs/gcc/testsuite/objc.dg/forwarding/forwarding.exp ...
FAIL: objc.dg/forwarding/a2_array-1.m (test for excess errors)
WARNING: objc.dg/forwarding/a2_array-1.m compilation failed to produce executable
PASS: objc.dg/forwarding/a2_char.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_char.m execution test
PASS: objc.dg/forwarding/a2_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_double-1.m execution test
PASS: objc.dg/forwarding/a2_float-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_float-1.m execution test
PASS: objc.dg/forwarding/a2_int-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_int-1.m execution test
PASS: objc.dg/forwarding/a2_int-2.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_int-2.m execution test
PASS: objc.dg/forwarding/a2_long_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_double-1.m execution test
PASS: objc.dg/forwarding/a2_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_int.m execution test
PASS: objc.dg/forwarding/a2_long_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_long_int.m execution test
PASS: objc.dg/forwarding/a2_short.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_short.m execution test
PASS: objc.dg/forwarding/a2_struct-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-1.m execution test
PASS: objc.dg/forwarding/a2_struct-2.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-2.m execution test
PASS: objc.dg/forwarding/a2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-3.m execution test
PASS: objc.dg/forwarding/a2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-4.m execution test
PASS: objc.dg/forwarding/a2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_union-1.m execution test
FAIL: objc.dg/forwarding/a_array-1.m (test for excess errors)
WARNING: objc.dg/forwarding/a_array-1.m compilation failed to produce executable
PASS: objc.dg/forwarding/a_char.m (test for excess errors)
PASS: objc.dg/forwarding/a_char.m execution test
PASS: objc.dg/forwarding/a_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_double-1.m execution test
PASS: objc.dg/forwarding/a_float-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_float-1.m execution test
PASS: objc.dg/forwarding/a_int-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-1.m execution test
PASS: objc.dg/forwarding/a_int-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-2.m execution test
PASS: objc.dg/forwarding/a_long_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_double-1.m execution test
PASS: objc.dg/forwarding/a_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_int.m execution test
PASS: objc.dg/forwarding/a_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_long_int.m execution test
PASS: objc.dg/forwarding/a_short.m (test for excess errors)
PASS: objc.dg/forwarding/a_short.m execution test
PASS: objc.dg/forwarding/a_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-1.m execution test
PASS: objc.dg/forwarding/a_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-2.m execution test
PASS: objc.dg/forwarding/a_struct-3.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-3.m execution test
PASS: objc.dg/forwarding/a_struct-4.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-4.m execution test
PASS: objc.dg/forwarding/a_union-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_union-1.m execution test
PASS: objc.dg/forwarding/get_arg-1.m (test for excess errors)
FAIL: objc.dg/forwarding/get_arg-1.m execution test
PASS: objc.dg/forwarding/get_arg-2.m (test for excess errors)
FAIL: objc.dg/forwarding/get_arg-2.m execution test
PASS: objc.dg/forwarding/leak-1.m (test for excess errors)
PASS: objc.dg/forwarding/leak-1.m execution test
PASS: objc.dg/forwarding/missing_type-1.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-1.m execution test
PASS: objc.dg/forwarding/missing_type-2.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-2.m execution test
PASS: objc.dg/forwarding/missing_type-3.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-3.m execution test
PASS: objc.dg/forwarding/r2_char.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_char.m execution test
PASS: objc.dg/forwarding/r2_double.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_double.m execution test
PASS: objc.dg/forwarding/r2_float.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_float.m execution test
PASS: objc.dg/forwarding/r2_id-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_id-1.m execution test
PASS: objc.dg/forwarding/r2_id-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_id-2.m execution test
PASS: objc.dg/forwarding/r2_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_int.m execution test
PASS: objc.dg/forwarding/r2_long_double.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_double.m execution test
PASS: objc.dg/forwarding/r2_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_int.m execution test
PASS: objc.dg/forwarding/r2_long_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_long_long_int.m execution test
PASS: objc.dg/forwarding/r2_ptr-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-2.m execution test
PASS: objc.dg/forwarding/r2_ptr-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-3.m execution test
PASS: objc.dg/forwarding/r2_ptr-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr-4.m execution test
PASS: objc.dg/forwarding/r2_ptr.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_ptr.m execution test
PASS: objc.dg/forwarding/r2_short.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_short.m execution test
PASS: objc.dg/forwarding/r2_struct-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-1.m execution test
PASS: objc.dg/forwarding/r2_struct-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-2.m execution test
PASS: objc.dg/forwarding/r2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-3.m execution test
PASS: objc.dg/forwarding/r2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-4.m execution test
PASS: objc.dg/forwarding/r2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_union-1.m execution test
PASS: objc.dg/forwarding/r2_void.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_void.m execution test
PASS: objc.dg/forwarding/r_char.m (test for excess errors)
PASS: objc.dg/forwarding/r_char.m execution test
PASS: objc.dg/forwarding/r_double.m (test for excess errors)
PASS: objc.dg/forwarding/r_double.m execution test
PASS: objc.dg/forwarding/r_float.m (test for excess errors)
PASS: objc.dg/forwarding/r_float.m execution test
PASS: objc.dg/forwarding/r_id-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-1.m execution test
PASS: objc.dg/forwarding/r_id-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-2.m execution test
PASS: objc.dg/forwarding/r_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_int.m execution test
PASS: objc.dg/forwarding/r_long_double.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_double.m execution test
PASS: objc.dg/forwarding/r_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_int.m execution test
PASS: objc.dg/forwarding/r_long_long_int.m (test for excess errors)
FAIL: objc.dg/forwarding/r_long_long_int.m execution test
PASS: objc.dg/forwarding/r_ptr-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-2.m execution test
PASS: objc.dg/forwarding/r_ptr-3.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-3.m execution test
PASS: objc.dg/forwarding/r_ptr-4.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-4.m execution test
PASS: objc.dg/forwarding/r_ptr.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr.m execution test
PASS: objc.dg/forwarding/r_short.m (test for excess errors)
PASS: objc.dg/forwarding/r_short.m execution test
PASS: objc.dg/forwarding/r_struct-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-1.m execution test
PASS: objc.dg/forwarding/r_struct-2.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-2.m execution test
PASS: objc.dg/forwarding/r_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-3.m execution test
PASS: objc.dg/forwarding/r_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-4.m execution test
PASS: objc.dg/forwarding/r_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r_union-1.m execution test
PASS: objc.dg/forwarding/r_void.m (test for excess errors)
PASS: objc.dg/forwarding/r_void.m execution test
Running /usr/local/src/gcc/clean-cvs/gcc/testsuite/objc.dg/forwarding/forwarding.exp ...
FAIL: objc.dg/forwarding/a2_array-1.m (test for excess errors)
WARNING: objc.dg/forwarding/a2_array-1.m compilation failed to produce executable
PASS: objc.dg/forwarding/a2_char.m (test for excess errors)
PASS: objc.dg/forwarding/a2_char.m execution test
PASS: objc.dg/forwarding/a2_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a2_double-1.m execution test
PASS: objc.dg/forwarding/a2_float-1.m (test for excess errors)
PASS: objc.dg/forwarding/a2_float-1.m execution test
PASS: objc.dg/forwarding/a2_int-1.m (test for excess errors)
PASS: objc.dg/forwarding/a2_int-1.m execution test
PASS: objc.dg/forwarding/a2_int-2.m (test for excess errors)
PASS: objc.dg/forwarding/a2_int-2.m execution test
PASS: objc.dg/forwarding/a2_long_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_long_double-1.m execution test
PASS: objc.dg/forwarding/a2_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a2_long_int.m execution test
PASS: objc.dg/forwarding/a2_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a2_long_long_int.m execution test
PASS: objc.dg/forwarding/a2_short.m (test for excess errors)
PASS: objc.dg/forwarding/a2_short.m execution test
PASS: objc.dg/forwarding/a2_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/a2_struct-1.m execution test
PASS: objc.dg/forwarding/a2_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/a2_struct-2.m execution test
PASS: objc.dg/forwarding/a2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-3.m execution test
PASS: objc.dg/forwarding/a2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_struct-4.m execution test
PASS: objc.dg/forwarding/a2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a2_union-1.m execution test
FAIL: objc.dg/forwarding/a_array-1.m (test for excess errors)
WARNING: objc.dg/forwarding/a_array-1.m compilation failed to produce executable
PASS: objc.dg/forwarding/a_char.m (test for excess errors)
PASS: objc.dg/forwarding/a_char.m execution test
PASS: objc.dg/forwarding/a_double-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_double-1.m execution test
PASS: objc.dg/forwarding/a_float-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_float-1.m execution test
PASS: objc.dg/forwarding/a_int-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-1.m execution test
PASS: objc.dg/forwarding/a_int-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_int-2.m execution test
PASS: objc.dg/forwarding/a_long_double-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a_long_double-1.m execution test
PASS: objc.dg/forwarding/a_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_int.m execution test
PASS: objc.dg/forwarding/a_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/a_long_long_int.m execution test
PASS: objc.dg/forwarding/a_short.m (test for excess errors)
PASS: objc.dg/forwarding/a_short.m execution test
PASS: objc.dg/forwarding/a_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-1.m execution test
PASS: objc.dg/forwarding/a_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/a_struct-2.m execution test
PASS: objc.dg/forwarding/a_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/a_struct-3.m execution test
PASS: objc.dg/forwarding/a_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/a_struct-4.m execution test
PASS: objc.dg/forwarding/a_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/a_union-1.m execution test
PASS: objc.dg/forwarding/get_arg-1.m (test for excess errors)
PASS: objc.dg/forwarding/get_arg-1.m execution test
PASS: objc.dg/forwarding/get_arg-2.m (test for excess errors)
PASS: objc.dg/forwarding/get_arg-2.m execution test
PASS: objc.dg/forwarding/leak-1.m (test for excess errors)
PASS: objc.dg/forwarding/leak-1.m execution test
PASS: objc.dg/forwarding/missing_type-1.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-1.m execution test
PASS: objc.dg/forwarding/missing_type-2.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-2.m execution test
PASS: objc.dg/forwarding/missing_type-3.m (test for excess errors)
PASS: objc.dg/forwarding/missing_type-3.m execution test
PASS: objc.dg/forwarding/r2_char.m (test for excess errors)
PASS: objc.dg/forwarding/r2_char.m execution test
PASS: objc.dg/forwarding/r2_double.m (test for excess errors)
PASS: objc.dg/forwarding/r2_double.m execution test
PASS: objc.dg/forwarding/r2_float.m (test for excess errors)
PASS: objc.dg/forwarding/r2_float.m execution test
PASS: objc.dg/forwarding/r2_id-1.m (test for excess errors)
PASS: objc.dg/forwarding/r2_id-1.m execution test
PASS: objc.dg/forwarding/r2_id-2.m (test for excess errors)
PASS: objc.dg/forwarding/r2_id-2.m execution test
PASS: objc.dg/forwarding/r2_int.m (test for excess errors)
PASS: objc.dg/forwarding/r2_int.m execution test
PASS: objc.dg/forwarding/r2_long_double.m (test for excess errors)
PASS: objc.dg/forwarding/r2_long_double.m execution test
PASS: objc.dg/forwarding/r2_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r2_long_int.m execution test
PASS: objc.dg/forwarding/r2_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r2_long_long_int.m execution test
PASS: objc.dg/forwarding/r2_ptr-2.m (test for excess errors)
PASS: objc.dg/forwarding/r2_ptr-2.m execution test
PASS: objc.dg/forwarding/r2_ptr-3.m (test for excess errors)
PASS: objc.dg/forwarding/r2_ptr-3.m execution test
PASS: objc.dg/forwarding/r2_ptr-4.m (test for excess errors)
PASS: objc.dg/forwarding/r2_ptr-4.m execution test
PASS: objc.dg/forwarding/r2_ptr.m (test for excess errors)
PASS: objc.dg/forwarding/r2_ptr.m execution test
PASS: objc.dg/forwarding/r2_short.m (test for excess errors)
PASS: objc.dg/forwarding/r2_short.m execution test
PASS: objc.dg/forwarding/r2_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/r2_struct-1.m execution test
PASS: objc.dg/forwarding/r2_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/r2_struct-2.m execution test
PASS: objc.dg/forwarding/r2_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-3.m execution test
PASS: objc.dg/forwarding/r2_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_struct-4.m execution test
PASS: objc.dg/forwarding/r2_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r2_union-1.m execution test
PASS: objc.dg/forwarding/r2_void.m (test for excess errors)
PASS: objc.dg/forwarding/r2_void.m execution test
PASS: objc.dg/forwarding/r_char.m (test for excess errors)
PASS: objc.dg/forwarding/r_char.m execution test
PASS: objc.dg/forwarding/r_double.m (test for excess errors)
PASS: objc.dg/forwarding/r_double.m execution test
PASS: objc.dg/forwarding/r_float.m (test for excess errors)
PASS: objc.dg/forwarding/r_float.m execution test
PASS: objc.dg/forwarding/r_id-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-1.m execution test
PASS: objc.dg/forwarding/r_id-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_id-2.m execution test
PASS: objc.dg/forwarding/r_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_int.m execution test
PASS: objc.dg/forwarding/r_long_double.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_double.m execution test
PASS: objc.dg/forwarding/r_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_int.m execution test
PASS: objc.dg/forwarding/r_long_long_int.m (test for excess errors)
PASS: objc.dg/forwarding/r_long_long_int.m execution test
PASS: objc.dg/forwarding/r_ptr-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-2.m execution test
PASS: objc.dg/forwarding/r_ptr-3.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-3.m execution test
PASS: objc.dg/forwarding/r_ptr-4.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr-4.m execution test
PASS: objc.dg/forwarding/r_ptr.m (test for excess errors)
PASS: objc.dg/forwarding/r_ptr.m execution test
PASS: objc.dg/forwarding/r_short.m (test for excess errors)
PASS: objc.dg/forwarding/r_short.m execution test
PASS: objc.dg/forwarding/r_struct-1.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-1.m execution test
PASS: objc.dg/forwarding/r_struct-2.m (test for excess errors)
PASS: objc.dg/forwarding/r_struct-2.m execution test
PASS: objc.dg/forwarding/r_struct-3.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-3.m execution test
PASS: objc.dg/forwarding/r_struct-4.m (test for excess errors)
FAIL: objc.dg/forwarding/r_struct-4.m execution test
PASS: objc.dg/forwarding/r_union-1.m (test for excess errors)
FAIL: objc.dg/forwarding/r_union-1.m execution test
PASS: objc.dg/forwarding/r_void.m (test for excess errors)
PASS: objc.dg/forwarding/r_void.m execution test

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]