summaryrefslogtreecommitdiff
path: root/patches/gcc/3.2.3
diff options
context:
space:
mode:
Diffstat (limited to 'patches/gcc/3.2.3')
-rw-r--r--patches/gcc/3.2.3/README-mips1648
-rw-r--r--patches/gcc/3.2.3/README-sh16
-rw-r--r--patches/gcc/3.2.3/config.sub.patch72
-rw-r--r--patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch105
-rw-r--r--patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch1761
-rw-r--r--patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch98
-rw-r--r--patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch6864
-rw-r--r--patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch54
-rw-r--r--patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch45
-rw-r--r--patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch54
-rw-r--r--patches/gcc/3.2.3/gcc-sh-linux.spec739
11 files changed, 11456 insertions, 0 deletions
diff --git a/patches/gcc/3.2.3/README-mips b/patches/gcc/3.2.3/README-mips
new file mode 100644
index 0000000..170b21d
--- /dev/null
+++ b/patches/gcc/3.2.3/README-mips
@@ -0,0 +1,1648 @@
+See also http://www.spinics.net/lists/mips/msg12236.html
+
+ftp://ftp.linux-mips.org/pub/linux/mips/redhat/7.3/test/SRPMS/gcc-3.2-7.1.src.rpm
+contains the following patches and spec file.
+You may wish to investigate some of these patches; I haven't.
+I think this is mostly the Red Hat 8.0 srpm for a prerelease gcc-3.2, plus a couple
+mips specific fixes, but you'd have to ask H.J.Lu or compare with the regular
+Red Hat 8.0 srpm to find out.
+In any case, the spec file is interesting reading.
+- Dan K.
+
+total 1164
+ 4 boehm-gc-LINUX.patch
+ 4 boehm-gc-mips.patch
+ 4 contrib-touch.patch
+ 8 gcc-arch.patch
+ 4 gcc-c++-template.patch
+ 4 gcc-copy.patch
+ 4 gcc-cross-bfd.patch
+ 4 gcc-cross.patch
+ 4 gcc-gcj-cross.patch
+ 4 gcc-libffi-mips.patch
+ 4 gcc-libgcc.patch
+ 480 gcc-libstdc++-glibc-2.2.patch
+ 4 gcc-libstdc++-mips.patch
+ 4 gcc-linux-atexit.patch
+ 8 gcc-linux-crt.patch
+ 4 gcc-mips-coff.patch
+ 4 gcc-mips-file.patch
+ 4 gcc-mips-ieee.patch
+ 4 gcc-mips-return.patch
+ 4 gcc-ppc-linux.patch
+ 8 gcc-sizeof.patch
+ 4 gcc-test-atexit.patch
+ 4 gcc-testsuite-c++.patch
+ 4 gcc-var.patch
+ 8 gcc32-2.96-RH-compat.patch
+ 4 gcc32-ada-addr2line.patch
+ 8 gcc32-ada-link.patch
+ 12 gcc32-attr-visibility.patch
+ 4 gcc32-attr-visibility2.patch
+ 4 gcc32-attr-visibility3.patch
+ 4 gcc32-attr-visibility4.patch
+ 4 gcc32-attr-visibility5.patch
+ 8 gcc32-boehm-gc-libs.patch
+ 4 gcc32-bogus-inline.patch
+ 4 gcc32-c++-nrv-test.patch
+ 4 gcc32-c++-pretty_function.patch
+ 16 gcc32-c++-tail-pad-backout.patch
+ 4 gcc32-c++-tsubst-asm.patch
+ 4 gcc32-cfg-eh.patch
+ 4 gcc32-debug-pr7241.patch
+ 4 gcc32-doc-gcov.patch
+ 4 gcc32-duplicate-decl.patch
+ 4 gcc32-dwarf2-pr6381.patch
+ 4 gcc32-dwarf2-pr6436-test.patch
+ 4 gcc32-fde-merge-compat.patch
+ 4 gcc32-fold-const-associate.patch
+ 4 gcc32-fold-const2.patch
+ 24 gcc32-hard-reg-sharing.patch
+ 4 gcc32-hard-reg-sharing2.patch
+ 4 gcc32-i386-default-momit-leaf-frame-pointer.patch
+ 4 gcc32-i386-memtest-test.patch
+ 4 gcc32-i386-no-default-momit-leaf-frame-pointer.patch
+ 4 gcc32-i386-pic-label-thunk.patch
+ 4 gcc32-i386-pr7242.patch
+ 4 gcc32-i386-profile-olfp.patch
+ 4 gcc32-inline-label.patch
+ 4 gcc32-interface_only.patch
+ 4 gcc32-java-no-rpath.patch
+ 20 gcc32-libstdc++-glibc23-1.patch
+ 4 gcc32-libstdc++-glibc23-2.patch
+ 4 gcc32-libstdc++-glibc23-3.patch
+ 4 gcc32-libstdc++-glibc23-4.patch
+ 4 gcc32-loop-prefetch.patch
+ 4 gcc32-pr6842.patch
+ 8 gcc32-rh69989.patch
+ 40 gcc32-s390-java.patch
+ 4 gcc32-sparc-sll1.patch
+ 4 gcc32-test-rh65771.patch
+ 8 gcc32-test-rotate.patch
+ 12 gcc32-tls-dwarf2.patch
+ 140 gcc32-tls.patch
+ 4 gcc32-tls2.patch
+ 4 gcc32-tls3.patch
+ 4 gcc32-tls4.patch
+ 4 gcc32-tls5.patch
+ 24 gcc32-tree-code.patch
+ 4 gcc32-trunc_int_for_mode.patch
+ 4 gcc32-typeof-asm.patch
+ 4 gcc32-x86_64-libiberty-pic.patch
+ 4 gcc32-x86_64-pr7559.patch
+ 4 gcc32-x86_64-q_regs_operand.patch
+ 4 gcc32-x86_64-rip-lowercase.patch
+ 4 libjava-cross.patch
+ 4 libtool-libs.patch
+ 4 libtool-mips.patch
+
+---------- gcc32.spec ---------
+
+%if %{_arch} != %{_build_arch}
+%define cross_compile 1
+%else
+%define cross_compile 0
+%endif
+%{?_with_crosscompile: %{expand: %%define cross_compile 1}}
+
+%if %{cross_compile}
+%define make_check 0
+%else
+%define make_check 1
+%endif
+%{?_without_check: %{expand: %%define make_check 0}}
+%{?_with_check: %{expand: %%define make_check 1}}
+
+%define default 0
+%{?_with_default: %{expand: %%define default 1}}
+
+%define gcconly 0
+%{?_with_gcconly: %{expand: %%define gcconly 1}}
+
+%define DATE 20020903
+%define gcc_version 3.2
+%define gcc_release 7.1
+%ifarch %{ix86} alpha ia64 ppc
+%define build_ada 1
+%else
+%define build_ada 0
+%endif
+%{?_without_ada: %{expand: %%define build_ada 0}}
+%if %{cross_compile}
+%define build_ada 0
+%endif
+Summary: Various compilers (C, C++, Objective-C, Java, ...)
+%if !%{gcconly}
+Name: gcc
+Version: 3.2
+Release: %{gcc_release}
+%else
+Name: gcc-%{gcc_version}
+Version: %{gcc_release}
+Release: 1
+%endif
+Copyright: GPL
+Group: Development/Languages
+Source0: gcc-%{version}-%{DATE}.tar.bz2
+URL: http://gcc.gnu.org
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+BuildRequires: binutils >= 2.12.90.0.9-1
+BuildRequires: zlib-devel, gettext, dejagnu
+# Make sure pthread.h doesn't contain __thread tokens
+BuildRequires: glibc-devel >= 2.2.5-36.2
+%if %{build_ada}
+# Ada requires Ada to build
+BuildRequires: gcc-gnat >= 3.1, libgnat >= 3.1
+%endif
+Requires: cpp = %{version}-%{release}
+# Need .eh_frame ld optimizations
+# Need proper visibility support
+Requires: binutils >= 2.12.90.0.7-1
+# Make sure gdb will understand DW_FORM_strp
+Conflicts: gdb < 5.1-2
+Requires: glibc-devel >= 2.2.5-36.2
+Requires: libgcc >= %{version}-%{release}
+%if !%{gcconly}
+Obsoletes: gcc3
+%endif
+Prereq: /sbin/install-info
+
+Patch1: gcc32-2.96-RH-compat.patch
+Patch2: gcc32-boehm-gc-libs.patch
+Patch3: gcc32-bogus-inline.patch
+Patch6: gcc32-fde-merge-compat.patch
+Patch7: gcc32-attr-visibility.patch
+Patch8: gcc32-attr-visibility2.patch
+Patch9: gcc32-duplicate-decl.patch
+Patch10: gcc32-trunc_int_for_mode.patch
+Patch11: gcc32-sparc-sll1.patch
+Patch12: gcc32-x86_64-q_regs_operand.patch
+Patch13: gcc32-dwarf2-pr6381.patch
+Patch14: gcc32-dwarf2-pr6436-test.patch
+Patch15: gcc32-c++-pretty_function.patch
+Patch16: gcc32-c++-tsubst-asm.patch
+Patch18: gcc32-i386-memtest-test.patch
+Patch19: gcc32-fold-const2.patch
+Patch21: gcc32-ada-addr2line.patch
+Patch22: gcc32-ada-link.patch
+Patch23: gcc32-java-no-rpath.patch
+Patch25: gcc32-s390-java.patch
+Patch26: gcc32-test-rotate.patch
+Patch27: gcc32-x86_64-libiberty-pic.patch
+Patch29: gcc32-test-rh65771.patch
+Patch30: gcc32-i386-default-momit-leaf-frame-pointer.patch
+Patch31: gcc32-i386-pic-label-thunk.patch
+Patch34: gcc32-pr6842.patch
+Patch35: gcc32-tls.patch
+Patch36: gcc32-i386-profile-olfp.patch
+Patch37: gcc32-tree-code.patch
+Patch38: gcc32-hard-reg-sharing.patch
+Patch39: gcc32-hard-reg-sharing2.patch
+Patch40: gcc32-c++-nrv-test.patch
+Patch41: gcc32-debug-pr7241.patch
+Patch42: gcc32-i386-pr7242.patch
+Patch43: gcc32-cfg-eh.patch
+Patch44: gcc32-attr-visibility3.patch
+Patch45: gcc32-tls2.patch
+Patch46: gcc32-fold-const-associate.patch
+Patch47: gcc32-inline-label.patch
+Patch48: gcc32-typeof-asm.patch
+Patch50: gcc32-rh69989.patch
+Patch51: gcc32-tls3.patch
+Patch52: gcc32-tls4.patch
+Patch54: gcc32-tls5.patch
+Patch55: gcc32-tls-dwarf2.patch
+Patch56: gcc32-x86_64-pr7559.patch
+Patch57: gcc32-loop-prefetch.patch
+Patch58: gcc32-doc-gcov.patch
+Patch59: gcc32-attr-visibility4.patch
+Patch60: gcc32-c++-tail-pad-backout.patch
+Patch61: gcc32-attr-visibility5.patch
+Patch62: gcc32-i386-no-default-momit-leaf-frame-pointer.patch
+Patch64: gcc32-x86_64-rip-lowercase.patch
+Patch65: gcc32-libstdc++-glibc23-1.patch
+Patch66: gcc32-libstdc++-glibc23-2.patch
+Patch67: gcc32-libstdc++-glibc23-3.patch
+Patch68: gcc32-libstdc++-glibc23-4.patch
+Patch69: gcc32-interface_only.patch
+
+%define _gnu %{nil}
+
+Patch10000: boehm-gc-mips.patch
+Patch10001: boehm-gc-LINUX.patch
+Patch10002: gcc-libffi-mips.patch
+
+Patch11000: gcc-mips-coff.patch
+Patch11001: gcc-mips-file.patch
+Patch11002: gcc-mips-ieee.patch
+Patch11003: gcc-mips-return.patch
+Patch11004: gcc-libstdc++-mips.patch
+Patch11005: libtool-mips.patch
+
+Patch12000: gcc-libgcc.patch
+
+Patch13000: gcc-ppc-linux.patch
+Patch13001: gcc-linux-crt.patch
+
+Patch14000: gcc-linux-atexit.patch
+Patch14001: gcc-test-atexit.patch
+
+Patch15000: gcc-var.patch
+Patch15001: gcc-copy.patch
+
+Patch16000: gcc-c++-template.patch
+Patch16001: gcc-testsuite-c++.patch
+
+Patch17000: gcc-cross.patch
+Patch17001: gcc-cross-bfd.patch
+Patch17002: gcc-sizeof.patch
+Patch17003: gcc-arch.patch
+
+Patch18000: libjava-cross.patch
+Patch18001: gcc-gcj-cross.patch
+
+Patch19000: contrib-touch.patch
+
+Patch20000: libtool-libs.patch
+
+Patch21000: gcc-libstdc++-glibc-2.2.patch
+
+%description
+The gcc package contains the GNU Compiler Collection version 3.2.
+You'll need this package in order to compile C code.
+
+%package -n libgcc
+Summary: GCC version 3.2 shared support library
+Group: System Environment/Libraries
+
+%description -n libgcc
+This package contains GCC shared support library which is needed
+e.g. for exception handling support.
+
+%package c++
+Summary: C++ support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libstdc++ = %{version}
+Requires: libstdc++-devel = %{version}
+Obsoletes: gcc3-c++
+
+%description c++
+This package adds C++ support to the GNU Compiler Collection.
+It includes support for most of the current C++ specification,
+including templates and exception handling.
+
+%package -n libstdc++
+Summary: GNU Standard C++ Library
+Group: System Environment/Libraries
+Obsoletes: libstdc++3
+
+%description -n libstdc++
+The libstdc++ package contains a rewritten standard compliant GCC Standard
+C++ Library.
+
+%package -n libstdc++-devel
+Summary: Header files and libraries for C++ development
+Group: Development/Libraries
+Requires: libstdc++ = %{version}-%{release}
+Obsoletes: libstdc++3-devel
+
+%description -n libstdc++-devel
+This is the GNU implementation of the standard C++ libraries. This
+package includes the header files and libraries needed for C++
+development. This includes rewritten implementation of STL.
+
+%package objc
+Summary: Objective-C support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libobjc = %{version}-%{release}
+Obsoletes: gcc3-objc
+
+%description objc
+gcc-objc provides Objective-C support for the GCC.
+Mainly used on systems running NeXTSTEP, Objective-C is an
+object-oriented derivative of the C language.
+
+%package -n libobjc
+Summary: Objective-C runtime
+Group: System Environment/Libraries
+
+%description -n libobjc
+This package contains Objective-C shared library which is needed to run
+Objective-C dynamically linked programs.
+
+%package g77
+Summary: Fortran 77 support
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libf2c = %{version}-%{release}
+Prereq: /sbin/install-info
+Obsoletes: gcc3-g77
+
+%description g77
+The gcc-g77 package provides support for compiling Fortran 77
+programs with the GNU Compiler Collection.
+
+%package -n libf2c
+Summary: Fortran 77 runtime
+Group: System Environment/Libraries
+
+%description -n libf2c
+This package contains Fortran 77 shared library which is needed to run
+Fortran 77 dynamically linked programs.
+
+%package java
+Summary: Java support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libgcj >= %{version}, libgcj-devel >= %{version}
+Obsoletes: gcc3-java
+Prereq: /sbin/install-info
+
+%description java
+This package adds support for compiling Java(tm) programs and
+bytecode into native code.
+
+%package -n libgcj
+Summary: Java runtime library for gcc
+Group: System Environment/Libraries
+Requires: zip >= 2.1
+Obsoletes: gcc-libgcj
+Obsoletes: libgcj3
+# Kaffe includes jar too
+Conflicts: kaffe
+
+%description -n libgcj
+The Java(tm) runtime library. You will need this package to run your Java
+programs compiled using the Java compiler from GNU Compiler Collection (gcj).
+
+%package -n libgcj-devel
+Summary: Libraries for Java development using GCC
+Group: Development/Languages
+Requires: zip >= 2.1, libgcj = %{version}
+Obsoletes: libgcj3-devel
+
+%description -n libgcj-devel
+The Java(tm) static libraries and C header files. You will need this
+package to compile your Java programs using the GCC Java compiler (gcj).
+
+%package -n cpp
+Summary: The C Preprocessor.
+Group: Development/Languages
+Prereq: /sbin/install-info
+%ifarch ia64
+Obsoletes: gnupro
+%endif
+
+%description -n cpp
+Cpp is the GNU C-Compatible Compiler Preprocessor.
+Cpp is a macro processor which is used automatically
+by the C compiler to transform your program before actual
+compilation. It is called a macro processor because it allows
+you to define macros, abbreviations for longer
+constructs.
+
+The C preprocessor provides four separate functionalities: the
+inclusion of header files (files of declarations that can be
+substituted into your program); macro expansion (you can define macros,
+and the C preprocessor will replace the macros with their definitions
+throughout the program); conditional compilation (using special
+preprocessing directives, you can include or exclude parts of the
+program according to various conditions); and line control (if you use
+a program to combine or rearrange source files into an intermediate
+file which is then compiled, you can use line control to inform the
+compiler about where each source line originated).
+
+You should install this package if you are a C programmer and you use
+macros.
+
+%package gnat
+Summary: Ada 95 support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}, libgnat = %{version}-%{release}
+Obsoletes: gnat-devel, gcc3-gnat
+Prereq: /sbin/install-info
+
+%description gnat
+GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools,
+the documents and Ada 95 compiler.
+
+%package -n libgnat
+Summary: GNU Ada 95 runtime shared libraries
+Group: System Environment/Libraries
+Obsoletes: gnat libgnat3
+
+%description -n libgnat
+GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries,
+which are required to run programs compiled with the GNAT.
+
+%prep
+%setup -q -n gcc-%{version}-%{DATE}
+%patch1 -p0 -b .2.96-RH-compat~
+%patch2 -p0 -b .boehm-gc-libs~
+%patch3 -p0 -b .bogus-inline~
+%patch6 -p0 -b .fde-merge-compat~
+%patch7 -p0 -b .attr-visibility~
+%patch8 -p0 -b .attr-visibility2~
+%patch9 -p0 -b .duplicate-decl~
+%patch10 -p0 -b .trunc_int_for_mode~
+%patch11 -p0 -b .sparc-sll1~
+%patch12 -p0 -b .x86_64-q_regs_operand~
+%patch13 -p0 -b .dwarf2-pr6381~
+%patch14 -p0 -b .dwarf2-pr6436-test~
+%patch15 -p0 -b .c++-pretty_function~
+%patch16 -p0 -b .c++-tsubst-asm~
+%patch18 -p0 -b .i386-memtest-test~
+%patch19 -p0 -b .fold-const2~
+%patch21 -p0 -b .ada-addr2line~
+%patch22 -p0 -b .ada-link~
+%patch23 -p0 -b .java-no-rpath~
+%patch25 -p0 -b .s390-java~
+%patch26 -p0 -b .test-rotate~
+%patch27 -p0 -b .x86_64-libiberty-pic~
+%patch29 -p0 -b .test-rh65771~
+%patch30 -p0 -b .i386-default-momit-leaf-frame-pointer~
+%patch31 -p0 -b .i386-pic-label-thunk~
+%patch34 -p0 -b .pr6842~
+%patch35 -p0 -b .tls~
+%patch36 -p0 -b .i386-profile-olfp~
+%patch37 -p0 -b .tree-code~
+%patch38 -p0 -b .hard-reg-sharing~
+%patch39 -p0 -b .hard-reg-sharing2~
+%patch40 -p0 -b .c++-nrv-test~
+%patch41 -p0 -b .debug-pr7241~
+%patch42 -p0 -b .i386-pr7242~
+%patch43 -p0 -b .cfg-eh~
+%patch44 -p0 -b .attr-visibility3~
+%patch45 -p0 -b .tls2~
+%patch46 -p0 -b .fold-const-associate~
+%patch47 -p0 -b .inline-label~
+%patch48 -p0 -b .typeof-asm~
+%patch50 -p0 -b .rh69989~
+%patch51 -p0 -b .tls3~
+%patch52 -p0 -b .tls4~
+%patch54 -p0 -b .tls5~
+%patch55 -p0 -b .tls-dwarf2~
+%patch56 -p0 -b .x86_64-pr7559~
+%patch57 -p0 -b .loop-prefetch~
+%patch58 -p0 -b .doc-gcov~
+%patch59 -p0 -b .attr-visibility4~
+%patch60 -p0 -b .c++-tail-pad-backout~
+%patch61 -p0 -b .attr-visibility5~
+%patch62 -p0 -b .i386-no-default-momit-leaf-frame-pointer~
+%patch64 -p0 -b .x86_64-rip-lowercase~
+%patch65 -p0 -b .libstdc++-glibc23-1~
+%patch66 -p0 -b .libstdc++-glibc23-2~
+%patch67 -p0 -b .libstdc++-glibc23-3~
+%patch68 -p0 -b .libstdc++-glibc23-4~
+%patch69 -p0 -b .interface_only
+
+%patch10000 -p0 -b .mips
+%patch10001 -p0 -b .LINUX
+%patch10002 -p0 -b .mips
+pushd boehm-gc
+autoconf
+popd
+pushd libffi
+autoconf
+# Ignore the error from automake
+automake --cygnus Makefile || :
+popd
+
+%patch11000 -p0 -b .coff
+%patch11001 -p0 -b .file
+%patch11002 -p0 -b .ieee
+%patch11003 -p0 -b .return
+%patch11004 -p0 -b .mips
+%patch11005 -p1 -b .mips
+
+%patch12000 -p0 -b .libgcc
+
+%patch13000 -p0 -b .ppc
+%patch13001 -p0 -b .crt
+
+%patch14000 -p0 -b .order
+%patch14001 -p0 -b .order
+
+%patch15000 -p0 -b .var
+%patch15001 -p0 -b .copy
+
+%patch16000 -p0 -b .template
+%patch16001 -p0 -b .template
+
+%patch17000 -p1 -b .cross
+%patch17001 -p0 -b .cross-bfd
+%patch17002 -p1 -b .sizeof
+%patch17003 -p0 -b .arch
+pushd gcc
+autoheader
+autoconf
+popd
+pushd fastjar
+aclocal
+autoconf
+popd
+pushd libffi
+aclocal
+autoconf
+popd
+
+%patch18000 -p0 -b .cross
+%patch18001 -p0 -b .build
+pushd libjava
+autoconf
+automake --foreign Makefile
+popd
+
+%patch19000 -p0 -b .touch
+
+%patch20000 -p0 -b .libs
+
+%patch21000 -p0 -b .glibc-2.2
+pushd libstdc++-v3
+autoconf
+popd
+
+perl -pi -e 's/3\.2\.1/3.2/' gcc/version.c gcc/f/version.c gcc/ada/gnatvsn.ads
+perl -pi -e 's/"%{gcc_version}"/"%{gcc_version} \(release\)"/' gcc/version.c
+perl -pi -e 's/\((prerelease|experimental|release)\)/\(Red Hat Linux 8.0 %{version}-%{gcc_release}\)/' gcc/version.c gcc/f/version.c
+perl -pi -e 's/\((prerelease|experimental|release)\)/\(%{version}-%{gcc_release}\)/' gcc/ada/gnatvsn.ads
+perl -pi -e 's/#define GCCBUGURL.*$/#define GCCBUGURL "<URL:http:\/\/bugzilla.redhat.com\/bugzilla\/>"/' gcc/system.h
+# The version string is now longer than 32 bytes and the line containing it
+# doesn't fit into 80 columns
+#perl -pi -e 's/:= 32/:= 64/;s/(Gnat_Version_String.*:=)/\1\n /' gcc/ada/gnatvsn.ads
+
+./contrib/gcc_update --touch
+
+%build
+rm -fr obj-%{_target_platform}
+mkdir obj-%{_target_platform}
+cd obj-%{_target_platform}
+
+%if %{_arch} != %{_build_arch}
+%ifos linux
+export ac_cv_func_mmap_anywhere=yes
+export ac_cv_func_mmap_file=yes
+export ac_cv_func_mmap_fixed_mapped=yes
+export ac_cv_func_strncmp_works=yes
+export gcc_cv_func_printf_ptr=yes
+%endif
+%endif
+
+DEFAULT_FLAGS=
+%if %{default}
+%ifarch %{ix86}
+TARGET_CPU="%{_target_cpu}"
+DEFAULT_FLAGS="--with-arch=$TARGET_CPU --with-cpu=$TARGET_CPU"
+%endif
+%endif
+
+CC=%{__cc}
+OPT_FLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/-fno-rtti//g' -e 's/-fno-exceptions//g'`
+CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$OPT_FLAGS" XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \
+ ../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
+ --enable-shared --enable-threads=posix --disable-checking --host=%{_target_platform} \
+ $DEFAULT_FLAGS \
+%if %{cross_compile}
+ --target=%{_target_platform} --build=%{_build_alias} \
+%endif
+ --with-system-zlib --enable-__cxa_atexit
+
+# We have to make sure all gcc configure files are up to date for
+# parallel build. We have to do it twice due to the stupid Makefile.
+make -C gcc cstamp-h
+make -C gcc cstamp-h
+
+# if RPM_BUILD_NCPUS unset, set it
+if [ -z "$RPM_BUILD_NCPUS" ] ; then
+ if [ -x /usr/bin/getconf ] ; then
+ RPM_BUILD_NCPUS=$(/usr/bin/getconf _NPROCESSORS_ONLN)
+ if [ $RPM_BUILD_NCPUS -eq 0 ]; then
+ RPM_BUILD_NCPUS=1
+ fi
+ else
+ RPM_BUILD_NCPUS=1
+ fi
+fi
+
+RPM_BUILD_NCPUS=`expr $RPM_BUILD_NCPUS + $RPM_BUILD_NCPUS`
+
+cat <<EOF > makefile
+MAKE=make -j $RPM_BUILD_NCPUS
+include Makefile
+CFLAGS:=\$(CFLAGS) -pipe
+CXXFLAGS:=\$(CXXFLAGS) -pipe
+EOF
+
+# FIXME: It is a kludge.
+export GCJFLAGS="$OPT_FLAGS"
+
+%if %{cross_compile}
+make -j$RPM_BUILD_NCPUS \
+ CC=%{__cc} \
+ CXX=%{__cxx} \
+ AR=%{__ar} \
+ AS=%{__as} \
+ LD=%{__ld} \
+ NM=%{__nm} \
+ RANLIB=%{__ranlib} \
+ CC_FOR_TARGET=%{__cc} \
+ GCC_FOR_TARGET=%{__cc} \
+ CXX_FOR_TARGET=%{__cxx} \
+ AR_FOR_TARGET=%{__ar} \
+ AS_FOR_TARGET=%{__as} \
+ LD_FOR_TARGET=%{__ld} \
+ NM_FOR_TARGET=%{__nm} \
+ RANLIB_FOR_TARGET=%{__ranlib} \
+ HOST_CC=cc \
+ CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \
+ CFLAGS_FOR_BUILD="-O -pipe" \
+ CFLAGS="$RPM_OPT_FLAGS -pipe" \
+ CXXFLAGS="$RPM_OPT_FLAGS -pipe"
+%else
+make -j$RPM_BUILD_NCPUS bootstrap-lean
+#make -j$RPM_BUILD_NCPUS bootstrap
+%endif
+
+%if %{build_ada}
+# This doesn't work with -j$RPM_BUILD_NCPUS
+make -C gcc gnatlib-shared
+make -C gcc gnattools
+make -C gcc/ada doc
+%endif
+
+%if %{make_check}
+# run the tests.
+make -j$RPM_BUILD_NCPUS -k check || :
+%ifarch %{ix86}
+ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}
+ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}-gnu
+%endif
+echo ====================TESTING=========================
+( ../contrib/test_summary || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}'
+%ifarch %{ix86}
+make -C %{_target_platform}/libstdc++-v3 check-abi
+%endif
+echo ====================TESTING END=====================
+#cd %{_target_platform}/libstdc++-v3
+#./mkcheck 0
+#cd ../..
+%endif
+
+%if !%{cross_compile}
+# Make protoize
+make -C gcc CC="./xgcc -B ./ -O2" proto
+%endif
+
+# Make generated man pages even if Pod::Man is not new enough
+perl -pi -e 's/head3/head2/' ../contrib/texi2pod.pl
+for i in ../gcc/doc/*.texi; do
+ cp -a $i $i.orig; sed 's/ftable/table/' $i.orig > $i
+done
+make -C gcc generated-manpages
+for i in ../gcc/doc/*.texi; do mv -f $i.orig $i; done
+
+# Copy various doc files here and there
+cd ..
+mkdir -p rpm.doc/g77 rpm.doc/objc
+mkdir -p rpm.doc/boehm-gc rpm.doc/fastjar rpm.doc/libffi rpm.doc/libjava
+
+(cd gcc/f; for i in ChangeLog*; do
+ cp -p $i ../../rpm.doc/g77/$i.f
+done)
+(cd libf2c; for i in ChangeLog*; do
+ cp -p $i ../rpm.doc/g77/$i.libf2c
+done)
+(cd gcc/objc; for i in README*; do
+ cp -p $i ../../rpm.doc/objc/$i.objc
+done)
+(cd libobjc; for i in README*; do
+ cp -p $i ../rpm.doc/objc/$i.libobjc
+done)
+(cd boehm-gc; for i in ChangeLog*; do
+ cp -p $i ../rpm.doc/boehm-gc/$i.gc
+done)
+(cd fastjar; for i in ChangeLog* README*; do
+ cp -p $i ../rpm.doc/fastjar/$i.fastjar
+done)
+(cd libffi; for i in ChangeLog* README* LICENSE; do
+ cp -p $i ../rpm.doc/libffi/$i.libffi
+done)
+(cd libjava; for i in ChangeLog* README*; do
+ cp -p $i ../rpm.doc/libjava/$i.libjava
+done)
+
+%install
+rm -fr $RPM_BUILD_ROOT
+
+perl -pi -e \
+ 's~href="l(ibstdc|atest)~href="http://gcc.gnu.org/onlinedocs/libstdc++/l\1~' \
+ libstdc++-v3/docs/html/documentation.html
+ln -sf documentation.html libstdc++-v3/docs/html/index.html
+find libstdc++-v3/docs/html -name CVS | xargs rm -rf
+
+cd obj-%{_target_platform}
+TARGET_PLATFORM=%{_target_platform}
+
+# There are some MP bugs in libstdc++ and libjava Makefiles
+make -C %{_target_platform}/libstdc++-v3
+make -C %{_target_platform}/libjava
+
+make prefix=$RPM_BUILD_ROOT%{_prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \
+%if %{cross_compile}
+ CC=%{__cc} \
+ CXX=%{__cxx} \
+ AR=%{__ar} \
+ AS=%{__as} \
+ LD=%{__ld} \
+ NM=%{__nm} \
+ RANLIB=%{__ranlib} \
+ CC_FOR_TARGET=%{__cc} \
+ GCC_FOR_TARGET=%{__cc} \
+ CXX_FOR_TARGET=%{__cxx} \
+ AR_FOR_TARGET=%{__ar} \
+ AS_FOR_TARGET=%{__as} \
+ LD_FOR_TARGET=%{__ld} \
+ NM_FOR_TARGET=%{__nm} \
+ RANLIB_FOR_TARGET=%{__ranlib} \
+ HOST_CC=cc \
+ CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \
+ CFLAGS_FOR_BUILD="-O -pipe" \
+ CFLAGS="$RPM_OPT_FLAGS -pipe" \
+ CXXFLAGS="$RPM_OPT_FLAGS -pipe" \
+%endif
+ infodir=$RPM_BUILD_ROOT%{_infodir} install
+%if %{build_ada}
+pushd gcc/ada
+cp -a gnat-style.info* gnat_rm.info* $RPM_BUILD_ROOT%{_infodir}/
+for i in gnat_ug_unx.info*; do
+ sed 's/gnat_ug_unx/gnat_ug/g' $i > $RPM_BUILD_ROOT%{_infodir}/`echo $i | sed 's/gnat_ug_unx/gnat_ug/'`
+done
+chmod 644 $RPM_BUILD_ROOT%{_infodir}/gnat*
+popd
+%endif
+
+FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1)
+
+file $RPM_BUILD_ROOT/%{_prefix}/bin/* | grep ELF | cut -d':' -f1 | xargs %{__strip} || :
+%{__strip} $FULLPATH/{cc1,cc1obj,cc1plus,cpp0,tradcpp0,f771,jc1,jvgenmain}
+
+# fix some things
+ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/cc
+mkdir -p $RPM_BUILD_ROOT/lib
+ln -sf ..%{_prefix}/bin/cpp $RPM_BUILD_ROOT/lib/cpp
+ln -sf g77 $RPM_BUILD_ROOT%{_prefix}/bin/f77
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+gzip -9 $RPM_BUILD_ROOT%{_infodir}/*.info*
+ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/gnatgcc
+
+mv $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.*a $FULLPATH/
+sed 's/-lgcjgc//g;s/-lzgcj//g;s/-lpthread//g' $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.spec > $FULLPATH/libgcj.spec
+mv $RPM_BUILD_ROOT%{_prefix}/include/gc*.h $FULLPATH/include/
+mv $RPM_BUILD_ROOT%{_prefix}/include/j*.h $FULLPATH/include/
+mv -f $RPM_BUILD_ROOT%{_prefix}/include/{java,javax,gnu,org} $FULLPATH/include/
+mkdir -p $FULLPATH/include/gcj
+mv -f $RPM_BUILD_ROOT%{_prefix}/include/gcj/* $FULLPATH/include/gcj/
+rmdir $RPM_BUILD_ROOT%{_prefix}/include/gcj
+
+mkdir -p $RPM_BUILD_ROOT/%{_lib}
+mv -f `find $RPM_BUILD_ROOT%{_prefix}/lib -name libgcc_s.so.1` $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+chmod 755 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s.so.1
+ln -sf ../../%{_lib}/libgcc_s.so.1 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so
+#ln -sf `echo "%{_prefix}" | sed 's~/[^/]*~\.\./~g'`../%{_lib}/libgcc_s.so.1 \
+# $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so
+#mv -f $FULLPATH/libobjc.so.1* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+%if %{build_ada}
+mv -f $FULLPATH/adalib/libgnarl-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+mv -f $FULLPATH/adalib/libgnat-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+rm -f $FULLPATH/adalib/libgnarl.so* $FULLPATH/adalib/libgnat.so*
+%endif
+pushd $FULLPATH
+if [ "%{_lib}" = "lib" ]; then
+ln -sf ../../../libobjc.so.1 libobjc.so
+ln -sf ../../../libstdc++.so.5.* libstdc++.so
+ln -sf ../../../libgcj.so.3.* libgcj.so
+ln -sf ../../../libg2c.so.0.* libg2c.so
+%if %{build_ada}
+cd adalib
+ln -sf ../../../../libgnarl-*.so.* libgnarl.so
+ln -sf ../../../../libgnat-*.so.* libgnat.so
+cd ..
+%endif
+else
+ln -sf ../../../../%{_lib}/libobjc.so.1 libobjc.so
+ln -sf ../../../../%{_lib}/libstdc++.so.5.* libstdc++.so
+ln -sf ../../../../%{_lib}/libgcj.so.3.* libgcj.so
+ln -sf ../../../../%{_lib}/libg2c.so.0.* libg2c.so
+%if %{build_ada}
+cd adalib
+ln -sf ../../../../../%{_lib}/libgnarl-*.so.* libgnarl.so
+ln -sf ../../../../../%{_lib}/libgnat-*.so.* libgnat.so
+cd ..
+%endif
+fi
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libstdc++.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libsupc++.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libfrtbegin.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.*a .
+# Strip debug info from Fortran/ObjC/Java static libraries
+%{__strip} -g libg2c.a libobjc.a libgcj.a
+# Fix up .la files
+for i in *.la; do
+ sed -e '/^libdir/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \
+ -e '/^dependency_libs/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \
+ -e '/^dependency_libs/s~'\''$~ '\''~' \
+ -e '/^dependency_libs/s~[ ][ ]*~ ~g' \
+ -e '/^dependency_libs/s~-L[^ ]* ~~g' \
+ -e '/^dependency_libs/s~-lgcc_s -lgcc -lc -lgcc_s -lgcc ~~g' \
+ -e '/^dependency_libs/s~-lgcc -lc -lgcc ~~g' \
+ -e '/^dependency_libs/s~-lc ~~g' \
+ -e '/^dependency_libs/s~-lm \(-lm \)*~-lm ~g' \
+ $i > $i.tmp
+ mv -f $i.tmp $i
+done
+popd
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.so.0.*
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.so.1.*
+%if %{build_ada}
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnarl*so*
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnat*so*
+%endif
+
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/c89 <<"EOF"
+#!/bin/sh
+fl="-std=c89"
+for opt; do
+ case "$opt" in
+ -ansi|-std=c89|-std=iso9899:1990) fl="";;
+ -std=*) echo "`basename $0` called with non ANSI/ISO C option $opt" >&2
+ exit 1;;
+ esac
+done
+exec %{_prefix}/bin/gcc $fl ${1+"$@"}
+EOF
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/c99 <<"EOF"
+#!/bin/sh
+fl="-std=c99"
+for opt; do
+ case "$opt" in
+ -std=c99|-std=iso9899:1999) fl="";;
+ -std=*) echo "`basename $0` called with non ISO C99 option $opt" >&2
+ exit 1;;
+ esac
+done
+exec %{_prefix}/bin/gcc $fl ${1+"$@"}
+EOF
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/c?9
+
+cd ..
+%find_lang %{name}
+
+%if %{cross_compile}
+# Install syslimits.h for canadian cross compile.
+pushd $RPM_BUILD_DIR/gcc-%{gcc_version}-%{DATE}/obj-%{_target_platform}
+cp -af ../gcc/gsyslimits.h $FULLPATH/include/syslimits.h
+# Fix the specs file.
+cat gcc/specs |
+awk '
+BEGIN {
+ cross=0;
+}
+/cross_compile/ { print; cross = 1; next; }
+/^1$/ {
+ if (cross == 0) {
+ print;
+ }
+ else {
+ cross = 0;
+ print "0";
+ }
+ next;
+}
+{ print; }
+' > $FULLPATH/specs
+popd
+%endif
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/gcc.info.gz
+
+%preun
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/gcc.info.gz
+fi
+
+%post -n cpp
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/cpp.info.gz
+
+%preun -n cpp
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/cpp.info.gz
+fi
+
+%post g77
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/g77.info.gz
+
+%preun g77
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/g77.info.gz
+fi
+
+%post java
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/gcj.info.gz
+
+%preun java
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/gcj.info.gz
+fi
+
+%post gnat
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz
+/sbin/install-info \
+ --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz
+
+%preun gnat
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz
+ /sbin/install-info --delete \
+ --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz
+fi
+
+%post -n libgcc -p /sbin/ldconfig
+
+%postun -n libgcc -p /sbin/ldconfig
+
+%post -n libstdc++ -p /sbin/ldconfig
+
+%postun -n libstdc++ -p /sbin/ldconfig
+
+%post -n libobjc -p /sbin/ldconfig
+
+%postun -n libobjc -p /sbin/ldconfig
+
+%post -n libgcj -p /sbin/ldconfig
+
+%postun -n libgcj -p /sbin/ldconfig
+
+%post -n libf2c -p /sbin/ldconfig
+
+%postun -n libf2c -p /sbin/ldconfig
+
+%post -n libgnat -p /sbin/ldconfig
+
+%postun -n libgnat -p /sbin/ldconfig
+
+%files -f %{name}.lang
+%defattr(-,root,root)
+%{_prefix}/bin/cc
+%{_prefix}/bin/c89
+%{_prefix}/bin/c99
+%{_prefix}/bin/gcc
+%{_prefix}/bin/gcov
+%if !%{cross_compile}
+%{_prefix}/bin/protoize
+%{_prefix}/bin/unprotoize
+%endif
+%{_prefix}/bin/%{_target_platform}-gcc
+%{_mandir}/man1/gcc.1*
+%{_mandir}/man1/gcov.1*
+%{_infodir}/gcc*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stddef.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/varargs.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/float.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/limits.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/iso646.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/syslimits.h
+%ifarch %{ix86} x86_64
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/mmintrin.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/xmmintrin.h
+%endif
+%ifarch ia64
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ia64intrin.h
+%endif
+%ifarch ppc
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ppc-asm.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/altivec.h
+%endif
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/README
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/collect2
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/crt*.o
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc_eh.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/specs
+%{_prefix}/%{_lib}/libgcc_s.so
+%doc gcc/README* gcc/*ChangeLog*
+
+%if !%{gcconly}
+%files -n cpp
+%defattr(-,root,root)
+/lib/cpp
+%endif
+%{_prefix}/bin/cpp
+%{_mandir}/man1/cpp.1*
+%{_infodir}/cpp*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cpp0
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/tradcpp0
+
+%files -n libgcc
+%defattr(-,root,root)
+/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+/%{_lib}/libgcc_s.so.1
+
+%if !%{gcconly}
+%files c++
+%defattr(-,root,root)
+%{_prefix}/bin/%{_target_platform}-*++
+%{_prefix}/bin/g++
+%{_prefix}/bin/c++
+%{_prefix}/bin/c++filt
+%{_mandir}/man1/g++.1*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1plus
+%doc gcc/cp/ChangeLog*
+
+%files -n libstdc++
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libstdc++.so.5*
+
+%files -n libstdc++-devel
+%defattr(-,root,root)
+%{_prefix}/include/c++
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libsupc++.a
+%doc libstdc++-v3/ChangeLog* libstdc++-v3/README* libstdc++-v3/docs/html/
+
+%files objc
+%defattr(-,root,root)
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/objc
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1obj
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.so
+%doc rpm.doc/objc/*
+%doc libobjc/THREADS* libobjc/ChangeLog
+
+%files -n libobjc
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libobjc.so.1*
+
+%files g77
+%defattr(-,root,root)
+%{_prefix}/bin/g77
+%{_prefix}/bin/f77
+%{_mandir}/man1/g77.1*
+%{_infodir}/g77*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/f771
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libfrtbegin.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/g2c.h
+%doc gcc/f/README rpm.doc/g77/*
+
+%files -n libf2c
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libg2c.so.0*
+
+%files java
+%defattr(-,root,root)
+%{_prefix}/bin/gcj
+%{_prefix}/bin/gcjh
+%{_prefix}/bin/jcf-dump
+%{_prefix}/bin/jv-scan
+%{_mandir}/man1/gcj.1*
+%{_mandir}/man1/gcjh.1*
+%{_mandir}/man1/jcf-dump.1*
+%{_mandir}/man1/jv-scan.1*
+%{_infodir}/gcj*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jc1
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jvgenmain
+%doc gcc/java/ChangeLog*
+
+%files -n libgcj
+%defattr(-,root,root)
+%{_prefix}/bin/jv-convert
+%{_prefix}/bin/gij
+%{_prefix}/bin/jar
+%{_prefix}/bin/grepjar
+%{_prefix}/bin/rmic
+%{_prefix}/bin/rmiregistry
+%{_mandir}/man1/jv-convert.1*
+%{_mandir}/man1/gij.1*
+%{_mandir}/man1/rmic.1*
+%{_mandir}/man1/rmiregistry.1*
+%{_prefix}/%{_lib}/libgcj.so.*
+%{_prefix}/share/java
+%{_prefix}/lib/security
+
+%files -n libgcj-devel
+%defattr(-,root,root)
+%{_prefix}/bin/addr2name.awk
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.spec
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gc*.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/j*.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/java
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/javax
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gnu
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gcj
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/org
+%doc rpm.doc/boehm-gc/* rpm.doc/fastjar/* rpm.doc/libffi/*
+%doc rpm.doc/libjava/*
+
+%if %{build_ada}
+%files gnat
+%defattr(-,root,root)
+%{_prefix}/bin/gnat*
+%{_infodir}/gnat*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adainclude
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adalib
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/gnat1
+%doc gcc/ada/ChangeLog
+
+%files -n libgnat
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libgnat-*.so.*
+%{_prefix}/%{_lib}/libgnarl-*.so.*
+%endif
+%endif
+
+%changelog
+* Tue Sep 3 2002 Bill Nottingham <notting@redhat.com> 3.2-7
+- fix calling of C++ destructors in certain cases
+
+* Tue Sep 3 2002 Jakub Jelinek <jakub@redhat.com> 3.2-6
+- update from CVS (but revert C++ tail padding patches
+ for now)
+- further fixes to make libstdc++-v3 build on glibc 2.3
+- run libstdc++-v3 make check-abi on IA-32 during testing
+
+* Fri Aug 30 2002 Jakub Jelinek <jakub@redhat.com> 3.2-5
+- disable tail copy patches, they seem to still have problems
+- make libstdc++-v3 build on glibc 2.3 (and use thread-local
+ locale model)
+- fix c89 and c99 scripts (#73104)
+
+* Wed Aug 26 2002 Jakub Jelinek <jakub@redhat.com> 3.2-4
+- reorder alpha_encode_section_info checks slightly to fix an ICE
+ when building glibc and to take better advantage of visibility
+ attribute on Alpha
+- as gdb is not there yet, disable -momit-leaf-frame-pointer
+ by default for now on IA-32
+- fix IA-64 bootstrap with tail padding patch (Jason Merrill, Daniel Berlin)
+- fix x86-64 %RIP to %rip, only output (%rip) if no other relocation
+ is used (Richard Henderson)
+
+* Fri Aug 23 2002 Jakub Jelinek <jakub@redhat.com> 3.2-3
+- take advantage of __attribute__((visibility())) on Alpha
+- avoid copying tail padding (Jason Merrill)
+
+* Thu Aug 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-2
+- fixed Dwarf2 DW_OP_GNU_push_tls_address patch from Richard Henderson
+- don't mention removed -a and -ax options in the documentation
+ (Nathan Sidwell, #72233)
+- fixed __typeof() followed by __asm() redirection from Alexandre Oliva
+
+* Wed Aug 14 2002 Jakub Jelinek <jakub@redhat.com> 3.2-1
+- update to 3.2 release
+- fix x86-64 PR target/7559 (Jan Hubicka)
+- fix -fprefetch-loop-arrays (Janis Johnson)
+- fix x86-64 prefetch (Jan Hubicka)
+
+* Fri Aug 9 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.3
+- istream fix (Benjamin Kosnik)
+- emit Dwarf2 DW_OP_GNU_push_tls_address extension for TLS (Richard Henderson)
+- temporarily disable __typeof() + __asm() fix
+
+* Thu Aug 8 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.2
+- update from 3.2 branch
+ - ABI incompatible changes in libstdc++.so.5, long long bitfield
+ layout on IA-32 (both C and C++), oversized bitfields layout
+ on IA-32 and bitfields with base type with __attribute__((aligned ()))
+ - fix strstream segfaults (#68292, Benjamin Kosnik)
+- fix __attribute__((visibility())) together with __asm__()
+ function redirection
+- fix __typeof() followed by __asm() redirection (Alexandre Oliva)
+- fix TLS ICE on glibc (#70061)
+- fix K6 ICE on linux kernel (#69989, Richard Sandiford, Jan Hubicka)
+- fix inlining bug with labels (#70941)
+- fix fold-const bug (#70541)
+- fix PR preprocessor/7358 (Neil Booth)
+- error when mixing __thread and non-__thread declarations
+ (#70059, Aldy Hernandez)
+- fix TLS bug on g++.dg/tls/diag-1.C (Jason Merrill)
+- add -mcmodel= x86-64 documentation (Andreas Jaeger)
+- avoid TLS emitting movl %gs:0, MEMORY on IA-32 (#71033)
+
+* Mon Jul 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.1
+- first attempt for gcc 3.2
+- remove .la files
+
+* Sat Jul 20 2002 Jakub Jelinek <jakub@redhat.com> 3.1-10
+- update from 3.1 branch
+ - add throw() to set_new_handler (Andreas Schwab)
+ - fixed PR optimization/7147, optimization/7153
+- make sure pic register is set up even when the only @PLT calls
+ are done in EH basic blocks (Richard Henderson)
+
+* Sun Jul 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-9
+- define %%_gnu to nothing for compatibility
+
+* Sat Jul 13 2002 Jakub Jelinek <jakub@redhat.com> 3.1-8
+- update from 3.1 branch
+ - fix OpenOffice miscompilation (PR c++/7279, Jason Merrill)
+ - PRs c++/7224, c++/6255, optimization/7145, c++/6706, preprocessor/7070,
+ middle-end/6963, target/6841, target/6770, target/6719,
+ other/6836, libstdc++/7057, libstdc++/7097, libstdc++/3946,
+ libstdc++/7173
+ - fix a GC bug with named labels in C++ (Jim Wilson)
+ - fix ICE on Mesa (Bernd Schmidt, #65771)
+- added some NRV tests
+- fix typo in i386 specs (PR c/7242)
+- fix IA-32 ICE with shifts by negative values followed by compare
+ (PR middle-end/7245, #68395)
+- fixed DWARF-2 output for const char * (PR debug/7241)
+- actually enable __cxa_atexit for standard compliance at configury time
+- added PPC as Ada enabled architecture
+
+* Wed Jun 19 2002 Jakub Jelinek <jakub@redhat.com> 3.1-7
+- update from 3.1 branch
+ - PRs target/6922, opt/6722, c/7030, c/6677, objc/6834, c++/6892,
+ c++/6723, opt/6793
+- use __cxa_atexit for standard compliance:
+ if your C++ project knows it won't call atexit from within its
+ static constructors, use -fno-use-cxa-atexit to optimize it
+- share hard register rtxs where possible to speed the compiler up (Jeff Law)
+- optimize tree_code_* arrays (Kaveh Ghazi)
+- don't link prefix.o into libgnat, link libgnat against libgcc_s and
+ libgnarl against libgnat
+- fix typo in GNAT %%post (#66847, #66941, #66639)
+- add TLS support
+
+* Fri Jun 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-6
+- add GNAT
+- remove DT_RPATH from Java binaries (#66103)
+- obsolete kaffe, install jar as %{_prefix}/bin/jar
+- add include/org directory in java
+- add rmic and rmiregistry programs to libgcj
+- add info documentation for gcj and various man pages
+- add message catalogues for da, el, es, fr, ja, nl, sv, tr
+- don't put IA-64 vtables with relocations into read-only sections
+ with -fpic
+
+* Tue Jun 4 2002 Jakub Jelinek <jakub@redhat.com> 3.1-5
+- update from 3.1 branch
+ - PRs optimization/6822, preprocessor/6844, target/6838, target/6788,
+ libstdc++/6886, libstdc++/6795, libstdc++/6811
+- m$ compatibility for unnamed fields as typedef of struct/union
+ (PR c/6660)
+- fix -fverbose-asm with unnamed fields (PR c/6809)
+- fix -mmmx ICE (PR optimization/6842)
+- default to -momit-leaf-frame-pointer on i386 (Richard Henderson)
+- use linkonce section/hidden symbol for i686 pic getpc thunks
+ (Richard Henderson)
+
+* Tue May 28 2002 Jakub Jelinek <jakub@redhat.com> 3.1-4
+- rebuilt
+
+* Sat May 25 2002 Jakub Jelinek <jakub@redhat.com> 3.1-3
+- update from 3.1 branch
+ - PRs other/6782, preprocessor/6780, preprocessor/6517,
+ libstdc++/6282, libstdc++/6701, libstdc++/6701
+ - fix out << "" bug (Ben Kosnik, #65409, PR libstdc++/6750)
+- 3 new patches
+ - fix C++ __PRETTY_FUNCTION__ (PR c++/6794)
+ - fix ICE on jikes (#65379)
+ - add test for fixed mozilla miscompilation
+- include intrinsic headers on IA-32/x86-64, include altivec.h on PPC
+
+* Wed May 22 2002 Jakub Jelinek <jakub@redhat.com> 3.1-2
+- update from 3.1 branch
+- 8 new patches
+ - fix as version test for 2.12.1 and newer binutils non-CVS releases
+ - fix ICE in do_subst (#65049)
+ - fix SSE conditional move (PR target/6753)
+ - fix SPARC CSE ICE (PR optimization/6759)
+ - fix x86_64 dbx64_register_map typo (Jan Hubicka)
+ - fix DWARF-2 with flag_asynchronous_unwind_tables set for leaf
+ functions (Jan Hubicka)
+ - fix DWARF-2 x86_64 __builtin_dwarf_reg_sizes (Jan Hubicka)
+ - fix x86_64 movabsdi (Michael Matz)
+
+* Wed May 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-1
+- update to 3.1 final
+- 15 new patches
+ - fix PR c/6643
+ - fix fold-const.c typo
+ - fix unitialized pointer-to-member values (Alexandre Oliva)
+ - fix templates with asm inputs (Jason Merrill)
+ - fix -fdata-section (Andreas Schwab)
+ - readd warning about i386 -malign-double into documentation (Jan Hubicka)
+ - fix PR libstdc++/6594 (Ben Kosnik)
+ - fix PR PR libstdc++/6648 (Paolo Carlini)
+ - fix libstdc++ testsuite rlimits (Rainer Orth)
+ - s390 java support (Gerhard Tonn)
+ - rotate testcases (Tom Rix)
+ - build libiberty with -fpic on x86_64 (Andreas Schwab)
+ - fix x86_64 multilib build (Bo Thorsen)
+ - fix x86_64 ASM_OUTPUT_MI_THUNK (Jan Hubicka)
+ - fix loop-2[cd].c tests on i386 (Eric Botcazou)
+- fix typo in g77 info files tweaking
+- fix libgcj.so symlink
+
+* Thu May 9 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.28
+- update to CVS 3.1 branch
+ - PR c++/6212, target/6429, opt/6534, c/6543, target/6561, c/6569
+- fix x86_64 q_regs_operand (Jan Hubicka)
+- better PR c++/6381 fix (Jason Merrill)
+
+* Fri May 3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.27
+- update to CVS 3.1 branch
+ - PR target/5628, libstdc++/5820, c++/6396, preprocessor/6489,
+ libstdc++/6501, libstdc++/6511, target/6512, libstdc++/6513,
+ bootstrap/6514, opt/6516, bootstrap/6525, c++/6527, libstdc++/6533,
+ target/6540
+- fix PR target/6542, target/6522, libstdc++/6549
+
+* Mon Apr 29 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.26
+- update to CVS 3.1 branch
+ - PR c/3581, libstdc++/4150, libstdc++/4164, c/5154, c/5430, c++/5504,
+ c++/5658, c++/5719, f/6138, libgcj/6158, middle-end/6205, c++/6256,
+ c/6300, c++/6331, c/6343, c/6344, c++/6352, c/6358, libstdc++/6360,
+ c++/6395, target/6413, libstdc++/6414, target/6422, bootstrap/6445,
+ optimization/6475, target/6476, c++/6477, c++/6479, c++/6486, c++/6492,
+ target/6494, target/6496, c/6497, target/6500
+- fix PR c++/6396
+- run make check as part of build process
+
+* Thu Apr 18 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.25
+- update to CVS 3.1 branch
+ - PR opt/420, c++/525, target/817, target/1538, opt/3967, target/3997,
+ opt/4120, bootstrap/4191, opt/4311, optimization/4328, c++/4884, c++/4934,
+ c/5078, c++/5104, opt/5120, c++/5189, c++/5373, target/5446, c/5484,
+ c++/5507, c++/5571, c++/5636, target/5672, target/5715, target/5886,
+ c++/5933, c++/5964, c++/5998, opt/6007, target/6032, target/6041,
+ target/6054, c++/6073, target/6082, optimization/6086, target/6087,
+ middle-end/6096, middle-end/6098, middle-end/6099, middle-end/6100,
+ middle-end/6102, fortran/6106, c++/6119, opt/6165, optimization/6177,
+ c++/6179, optimization/6189, c/6202, c/6223, optimization/6233,
+ middle-end/6279, c/6290, optimization/6305, target/6305, bootstrap/6315,
+ c++/6320...
+- fix PR c++/6316
+
+* Wed Mar 27 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.24
+- update to CVS 3.1 branch
+ - PRs c/5656, c/5972, bootstrap/4192, target/4792, bootstrap/4195,
+ optimization/5854, target/6043, c++/6037, bootstrap/4128, target/5740,
+ c/5597, optimization/5863, optimization/5742, target/3177, c/5354,
+ optimization/5999, target/5977, middle-end/5731, target/5312...
+
+* Fri Mar 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23.1
+- fix info and man page generation
+
+* Thu Mar 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23
+- update to CVS 3.1 branch
+ - fix IA-64 packet selection (PR optimization/5892)
+ - make highest_pow2_factor work for all constants (PR middle-end/5877)
+ - fix -Wunused (#61047)
+ - fix loop on mixed mode class assignments (#60923)
+ - fix wide character literals
+ - support SPARC v9 long distance branches (PR target/5626)
+ - fix SPARC leaf functions
+ - fix a rtl sharing problem (Richard Henderson, #60760,
+ PR optimization/5844)
+ - fix va_arg with variable size types (PR c/3711)
+ - PRs optimization/5901, optimization/5878, 5693, preprocessor/5899
+- fix C++ ?: at the end of stmt expr (PR c++/5373)
+- fix loop unrolling with sibcalls (PR optimization/5891)
+
+* Thu Mar 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.22
+- update to CVS 3.1 branch
+ - fix ICE with volatile long long (#60650)
+ - fix tempbuf.h (Philipp Thomas, #60212)
+ - fix -fssa-ccp (Jeff Law, #60651)
+ - versioned libstdc++
+ - backport __attribute__((visibility("..."))) patches from trunk
+- include libstdc++ html documentation
+
+* Tue Feb 5 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.21
+- update to CVS HEAD
+ - fix demangler (H.J. Lu, #59300, #59310)
+ - fix typo in IA-32 specs file (#59081)
+ - support moving SFmode values in MMX regs if -mmmx (#59083)
+ - fix recog_for_combine (#59084)
+ - don't ICE when inserting insns on edge from bb0 to bb0 (Bernd Schmidt,
+ #59087)
+ - make sure configure has not time in the future (#59203)
+ - fix division/modulo by certain constants (#58065, PR c/5304)
+ - fix -Wswitch (PR c/4475)
+
+* Thu Jan 31 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.20
+- update to CVS HEAD
+ - fix jar (Tom Tromey)
+ - fix loop unrolling (Richard Henderson)
+
+* Wed Jan 30 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.19
+- update to CVS HEAD
+ - fix a reload bug on ia32 (#58579, #58648)
+ - issue error about unknown -W* options (#58909)
+ - fix ia64 libbfd miscompilation (#58694)
+ - register all pending unparsed_text structures with GC (#58647)
+ - fix __builtin_apply with ia32 -msse (#58447)
+ - prevent ia64 prologue insns saving regs required for eh from being
+ deleted (#58387)
+
+* Tue Jan 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.18
+- update to CVS HEAD
+ - handle static x[] = { [X...Y] = (foo) { Z } } (#58338)
+ - fix getdents.os miscompilation (Richard Henderson, #58308)
+ - fix ICE in try_forward_edges (#58125)
+ - fix ICE with -fexceptions -foptimize-sibling-calls
+
+* Tue Jan 8 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.17
+- avoid division by 0 when computing prediction probabilities (#57992)
+- fix ICE due to store_expr not adjusting value back for mode
+- increase -ftemplate-depth default value to 500
+
+* Mon Jan 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.16
+- if using PT_GNU_EH_FRAME registry, work around assembler bug resp. feature
+ and don't provide weak prototypes of functions which won't be used
+- on Alpha, fix a typo so that crtbeginT.o is built and installed
+- fix glibc inl-tester miscompilation on ia32
+
+* Sun Jan 6 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.15
+- update to CVS HEAD (fix glibc bootstrap failure)
+
+* Thu Jan 3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.14
+- update to CVS HEAD (#57907)
+ - fix alpha bootstrap (Richard Henderson)
+- fix simplification of (div:SI (???:DI ???) (const_int 1))
+ (#57916)
+- add contrib/gcc_update --touch
+
+* Tue Jan 1 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.13
+- update to CVS HEAD (fix glibc miscompilation on alpha)
+- fix objc to not emit __objc_class_name_* without type and size
+
+* Mon Dec 31 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.12
+- update to CVS HEAD
+- fix sed commands for .la files
+- make Alpha use PT_GNU_EH_FRAME
+
+* Thu Dec 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.11
+- update to CVS HEAD (#57165, #57212, #57467, #57488, #57502,
+ #57505, #57574)
+- readd .la files after fixing them up by sed
+- add %%defattr(-,root,root) to libobjc subpackage
+
+* Mon Dec 3 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.10
+- one more gcc.spec fix for passing --gdwarf-2 resp. --gstabs to as
+- fix conditional register dead computation on IA-64
+- fix extern array of incomplete structures handling
+- fix gcc -xc -
+- fix Fortran ICEs with SAVE_EXPRs (Richard Kenner)
+
+* Tue Nov 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.9
+- update to CVS HEAD
+- make DWARF 2 preferred debugging format on Linux
+
+* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.8
+- don't ship .la files (#56072)
+- include libfrtbegin.a (#56098)
+
+* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.7
+- update to CVS HEAD
+- back out Nov 7th loop.c change for now
+
+* Fri Nov 9 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.6
+- update to CVS HEAD
+- frame unwind compatibility with 7.[12] binutils
+
+* Tue Nov 6 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.5
+- update to CVS HEAD
+- merge DW_EH_PE_indirect constants and their relocs
+
+* Thu Oct 25 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.4
+- don't loop forever or ICE on bogus array initializers (#53704)
+- fix store motion with pure calls
+- disable store motion for now
+
+* Tue Oct 23 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.3
+- fix inlining of C nested functions with auto prototypes
+
+* Mon Oct 22 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.2
+- update to CVS HEAD
+- tree inlining fix from Alexandre Oliva
+- fix anonymous union ICE on alpha
+
+* Mon Oct 15 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.1
+- switch package to main compiler from alternate compiler
+- update to CVS HEAD
+- early gcc-2.96-RH compatibility in __frame_state_for
+- change weak function tests for functions always present in GLIBC 2.2
+ into simple non-weak calls in crt*.o to avoid unnecessary symbol
+ lookups and prelink conflicts
+- don't link against libgcc_s C shared libraries
+
+* Tue Oct 2 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-4
+- update from CVS 3.0 branch
+ - ia64 function descriptors in vtables
+- handle large files in Fortran (#53328)
+- allow Java programs to be statically linked (#53605)
+- remove #include_next patch, Benjamin commited it
+
+* Thu Sep 6 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-3
+- don't use #include_next in <bits/std_c*> headers (Benjamin Kosnik, #53262)
+
+* Wed Sep 5 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-2
+- update from CVS 3.0 branch
+- check all gcc-2.96-RH patches whether they have made it into 3.0.1,
+ and if not, whether they are appropriate for 3.0.1
+- 8 new patches
+ - add 36 testcases from gcc-2.96-RH
+ - fix ICE on very questionable C++ code from JDK (#39858, #52960)
+ - fix -frepo (Nathan Sidwell, #52877)
+ - avoid generating bogus .stabs (#49214)
+ - issue a clear error message about invalid ia32 floating point
+ asm constraints (#27137)
+ - fix some comment typos
+ - fix ADDRESSOF recognition (#29686)
+
+* Mon Aug 27 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-1
+- update from CVS (3.0.1 final)
+- properly handle throw() exception specifiers in template decls (#51824)
+- fix IA-64 varargs handling in presence of additional anonymous arguments
+ (#50757)
+- fix boehm-gc for prelink
+- fix a typo in gcc3-c++ description (#52323)
+- remove Chill from package summary (#51764)
+
+* Tue Aug 7 2001 Jakub Jelinek <jakub@redhat.com> 3.0-6
+- update from CVS
+ - fix glibc vfprintf miscompilation
+- don't warn about if (&foo) if foo is weak (H.J.Lu, #50855)
+
+* Wed Jul 25 2001 Jakub Jelinek <jakub@redhat.com> 3.0-5
+- include libgcjgc.a in libgcj3-devel
+- include libgcjgc.so.* in libgcj3 on ia64
+- remove dependency on libgcj on ia64
+- add ldconfig to libgcj3 post/postun
+
+* Tue Jul 24 2001 Jakub Jelinek <jakub@redhat.com> 3.0-4
+- update from CVS
+- make gcc3-java/libgcj3* packages, so that they can coexist
+ with 2.96-RH Java
+- make sure shared Java libraries are built with proper dependencies
+
+* Wed Jul 11 2001 Jakub Jelinek <jakub@redhat.com> 3.0-3
+- fix libgcc_s.so and libstdc++.so symlinks
+- don't ship jar
+
+* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-2
+- move libstdc++.so into gcc-lib
+- add libobjc.so symlink
+
+* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-1
+- new rpm
diff --git a/patches/gcc/3.2.3/README-sh b/patches/gcc/3.2.3/README-sh
new file mode 100644
index 0000000..a75042a
--- /dev/null
+++ b/patches/gcc/3.2.3/README-sh
@@ -0,0 +1,16 @@
+http://mirror.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains the following patches:
+
+gcc-20030210-sh-linux-1.patch
+gcc-3.2.3-libffi-1.patch
+gcc-3.2.3-sh-linux-dwarf2-1.patch (*not* applied by the spec file, it's in there by accident)
+
+gcc-3.2.3-libffi-1.patch was needed just to build, I think.
+
+After that was applied, sh4 gcc seemed to compile fine, but c++ programs
+failed to execute because libstdc++.so.5 was built without version
+info. This was caused directly by libstdc++-v3/configure setting
+SYMVER_MAP=config/linker-map.dummy because it sees that
+no libgcc_s.so was generated; configure says
+ checking for shared libgcc... no.
+
+Applying gcc-20030210-sh-linux-1.patch in hopes it makes those problems go away.
diff --git a/patches/gcc/3.2.3/config.sub.patch b/patches/gcc/3.2.3/config.sub.patch
new file mode 100644
index 0000000..928f911
--- /dev/null
+++ b/patches/gcc/3.2.3/config.sub.patch
@@ -0,0 +1,72 @@
+When configuring a s390->s390 or cris->cris crosscompiler
+(ok, I haven't hit this yet, but one of these days I'll get me an account
+on an s390, and then I'll need this patch :-), you'll get the
+following error:
+
++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure
+--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu
+--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2
+--enable-languages=c
+--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390-
+unknown-linux-gnu --enable-threads=no --without-headers --with-newlib
+--disable-shared
+...
+*** --with-headers is only supported when cross compiling
+
+This error pops up only when you're using Daniel Jacobowitz's technique
+of slightly changing the target and host tuples to make them different
+enough to force gcc's build system to not try to pull in system libraries
+or headers. This technique is needed e.g. to build an x86 -> x86
+cross-compiler.
+(The LFS developers ran into the same bug that prompted me to use
+this technique; they point people who run into it to
+http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different
+way of avoiding this problem. I think the tuple tweak is the way to go, though.)
+
+config-patches@gnu.org rejected this patch, on the grounds that there
+is only one vendor of each of those two architectures, so the
+canonicalization is by definition correct. When I pointed out the
+difficulty this causes for people building s390 -> s390 or
+cris -> cris compilers that are incompatible with the system
+libraries and thus must be built like cross-compilers, he grumped and said
+"autoconf should let you specify a cross-compiler in some other way than
+comparing tuple strings".
+
+
+
+--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003
++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003
+@@ -433,9 +433,12 @@
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+- cris | cris-* | etrax*)
++ cris | etrax*)
+ basic_machine=cris-axis
+ ;;
++ cris-*)
++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+@@ -820,11 +823,17 @@
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+- s390 | s390-*)
++ s390)
+ basic_machine=s390-ibm
+ ;;
+- s390x | s390x-*)
++ s390-*)
++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ s390x)
+ basic_machine=s390x-ibm
++ ;;
++ s390x-*)
++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
diff --git a/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch
new file mode 100644
index 0000000..bd717f5
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch
@@ -0,0 +1,105 @@
+# See http://gcc.gnu.org/PR7383, http://www.kegel.com/xgcc3/ppc405erratum77.html
+# Fixed in gcc-3.3
+
+diff -aur gcc-20020722.orig/gcc/config/rs6000/rs6000.h gcc-20020722/gcc/config/rs6000/rs6000.h
+--- gcc-20020722.orig/gcc/config/rs6000/rs6000.h Thu Jul 25 09:32:21 2002
++++ gcc-20020722/gcc/config/rs6000/rs6000.h Thu Jul 25 09:34:45 2002
+@@ -66,7 +66,7 @@
+ %{mcpu=rsc1: -D_ARCH_PWR} \
+ %{mcpu=401: -D_ARCH_PPC} \
+ %{mcpu=403: -D_ARCH_PPC} \
+-%{mcpu=405: -D_ARCH_PPC} \
++%{mcpu=405: -D_ARCH_PPC -D__PPC405__} \
+ %{mcpu=505: -D_ARCH_PPC} \
+ %{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \
+ %{mcpu=602: -D_ARCH_PPC} \
+diff -aur gcc-20020722.orig/libjava/sysdep/powerpc/locks.h gcc-20020722/libjava/sysdep/powerpc/locks.h
+--- gcc-20020722.orig/libjava/sysdep/powerpc/locks.h Thu Jul 25 09:32:30 2002
++++ gcc-20020722/libjava/sysdep/powerpc/locks.h Thu Jul 25 11:39:13 2002
+@@ -11,6 +11,17 @@
+ #ifndef __SYSDEP_LOCKS_H__
+ #define __SYSDEP_LOCKS_H__
+
++#ifdef __PPC405__
++// workaround for PPC405 erratum #77 - 07/18/02 JRO, dank, NN. References:
++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++// http://www.kegel.com/xgcc3/ppc405erratum77.html
++// FIXME: using dbct instead of sync would be faster
++#define __LIBGCJ_PPC405_ERR77_SYNC "sync \n\t"
++#else
++#define __LIBGCJ_PPC405_ERR77_SYNC
++#endif
++
+ typedef size_t obj_addr_t; /* Integer type big enough for object */
+ /* address. */
+
+@@ -25,6 +36,7 @@
+ "0: lwarx %0,0,%1 ;"
+ " xor. %0,%3,%0;"
+ " bne 1f;"
++ __LIBGCJ_PPC405_ERR77_SYNC
+ " stwcx. %2,0,%1;"
+ " bne- 0b;"
+ "1: "
+@@ -58,6 +70,7 @@
+ "0: lwarx %0,0,%1 ;"
+ " xor. %0,%3,%0;"
+ " bne 1f;"
++ __LIBGCJ_PPC405_ERR77_SYNC
+ " stwcx. %2,0,%1;"
+ " bne- 0b;"
+ "1: "
+diff -aur gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h
+--- gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:32:31 2002
++++ gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:34:45 2002
+@@ -32,6 +32,17 @@
+
+ typedef int _Atomic_word;
+
++#ifdef __PPC405__
++// workaround for PPC405 erratum #77 - 07/18/02 JRO & dank. References:
++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++// http://www.kegel.com/xgcc3/ppc405erratum77.html
++// FIXME: using dbct instead of sync would be faster
++#define __LIBSTDCPP_PPC405_ERR77_SYNC "sync \n\t"
++#else
++#define __LIBSTDCPP_PPC405_ERR77_SYNC
++#endif
++
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add (volatile _Atomic_word* __mem, int __val)
+@@ -42,6 +53,7 @@
+ "0:\t"
+ "lwarx %0,0,%2 \n\t"
+ "add%I3 %1,%0,%3 \n\t"
++ __LIBSTDCPP_PPC405_ERR77_SYNC
+ "stwcx. %1,0,%2 \n\t"
+ "bne- 0b \n\t"
+ "/* End exchange & add */"
+@@ -61,6 +73,7 @@
+ "0:\t"
+ "lwarx %0,0,%1 \n\t"
+ "add%I2 %0,%0,%2 \n\t"
++ __LIBSTDCPP_PPC405_ERR77_SYNC
+ "stwcx. %0,0,%1 \n\t"
+ "bne- 0b \n\t"
+ "/* End atomic add */"
+@@ -78,6 +91,7 @@
+ "/* Inline always swap */\n"
+ "0:\t"
+ "lwarx %0,0,%1 \n\t"
++ __LIBSTDCPP_PPC405_ERR77_SYNC
+ "stwcx. %2,0,%1 \n\t"
+ "bne- 0b \n\t"
+ "/* End always swap */"
+@@ -98,6 +112,7 @@
+ "lwarx %0,0,%1 \n\t"
+ "cmpwi %0,0 \n\t"
+ "bne- 1f \n\t"
++ __LIBSTDCPP_PPC405_ERR77_SYNC
+ "stwcx. %2,0,%1 \n\t"
+ "bne- 0b \n"
+ "1:\n\t"
diff --git a/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch
new file mode 100644
index 0000000..4393078
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch
@@ -0,0 +1,1761 @@
+diff -ruN gcc-20030210.orig/boehm-gc/configure gcc-20030210/boehm-gc/configure
+--- gcc-20030210.orig/boehm-gc/configure Fri Jan 31 19:17:00 2003
++++ gcc-20030210/boehm-gc/configure Sat Feb 22 01:40:14 2003
+@@ -1922,7 +1922,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/config-ml.in gcc-20030210/config-ml.in
+--- gcc-20030210.orig/config-ml.in Fri Jan 31 19:16:59 2003
++++ gcc-20030210/config-ml.in Sat Feb 22 01:40:14 2003
+@@ -545,6 +545,7 @@
+ if [ -d ../$${dir}/$${lib} ]; then \
+ flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
+ if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \
++ DESTDIR="$(DESTDIR)" \
+ CFLAGS="$(CFLAGS) $${flags}" \
+ prefix="$(prefix)" \
+ exec_prefix="$(exec_prefix)" \
+diff -ruN gcc-20030210.orig/debian/edit-specs.in gcc-20030210/debian/edit-specs.in
+--- gcc-20030210.orig/debian/edit-specs.in Thu Jan 1 09:00:00 1970
++++ gcc-20030210/debian/edit-specs.in Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,45 @@
++/^*asm:$/ {
++n
++c\
++@AS_ENDIAN_FLAG@ %{mrelax:-relax}
++}
++/^*cpp:$/ {
++n
++c\
++%(cpp_default_cpu_spec) %(subtarget_cpp_spec) %(subtarget_cpp_ptr_spec) %(subtarget_cpp_endian_spec)
++}
++/^*cc1:$/ {
++n
++c\
++-musermode @CC1_CPU_ENDIAN_FLAGS@ %{profile:-p}
++}
++/^*link:$/ {
++n
++c\
++%{!static:--eh-frame-hdr} @LINKER_CPU_ENDIAN_FLAGS@ @LINKER_RPATH_LINK_FLAG@ %{mrelax:-relax} %{shared:-shared} %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static}
++}
++/^*multilib:$/ {
++n
++c\
++. ;
++}
++/^*multilib_matches:$/ {
++n
++c\
++
++}
++/^*multilib_options:$/ {
++n
++c\
++
++}
++/^*subtarget_cpp_endian_spec:$/ {
++n
++c\
++@CPP_ENDIAN_DEF@
++}
++/^*cpp_default_cpu_spec:$/ {
++n
++c\
++@CPP_CPU_DEFS@
++}
+diff -ruN gcc-20030210.orig/debian/install-CPU-linux gcc-20030210/debian/install-CPU-linux
+--- gcc-20030210.orig/debian/install-CPU-linux Thu Jan 1 09:00:00 1970
++++ gcc-20030210/debian/install-CPU-linux Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,111 @@
++#! /bin/sh
++
++VERSION=$1; shift
++CPU=$1
++
++# literally (binary-ly) same
++PROGS_C="cpp gcc"
++PROGS_ADDITIONAL="c++ g++ g77 gcj"
++
++DRIVERS_C="cc1 cpp0 tradcpp0"
++DRIVERS_ADDITIONAL="cc1obj cc1plus collect2 f771 jc1 jvgenmain"
++if [ -z "$STEP1_COMPILER_BUILD" ]; then
++ PROGS="$PROGS_C $PROGS_ADDITIONAL"
++ DRIVERS="$DRIVERS_C $DRIVERSADDITIONAL"
++ INITIAL=""
++else
++ PROGS=$PROGS_C
++ DRIVERS=$DRIVERS_C
++ INITIAL="-initial"
++fi
++
++OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++LIBS_C="libgcc.a"
++LIBS_1="libgcc_s.so libgcc_s.so.1 libstdc++.so libstdc++.so.3 libstdc++.so.3.0.2"
++LIBS_2="libobjc.a libstdc++.a libsupc++.a"
++INCLUDE="include"
++
++cd debian/gcc-sh-linux-others${INITIAL} || exit 1
++
++# Make directories.
++mkdir -p usr/bin usr/share usr/share/man usr/share/man/man1 usr/lib \
++ usr/lib/gcc-lib usr/lib/gcc-lib/${CPU}-linux \
++ usr/lib/gcc-lib/${CPU}-linux/${VERSION} \
++ usr/${CPU}-linux usr/${CPU}-linux/lib
++
++# Make symbolic links for include dir.
++(cd usr/${CPU}-linux; ln -s ../sh-linux/include .)
++
++# Make symbolic links for executables.
++(cd usr/bin;
++ for p in ${PROGS}; do
++ ln -s shCPU-linux-GCC ${CPU}-linux-$p
++ done)
++
++case "${CPU}" in
++ sh3)
++ MULTILIBDIR=
++ AS_ENDIAN_FLAG="-little"
++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__"
++ CC1_CPU_ENDIAN_FLAGS="-ml -m3"
++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3"
++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3-linux/lib"
++ ;;
++ sh3eb)
++ MULTILIBDIR=/mb
++ AS_ENDIAN_FLAG="-big"
++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__"
++ CC1_CPU_ENDIAN_FLAGS="-mb -m3"
++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3"
++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3eb-linux/lib"
++ ;;
++ sh4)
++ MULTILIBDIR=/m4
++ AS_ENDIAN_FLAG="-little"
++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
++ CPP_CPU_DEFS="-D__SH4__"
++ CC1_CPU_ENDIAN_FLAGS="-ml -m4"
++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4"
++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4-linux/lib"
++ ;;
++ sh4eb)
++ MULTILIBDIR=/mb/m4
++ AS_ENDIAN_FLAG="-big"
++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
++ CPP_CPU_DEFS="-D__SH4__"
++ CC1_CPU_ENDIAN_FLAGS="-mb -m4"
++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4"
++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4eb-linux/lib"
++ ;;
++esac
++
++# Make symbolic links for GCC drivers, objects, libraries, and include dir.
++(cd usr/lib/gcc-lib/${CPU}-linux/${VERSION};
++ for f in ${DRIVERS} ${INCLUDE}; do
++ ln -s ../../sh-linux/${VERSION}/$f $f;
++ done
++ for f in ${OBJS} ${LIBS_C}; do
++ ln -s ../../sh-linux/${VERSION}${MULTILIBDIR}/$f $f;
++ done)
++
++if [ -z "$STEP1_COMPILER_BUILD" ]; then
++ for f in ${LIBS_1} ${LIBS_2}; do
++ mv ../gcc-sh-linux/usr/sh-linux/lib${MULTILIBDIR}/$f usr/${CPU}-linux/lib/;
++ done
++fi
++
++sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \
++ -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \
++ -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \
++ -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \
++ -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \
++ -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \
++ ../edit-specs.in >../edit-specs-${CPU}.sed
++
++sed -f ../edit-specs-${CPU}.sed \
++ ../gcc-sh-linux${INITIAL}/usr/lib/gcc-lib/sh-linux/${VERSION}/specs \
++ > usr/lib/gcc-lib/${CPU}-linux/${VERSION}/specs
++
++exit 0
+diff -ruN gcc-20030210.orig/debian/multilib-symlink gcc-20030210/debian/multilib-symlink
+--- gcc-20030210.orig/debian/multilib-symlink Thu Jan 1 09:00:00 1970
++++ gcc-20030210/debian/multilib-symlink Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,10 @@
++#! /bin/sh
++
++cd /usr/sh-linux/lib
++ln -s ../../sh3-linux/lib/{*.a,*.so*,*.o} .
++cd m4
++ln -s ../../../sh4-linux/lib/{*.a,*.so*,*.o} .
++cd ../mb
++ln -s ../../../sh3eb-linux/lib/{*.a,*.so*,*.o} .
++cd m4
++ln -s ../../../../sh4eb-linux/lib/{*.a,*.so*,*.o} .
+diff -ruN gcc-20030210.orig/debian/shCPU-linux-GCC gcc-20030210/debian/shCPU-linux-GCC
+--- gcc-20030210.orig/debian/shCPU-linux-GCC Thu Jan 1 09:00:00 1970
++++ gcc-20030210/debian/shCPU-linux-GCC Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,59 @@
++#! /bin/bash
++
++BASENAME=${0##*/}
++PROG=${BASENAME##*-}
++CPU=${BASENAME%%-*}
++
++if [ "$PROG" = gcc ]; then
++ if [ "$1" = "-b" -a "$2" = "i386-linux" ]; then
++ shift 2
++ exec /usr/bin/gcc "$@"
++ elif [ "$1" = "-print-multi-lib" -o "$1" = "--print-multi-lib" ]; then
++ echo ".;"
++ exit 0
++ elif [ "$1" = "-print-multi-os-directory" -o "$1" = "--print-multi-os-directory" ]; then
++ echo "."
++ exit 0
++ elif [ "$1" = "-dumpspecs" ]; then
++ cat /usr/lib/gcc-lib/${CPU}-linux/@@VERSION@@/specs
++ exit 0
++ fi
++fi
++
++case "${CPU}" in
++ sh3)
++ ARCH=m3
++ DEFINES="-D__sh3__ -D__SH3__ -D__LITTLE_ENDIAN__"
++ ENDIAN=ml
++ ;;
++ sh3eb)
++ ARCH=m3
++ DEFINES="-D__sh3__ -D__SH3__ -D__BIG_ENDIAN__"
++ ENDIAN=mb
++ ;;
++ sh4)
++ ARCH=m4
++ DEFINES="-D__SH4__ -D__LITTLE_ENDIAN__"
++ ENDIAN=ml
++ ;;
++ sh4eb)
++ ARCH=m4
++ DEFINES="-D__SH4__ -D__BIG_ENDIAN__"
++ ENDIAN=mb
++ ;;
++esac
++
++# Prepend the appropriate options
++# If user specifies some options, it will be overridden
++
++case "${PROG}" in
++ cpp)
++ exec sh-linux-${PROG} $DEFINES "$@"
++ ;;
++ c++|g++|g77|gcc|gcj)
++ exec sh-linux-${PROG} -$ARCH -$ENDIAN "$@"
++ ;;
++esac
++
++echo "Something wrong..."
++exit 1
+diff -ruN gcc-20030210.orig/gcc/config/sh/elf.h gcc-20030210/gcc/config/sh/elf.h
+--- gcc-20030210.orig/gcc/config/sh/elf.h Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/elf.h Sat Feb 22 01:40:14 2003
+@@ -170,3 +170,7 @@
+ #undef ENDFILE_SPEC
+ #define ENDFILE_SPEC \
+ "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
++
++/* ASM_OUTPUT_CASE_LABEL is defined in elfos.h. With it,
++ redundant .align will be generated. */
++#undef ASM_OUTPUT_CASE_LABEL
+diff -ruN gcc-20030210.orig/gcc/config/sh/lib1funcs.asm gcc-20030210/gcc/config/sh/lib1funcs.asm
+--- gcc-20030210.orig/gcc/config/sh/lib1funcs.asm Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/lib1funcs.asm Sat Feb 22 01:40:14 2003
+@@ -39,8 +39,13 @@
+
+ #ifdef __ELF__
+ #define LOCAL(X) .L_##X
++#define FUNC(X) .type X,@function; .hidden X
++#define _ENDFUNC(X) .Lfe_##X: .size X,.Lfe_##X-X
++#define ENDFUNC(X) _ENDFUNC(X)
+ #else
+ #define LOCAL(X) L_##X
++#define FUNC(X)
++#define ENDFUNC(X)
+ #endif
+
+ #ifdef __linux__
+@@ -91,6 +96,40 @@
+ .global GLOBAL(ashiftrt_r4_31)
+ .global GLOBAL(ashiftrt_r4_32)
+
++ FUNC(GLOBAL(ashiftrt_r4_0))
++ FUNC(GLOBAL(ashiftrt_r4_1))
++ FUNC(GLOBAL(ashiftrt_r4_2))
++ FUNC(GLOBAL(ashiftrt_r4_3))
++ FUNC(GLOBAL(ashiftrt_r4_4))
++ FUNC(GLOBAL(ashiftrt_r4_5))
++ FUNC(GLOBAL(ashiftrt_r4_6))
++ FUNC(GLOBAL(ashiftrt_r4_7))
++ FUNC(GLOBAL(ashiftrt_r4_8))
++ FUNC(GLOBAL(ashiftrt_r4_9))
++ FUNC(GLOBAL(ashiftrt_r4_10))
++ FUNC(GLOBAL(ashiftrt_r4_11))
++ FUNC(GLOBAL(ashiftrt_r4_12))
++ FUNC(GLOBAL(ashiftrt_r4_13))
++ FUNC(GLOBAL(ashiftrt_r4_14))
++ FUNC(GLOBAL(ashiftrt_r4_15))
++ FUNC(GLOBAL(ashiftrt_r4_16))
++ FUNC(GLOBAL(ashiftrt_r4_17))
++ FUNC(GLOBAL(ashiftrt_r4_18))
++ FUNC(GLOBAL(ashiftrt_r4_19))
++ FUNC(GLOBAL(ashiftrt_r4_20))
++ FUNC(GLOBAL(ashiftrt_r4_21))
++ FUNC(GLOBAL(ashiftrt_r4_22))
++ FUNC(GLOBAL(ashiftrt_r4_23))
++ FUNC(GLOBAL(ashiftrt_r4_24))
++ FUNC(GLOBAL(ashiftrt_r4_25))
++ FUNC(GLOBAL(ashiftrt_r4_26))
++ FUNC(GLOBAL(ashiftrt_r4_27))
++ FUNC(GLOBAL(ashiftrt_r4_28))
++ FUNC(GLOBAL(ashiftrt_r4_29))
++ FUNC(GLOBAL(ashiftrt_r4_30))
++ FUNC(GLOBAL(ashiftrt_r4_31))
++ FUNC(GLOBAL(ashiftrt_r4_32))
++
+ .align 1
+ GLOBAL(ashiftrt_r4_32):
+ GLOBAL(ashiftrt_r4_31):
+@@ -170,6 +209,41 @@
+ GLOBAL(ashiftrt_r4_0):
+ rts
+ nop
++
++ ENDFUNC(GLOBAL(ashiftrt_r4_0))
++ ENDFUNC(GLOBAL(ashiftrt_r4_1))
++ ENDFUNC(GLOBAL(ashiftrt_r4_2))
++ ENDFUNC(GLOBAL(ashiftrt_r4_3))
++ ENDFUNC(GLOBAL(ashiftrt_r4_4))
++ ENDFUNC(GLOBAL(ashiftrt_r4_5))
++ ENDFUNC(GLOBAL(ashiftrt_r4_6))
++ ENDFUNC(GLOBAL(ashiftrt_r4_7))
++ ENDFUNC(GLOBAL(ashiftrt_r4_8))
++ ENDFUNC(GLOBAL(ashiftrt_r4_9))
++ ENDFUNC(GLOBAL(ashiftrt_r4_10))
++ ENDFUNC(GLOBAL(ashiftrt_r4_11))
++ ENDFUNC(GLOBAL(ashiftrt_r4_12))
++ ENDFUNC(GLOBAL(ashiftrt_r4_13))
++ ENDFUNC(GLOBAL(ashiftrt_r4_14))
++ ENDFUNC(GLOBAL(ashiftrt_r4_15))
++ ENDFUNC(GLOBAL(ashiftrt_r4_16))
++ ENDFUNC(GLOBAL(ashiftrt_r4_17))
++ ENDFUNC(GLOBAL(ashiftrt_r4_18))
++ ENDFUNC(GLOBAL(ashiftrt_r4_19))
++ ENDFUNC(GLOBAL(ashiftrt_r4_20))
++ ENDFUNC(GLOBAL(ashiftrt_r4_21))
++ ENDFUNC(GLOBAL(ashiftrt_r4_22))
++ ENDFUNC(GLOBAL(ashiftrt_r4_23))
++ ENDFUNC(GLOBAL(ashiftrt_r4_24))
++ ENDFUNC(GLOBAL(ashiftrt_r4_25))
++ ENDFUNC(GLOBAL(ashiftrt_r4_26))
++ ENDFUNC(GLOBAL(ashiftrt_r4_27))
++ ENDFUNC(GLOBAL(ashiftrt_r4_28))
++ ENDFUNC(GLOBAL(ashiftrt_r4_29))
++ ENDFUNC(GLOBAL(ashiftrt_r4_30))
++ ENDFUNC(GLOBAL(ashiftrt_r4_31))
++ ENDFUNC(GLOBAL(ashiftrt_r4_32))
++
+ #endif
+
+ #ifdef L_ashiftrt_n
+@@ -192,6 +266,7 @@
+ !
+
+ .global GLOBAL(ashrsi3)
++ FUNC(GLOBAL(ashrsi3))
+ .align 2
+ GLOBAL(ashrsi3):
+ mov #31,r0
+@@ -319,6 +394,8 @@
+ rts
+ nop
+
++ ENDFUNC(GLOBAL(ashrsi3))
++
+ #endif
+
+ #ifdef L_ashiftlt
+@@ -340,6 +417,7 @@
+ ! (none)
+ !
+ .global GLOBAL(ashlsi3)
++ FUNC(GLOBAL(ashlsi3))
+ .align 2
+ GLOBAL(ashlsi3):
+ mov #31,r0
+@@ -476,6 +554,8 @@
+ rts
+ nop
+
++ ENDFUNC(GLOBAL(ashlsi3))
++
+ #endif
+
+ #ifdef L_lshiftrt
+@@ -497,6 +577,7 @@
+ ! (none)
+ !
+ .global GLOBAL(lshrsi3)
++ FUNC(GLOBAL(lshrsi3))
+ .align 2
+ GLOBAL(lshrsi3):
+ mov #31,r0
+@@ -633,6 +714,8 @@
+ rts
+ nop
+
++ ENDFUNC(GLOBAL(lshrsi3))
++
+ #endif
+
+ #ifdef L_movstr
+@@ -649,76 +732,113 @@
+ add #64,r4
+ .align 4
+ .global GLOBAL(movstrSI64)
++ FUNC(GLOBAL(movstrSI64))
+ GLOBAL(movstrSI64):
+ mov.l @(60,r5),r0
+ mov.l r0,@(60,r4)
+ .global GLOBAL(movstrSI60)
++ FUNC(GLOBAL(movstrSI60))
+ GLOBAL(movstrSI60):
+ mov.l @(56,r5),r0
+ mov.l r0,@(56,r4)
+ .global GLOBAL(movstrSI56)
++ FUNC(GLOBAL(movstrSI56))
+ GLOBAL(movstrSI56):
+ mov.l @(52,r5),r0
+ mov.l r0,@(52,r4)
+ .global GLOBAL(movstrSI52)
++ FUNC(GLOBAL(movstrSI52))
+ GLOBAL(movstrSI52):
+ mov.l @(48,r5),r0
+ mov.l r0,@(48,r4)
+ .global GLOBAL(movstrSI48)
++ FUNC(GLOBAL(movstrSI48))
+ GLOBAL(movstrSI48):
+ mov.l @(44,r5),r0
+ mov.l r0,@(44,r4)
+ .global GLOBAL(movstrSI44)
++ FUNC(GLOBAL(movstrSI44))
+ GLOBAL(movstrSI44):
+ mov.l @(40,r5),r0
+ mov.l r0,@(40,r4)
+ .global GLOBAL(movstrSI40)
++ FUNC(GLOBAL(movstrSI40))
+ GLOBAL(movstrSI40):
+ mov.l @(36,r5),r0
+ mov.l r0,@(36,r4)
+ .global GLOBAL(movstrSI36)
++ FUNC(GLOBAL(movstrSI36))
+ GLOBAL(movstrSI36):
+ mov.l @(32,r5),r0
+ mov.l r0,@(32,r4)
+ .global GLOBAL(movstrSI32)
++ FUNC(GLOBAL(movstrSI32))
+ GLOBAL(movstrSI32):
+ mov.l @(28,r5),r0
+ mov.l r0,@(28,r4)
+ .global GLOBAL(movstrSI28)
++ FUNC(GLOBAL(movstrSI28))
+ GLOBAL(movstrSI28):
+ mov.l @(24,r5),r0
+ mov.l r0,@(24,r4)
+ .global GLOBAL(movstrSI24)
++ FUNC(GLOBAL(movstrSI24))
+ GLOBAL(movstrSI24):
+ mov.l @(20,r5),r0
+ mov.l r0,@(20,r4)
+ .global GLOBAL(movstrSI20)
++ FUNC(GLOBAL(movstrSI20))
+ GLOBAL(movstrSI20):
+ mov.l @(16,r5),r0
+ mov.l r0,@(16,r4)
+ .global GLOBAL(movstrSI16)
++ FUNC(GLOBAL(movstrSI16))
+ GLOBAL(movstrSI16):
+ mov.l @(12,r5),r0
+ mov.l r0,@(12,r4)
+ .global GLOBAL(movstrSI12)
++ FUNC(GLOBAL(movstrSI12))
+ GLOBAL(movstrSI12):
+ mov.l @(8,r5),r0
+ mov.l r0,@(8,r4)
+ .global GLOBAL(movstrSI8)
++ FUNC(GLOBAL(movstrSI8))
+ GLOBAL(movstrSI8):
+ mov.l @(4,r5),r0
+ mov.l r0,@(4,r4)
+ .global GLOBAL(movstrSI4)
++ FUNC(GLOBAL(movstrSI4))
+ GLOBAL(movstrSI4):
+ mov.l @(0,r5),r0
+ mov.l r0,@(0,r4)
++ .global GLOBAL(movstrSI0)
++ FUNC(GLOBAL(movstrSI0))
+ GLOBAL(movstrSI0):
+ rts
+ nop
+
++ ENDFUNC(GLOBAL(movstrSI64))
++ ENDFUNC(GLOBAL(movstrSI60))
++ ENDFUNC(GLOBAL(movstrSI56))
++ ENDFUNC(GLOBAL(movstrSI52))
++ ENDFUNC(GLOBAL(movstrSI48))
++ ENDFUNC(GLOBAL(movstrSI44))
++ ENDFUNC(GLOBAL(movstrSI40))
++ ENDFUNC(GLOBAL(movstrSI36))
++ ENDFUNC(GLOBAL(movstrSI32))
++ ENDFUNC(GLOBAL(movstrSI28))
++ ENDFUNC(GLOBAL(movstrSI24))
++ ENDFUNC(GLOBAL(movstrSI20))
++ ENDFUNC(GLOBAL(movstrSI16))
++ ENDFUNC(GLOBAL(movstrSI12))
++ ENDFUNC(GLOBAL(movstrSI8))
++ ENDFUNC(GLOBAL(movstrSI4))
++ ENDFUNC(GLOBAL(movstrSI0))
++
+ .align 4
+
+ .global GLOBAL(movstr)
++ FUNC(GLOBAL(movstr))
+ GLOBAL(movstr):
+ mov.l @(60,r5),r0
+ mov.l r0,@(60,r4)
+@@ -775,6 +895,8 @@
+ add #64,r5
+ bra GLOBAL(movstr)
+ add #64,r4
++
++ FUNC(GLOBAL(movstr))
+ #endif
+
+ #ifdef L_movstr_i4
+@@ -783,6 +905,10 @@
+ .global GLOBAL(movstr_i4_odd)
+ .global GLOBAL(movstrSI12_i4)
+
++ FUNC(GLOBAL(movstr_i4_even))
++ FUNC(GLOBAL(movstr_i4_odd))
++ FUNC(GLOBAL(movstrSI12_i4))
++
+ .p2align 5
+ L_movstr_2mod4_end:
+ mov.l r0,@(16,r4)
+@@ -791,6 +917,11 @@
+
+ .p2align 2
+
++GLOBAL(movstr_i4_even):
++ mov.l @r5+,r0
++ bra L_movstr_start_even
++ mov.l @r5+,r1
++
+ GLOBAL(movstr_i4_odd):
+ mov.l @r5+,r1
+ add #-4,r4
+@@ -817,10 +948,8 @@
+ rts
+ mov.l r3,@(12,r4)
+
+-GLOBAL(movstr_i4_even):
+- mov.l @r5+,r0
+- bra L_movstr_start_even
+- mov.l @r5+,r1
++ ENDFUNC(GLOBAL(movstr_i4_even))
++ ENDFUNC(GLOBAL(movstr_i4_odd))
+
+ .p2align 4
+ GLOBAL(movstrSI12_i4):
+@@ -831,12 +960,16 @@
+ mov.l r1,@(4,r4)
+ rts
+ mov.l r2,@(8,r4)
++
++ ENDFUNC(GLOBAL(movstrSI12_i4))
++
+ #endif
+
+ #ifdef L_mulsi3
+
+
+ .global GLOBAL(mulsi3)
++ FUNC(GLOBAL(mulsi3))
+
+ ! r4 = aabb
+ ! r5 = ccdd
+@@ -869,7 +1002,7 @@
+ rts
+ add r2,r0
+
+-
++ FUNC(GLOBAL(mulsi3))
+ #endif
+ #endif /* ! __SH5__ */
+ #ifdef L_sdivsi3_i4
+@@ -879,6 +1012,7 @@
+ !! args in r4 and r5, result in fpul, clobber dr0, dr2
+
+ .global GLOBAL(sdivsi3_i4)
++ FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ lds r4,fpul
+ float fpul,dr0
+@@ -888,6 +1022,8 @@
+ rts
+ ftrc dr0,fpul
+
++ ENDFUNC(GLOBAL(sdivsi3_i4))
++
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
+
+@@ -896,6 +1032,7 @@
+ .mode SHcompact
+ #endif
+ .global GLOBAL(sdivsi3_i4)
++ FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ sts.l fpscr,@-r15
+ mov #8,r2
+@@ -910,6 +1047,8 @@
+ rts
+ lds.l @r15+,fpscr
+
++ ENDFUNC(GLOBAL(sdivsi3_i4))
++
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -924,9 +1063,10 @@
+ !!
+ !!
+
+-!! args in r4 and r5, result in r0 clobber r1,r2,r3
++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
+
+ .global GLOBAL(sdivsi3)
++ FUNC(GLOBAL(sdivsi3))
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+ .section .text..SHmedia32,"ax"
+@@ -1076,6 +1216,7 @@
+ div0: rts
+ mov #0,r0
+
++ ENDFUNC(GLOBAL(sdivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1084,9 +1225,11 @@
+ .title "SH DIVIDE"
+ !! 4 byte integer Divide code for the Hitachi SH
+ #ifdef __SH4__
+-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
++!! and t bit
+
+ .global GLOBAL(udivsi3_i4)
++ FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ mov #1,r1
+ cmp/hi r1,r5
+@@ -1127,6 +1270,8 @@
+ L1:
+ .double 2147483648
+
++ ENDFUNC(GLOBAL(udivsi3_i4))
++
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
+
+@@ -1135,6 +1280,7 @@
+ .mode SHcompact
+ #endif
+ .global GLOBAL(udivsi3_i4)
++ FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ mov #1,r1
+ cmp/hi r1,r5
+@@ -1183,6 +1329,8 @@
+ #endif
+ .double 2147483648
+
++ ENDFUNC(GLOBAL(udivsi3_i4))
++
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1199,6 +1347,7 @@
+
+ !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
+ .global GLOBAL(udivsi3)
++ FUNC(GLOBAL(udivsi3))
+
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+@@ -1299,6 +1448,8 @@
+ ret: rts
+ mov r4,r0
+
++ ENDFUNC(GLOBAL(udivsi3))
++
+ #endif /* ! __SHMEDIA__ */
+ #endif /* __SH4__ */
+ #endif
+@@ -1308,6 +1459,7 @@
+ .mode SHcompact
+ #endif
+ .global GLOBAL(set_fpscr)
++ FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ lds r4,fpscr
+ mov.l LOCAL(set_fpscr_L1),r1
+@@ -1340,11 +1492,16 @@
+ .align 2
+ LOCAL(set_fpscr_L1):
+ .long GLOBAL(fpscr_values)
++
++ ENDFUNC(GLOBAL(set_fpscr))
++
++#ifndef NO_FPSCR_VALUES
+ #ifdef __ELF__
+ .comm GLOBAL(fpscr_values),8,4
+ #else
+ .comm GLOBAL(fpscr_values),8
+ #endif /* ELF */
++#endif /* NO_FPSCR_VALUES */
+ #endif /* SH3E / SH4 */
+ #endif /* L_set_fpscr */
+ #ifdef L_ic_invalidate
+@@ -1360,6 +1517,7 @@
+ blink tr0, r63
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ .global GLOBAL(ic_invalidate)
++ FUNC(GLOBAL(ic_invalidate))
+ GLOBAL(ic_invalidate):
+ ocbwb @r4
+ mova 0f,r0
+@@ -1382,6 +1540,9 @@
+ nop
+ .endr
+ .endr
++
++ ENDFUNC(GLOBAL(ic_invalidate))
++
+ #endif /* SH4 */
+ #endif /* L_ic_invalidate */
+
+diff -ruN gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver gcc-20030210/gcc/config/sh/libgcc-glibc.ver
+--- gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/libgcc-glibc.ver Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,21 @@
++# In order to work around the very problems that force us to now generally
++# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
++# By now choosing the same version tags for these specific routines, we
++# maintain enough binary compatibility to allow future versions of glibc
++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
++
++# Note that we cannot use the default libgcc-glibc.ver file on sh,
++# because GLIBC_2.0 does not exist on this architecture, as the first
++# ever glibc release on the platform was GLIBC_2.2.
++
++%inherit GCC_3.0 GLIBC_2.2
++GLIBC_2.2 {
++ __register_frame
++ __register_frame_table
++ __deregister_frame
++ __register_frame_info
++ __deregister_frame_info
++ __frame_state_for
++ __register_frame_info_table
++}
++
+diff -ruN gcc-20030210.orig/gcc/config/sh/linux.h gcc-20030210/gcc/config/sh/linux.h
+--- gcc-20030210.orig/gcc/config/sh/linux.h Tue Apr 16 05:27:42 2002
++++ gcc-20030210/gcc/config/sh/linux.h Sat Feb 22 01:40:14 2003
+@@ -19,6 +19,10 @@
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
++/* We're not SYSVR4, not having /usr/ccs */
++#undef MD_EXEC_PREFIX
++#undef MD_STARTFILE_PREFIX
++
+ /* Run-time Target Specification. */
+ #undef TARGET_VERSION
+ #define TARGET_VERSION fputs (" (SH GNU/Linux with ELF)", stderr);
+@@ -39,6 +43,28 @@
+ #undef WCHAR_TYPE_SIZE
+ #define WCHAR_TYPE_SIZE BITS_PER_WORD
+
++/* This was defined in linux.h. Define it here also. */
++#undef DEFAULT_VTABLE_THUNKS
++#define DEFAULT_VTABLE_THUNKS 1
++
++/* Likewise. */
++#define HANDLE_PRAGMA_PACK_PUSH_POP
++
++/* Pick up the return address upon entry to a procedure. Used for
++ dwarf2 unwind information. This also enables the table driven
++ mechanism. */
++
++#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PR_REG)
++#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (PR_REG)
++
++#undef CPP_SPEC
++#define CPP_SPEC "\
++ %{m4:-D__SH4__} \
++ %{!m4:%(cpp_default_cpu_spec)} \
++ %(subtarget_cpp_spec) \
++ %(subtarget_cpp_ptr_spec) \
++ %(subtarget_cpp_endian_spec) "
++
+ #undef SUBTARGET_CPP_SPEC
+ #define SUBTARGET_CPP_SPEC "\
+ %{fPIC:-D__PIC__ -D__pic__} \
+@@ -55,36 +81,45 @@
+ #undef CPP_DEFAULT_CPU_SPEC
+ #define CPP_DEFAULT_CPU_SPEC "-D__SH3__ -D__sh3__"
+
+-
+ #undef CPP_PREDEFINES
+ #define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sh__ -D__gnu_linux__ -Dlinux -Asystem=posix"
+
++/* The GNU C++ standard library requires that these macros be defined. */
++#undef CPLUSPLUS_CPP_SPEC
++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
+ #undef ASM_SPEC
+-#define ASM_SPEC "%{!mb:-little} %{mrelax:-relax}"
++#define ASM_SPEC "%{mb:-big} %{!mb:-little} %{mrelax:-relax}"
+
+ #undef CC1_SPEC
+ #define CC1_SPEC \
+- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}"
+-
+-#undef CC1PLUS_SPEC
+-#define CC1PLUS_SPEC \
+- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}"
++ "-musermode %{!mb:-ml} %{!m4:-m3} %{profile:-p}"
+
++/* XXX: It's wrong if prefix != /usr */
+ #undef LINK_SPEC
+ #define LINK_SPEC \
+- "%{!mb:-m shlelf_linux} %{mrelax:-relax} \
++ "%{!mb:-m shlelf_linux -EL} %{mb:-m shelf_linux -EB} %{mrelax:-relax} \
+ %{shared:-shared} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+- %{!rpath:-rpath /lib}} \
++ %{!mb:%{!m4:-rpath-link /usr/sh-linux/lib }} \
++ %{!mb:%{m4:-rpath-link /usr/sh-linux/lib/m4 }} \
++ %{mb:%{!m4:-rpath-link /usr/sh-linux/lib/mb }} \
++ %{mb:%{m4:-rpath-link /usr/sh-linux/lib/mb/m4 }}} \
+ %{static:-static}"
+
+ #undef LIB_SPEC
++#undef LIB_SPEC
+ #define LIB_SPEC \
+ "%{shared: -lc} \
+- %{!shared: %{pthread:-lthread} \
+- %{profile:-lc_p} %{!profile: -lc}}"
++ %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \
++ %{profile:-lc_p} %{!profile: -lc}}"
++
++#if defined(HAVE_LD_EH_FRAME_HDR)
++#undef LINK_EH_SPEC
++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
++#endif
+
+ #undef STARTFILE_SPEC
+ #define STARTFILE_SPEC \
+@@ -92,4 +127,40 @@
+ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
+ %{!p:%{profile:gcrt1.o%s} \
+ %{!profile:crt1.o%s}}}} \
+- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
++ crti.o%s %{static:crtbeginT.o%s}\
++ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
++
++#undef FUNCTION_PROFILER
++#define FUNCTION_PROFILER(STREAM,LABELNO) \
++do \
++{ \
++ if (flag_pic) \
++ { \
++ fprintf (STREAM, " mov.l 3f,r1\n"); \
++ fprintf (STREAM, " mova 3f,r0\n"); \
++ fprintf (STREAM, " add r1,r0\n"); \
++ fprintf (STREAM, " mov.l 1f,r1\n"); \
++ fprintf (STREAM, " mov.l @(r0,r1),r1\n"); \
++ } \
++ else \
++ { \
++ fprintf (STREAM, " mov.l 1f,r1\n"); \
++ } \
++ fprintf (STREAM, " sts.l pr,@-r15\n"); \
++ fprintf (STREAM, " mova 2f,r0\n"); \
++ fprintf (STREAM, " jmp @r1\n"); \
++ fprintf (STREAM, " lds r0,pr\n"); \
++ fprintf (STREAM, " .align 2\n"); \
++ if (flag_pic) \
++ { \
++ fprintf (STREAM, "1: .long mcount@GOT\n"); \
++ fprintf (STREAM, "3: .long _GLOBAL_OFFSET_TABLE_\n"); \
++ } \
++ else \
++ { \
++ fprintf (STREAM, "1: .long mcount\n"); \
++ } \
++ fprintf (STREAM, "2: lds.l @r15+,pr\n"); \
++} while (0)
++
++#define NO_SHARED_LIBGCC_MULTILIB
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh-protos.h gcc-20030210/gcc/config/sh/sh-protos.h
+--- gcc-20030210.orig/gcc/config/sh/sh-protos.h Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh-protos.h Sat Feb 22 01:40:14 2003
+@@ -74,6 +74,7 @@
+ extern int shl_sext_length PARAMS ((rtx));
+ extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx));
+ extern rtx gen_datalabel_ref PARAMS ((rtx));
++extern int shl_casesi_worker_length PARAMS ((rtx));
+ extern int regs_used PARAMS ((rtx, int));
+ extern void fixup_addr_diff_vecs PARAMS ((rtx));
+ extern int get_dest_uid PARAMS ((rtx, int));
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.c gcc-20030210/gcc/config/sh/sh.c
+--- gcc-20030210.orig/gcc/config/sh/sh.c Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh.c Sat Feb 22 01:40:14 2003
+@@ -2143,6 +2143,48 @@
+ return sym;
+ }
+
++
++/* Function to be used in the length attribute of the casesi_worker
++ instruction. Returns number of instructions, which is half of the
++ length of bytes. */
++
++int
++shl_casesi_worker_length (insn)
++ rtx insn;
++{
++ rtx set_src, label;
++ rtx diff_vec;
++
++ set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
++ if (!(GET_CODE (set_src) == UNSPEC
++ && XINT (set_src, 1) == UNSPEC_CASESI))
++ abort ();
++
++ label = XVECEXP (set_src, 0, 2);
++ if (GET_CODE (label) != LABEL_REF)
++ abort ();
++
++ diff_vec = PATTERN (next_real_insn (XEXP (label, 0)));
++
++ if (GET_CODE (diff_vec) != ADDR_DIFF_VEC)
++ abort ();
++
++ switch (GET_MODE (diff_vec))
++ {
++ case SImode:
++ return 2;
++ case HImode:
++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++ return 3;
++ return 2;
++ case QImode:
++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++ return 2;
++ return 1;
++ default:
++ abort ();
++ }
++}
+
+ /* The SH cannot load a large constant into a register, constants have to
+ come from a pc relative load. The reference of a pc relative load
+@@ -3190,7 +3232,7 @@
+ vec_lab = XEXP (XEXP (pat, 0), 0);
+
+ /* Search the matching casesi_jump_2. */
+- for (prev = vec_lab; ; prev = PREV_INSN (prev))
++ for (prev = vec_lab; prev; prev = PREV_INSN (prev))
+ {
+ if (GET_CODE (prev) != JUMP_INSN)
+ continue;
+@@ -3205,6 +3247,13 @@
+ break;
+ }
+
++ if (prev == NULL)
++ { /* Switch statement has been optimized out. */
++ delete_insn (PREV_INSN (insn));
++ delete_insn (insn);
++ continue;
++ }
++
+ /* Emit the reference label of the braf where it belongs, right after
+ the casesi_jump_2 (i.e. braf). */
+ braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);
+@@ -3223,7 +3272,7 @@
+ rtx barrier_or_label;
+ {
+ rtx next = next_real_insn (barrier_or_label), pat, prev;
+- int slot, credit, jump_to_next;
++ int slot, credit, jump_to_next = 0;
+
+ if (! next)
+ return 0;
+@@ -4507,7 +4556,8 @@
+ if (current_function_varargs || current_function_stdarg)
+ {
+ /* This is not used by the SH3E calling convention */
+- if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI)
++ if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI
++ || TARGET_NO_IMPLICIT_FP)
+ {
+ /* Push arg regs as if they'd been provided by caller in stack. */
+ for (i = 0; i < NPARM_REGS(SImode); i++)
+@@ -5149,7 +5199,8 @@
+ tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
+ tree record;
+
+- if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)
++ if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI
++ || TARGET_NO_IMPLICIT_FP)
+ return ptr_type_node;
+
+ record = make_node (RECORD_TYPE);
+@@ -5211,7 +5262,8 @@
+ return;
+ }
+
+- if ((! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)
++ if ((! TARGET_SH3E && ! TARGET_SH4)
++ || TARGET_HITACHI || TARGET_NO_IMPLICIT_FP)
+ {
+ std_expand_builtin_va_start (stdarg_p, valist, nextarg);
+ return;
+@@ -5289,7 +5341,8 @@
+ rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
+ pptr_type_node = build_pointer_type (ptr_type_node);
+
+- if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) && ! TARGET_HITACHI)
++ if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4)
++ && ! TARGET_HITACHI && ! TARGET_NO_IMPLICIT_FP)
+ {
+ tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
+ tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack;
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.h gcc-20030210/gcc/config/sh/sh.h
+--- gcc-20030210.orig/gcc/config/sh/sh.h Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh.h Sat Feb 22 01:40:14 2003
+@@ -147,10 +147,10 @@
+ #define HARD_SH4_BIT (1<<5)
+ #define FPU_SINGLE_BIT (1<<7)
+ #define SH4_BIT (1<<12)
++#define NO_IMPLICIT_FP_BIT (1<<3)
+ #define FMOVD_BIT (1<<4)
+ #define SH5_BIT (1<<0)
+ #define SPACE_BIT (1<<13)
+-#define BIGTABLE_BIT (1<<14)
+ #define RELAX_BIT (1<<15)
+ #define USERMODE_BIT (1<<16)
+ #define HITACHI_BIT (1<<22)
+@@ -205,6 +205,9 @@
+ /* Nonzero if we should generate code for a SH5 CPU (either ISA). */
+ #define TARGET_SH5 (target_flags & SH5_BIT)
+
++/* Nonzero if we should not use FPU implicitly. */
++#define TARGET_NO_IMPLICIT_FP (target_flags & NO_IMPLICIT_FP_BIT)
++
+ /* Nonzero if we should generate code using the SHcompact instruction
+ set and 32-bit ABI. */
+ #define TARGET_SHCOMPACT (TARGET_SH5 && TARGET_SH1)
+@@ -225,6 +228,7 @@
+
+ /* Nonzero if we should generate code using SHmedia FPU instructions. */
+ #define TARGET_SHMEDIA_FPU (TARGET_SHMEDIA && TARGET_FPU_DOUBLE)
++
+ /* Nonzero if we should generate fmovd. */
+ #define TARGET_FMOVD (target_flags & FMOVD_BIT)
+
+@@ -234,9 +238,6 @@
+ /* Nonzero if we should generate smaller code rather than faster code. */
+ #define TARGET_SMALLCODE (target_flags & SPACE_BIT)
+
+-/* Nonzero to use long jump tables. */
+-#define TARGET_BIGTABLE (target_flags & BIGTABLE_BIT)
+-
+ /* Nonzero to generate pseudo-ops needed by the assembler and linker
+ to do function call relaxing. */
+ #define TARGET_RELAX (target_flags & RELAX_BIT)
+@@ -297,7 +298,6 @@
+ {"5-compact-nofpu", TARGET_NONE, "" }, \
+ {"5-compact-nofpu", SH5_BIT|SH3_BIT|SH2_BIT|SH1_BIT, "Generate FPU-less SHcompact code" }, \
+ {"b", -LITTLE_ENDIAN_BIT, "" }, \
+- {"bigtable", BIGTABLE_BIT, "" }, \
+ {"dalign", DALIGN_BIT, "" }, \
+ {"fmovd", FMOVD_BIT, "" }, \
+ {"hitachi", HITACHI_BIT, "" }, \
+@@ -306,6 +306,7 @@
+ {"isize", ISIZE_BIT, "" }, \
+ {"l", LITTLE_ENDIAN_BIT, "" }, \
+ {"no-ieee", -IEEE_BIT, "" }, \
++ {"no-implicit-fp", NO_IMPLICIT_FP_BIT, "" }, \
+ {"padstruct", PADSTRUCT_BIT, "" }, \
+ {"prefergot", PREFERGOT_BIT, "" }, \
+ {"relax", RELAX_BIT, "" }, \
+@@ -2493,16 +2494,22 @@
+ goto LABEL; \
+ }
+
++extern int optimize; /* needed for gen_casesi. */
++extern int optimize_size;
++
+ /* Specify the machine mode that this machine uses
+ for the index in the tablejump instruction. */
+-#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode)
++#define CASE_VECTOR_MODE SImode
+
+ #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \
+ ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \
+ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \
+ : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \
+ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \
+- : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \
++ : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \
++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \
++ : optimize_size && (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \
++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \
+ : SImode)
+
+ /* Define as C expression which evaluates to nonzero if the tablejump
+@@ -3038,10 +3045,7 @@
+ /* Output an absolute table element. */
+
+ #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \
+- if (TARGET_BIGTABLE) \
+- asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); \
+- else \
+- asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); \
++ asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE))
+
+ /* Output various types of constants. */
+
+@@ -3167,8 +3171,6 @@
+ #define sh_cpu_attr ((enum attr_cpu)sh_cpu)
+ extern enum processor_type sh_cpu;
+
+-extern int optimize; /* needed for gen_casesi. */
+-
+ enum mdep_reorg_phase_e
+ {
+ SH_BEFORE_MDEP_REORG,
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.md gcc-20030210/gcc/config/sh/sh.md
+--- gcc-20030210.orig/gcc/config/sh/sh.md Sat Nov 23 04:58:06 2002
++++ gcc-20030210/gcc/config/sh/sh.md Sat Feb 22 01:40:14 2003
+@@ -1242,7 +1242,7 @@
+ (clobber (reg:SI PR_REG))
+ (clobber (reg:SI R4_REG))
+ (use (match_operand:SI 1 "arith_reg_operand" "r"))]
+- "TARGET_SH1 && ! TARGET_SH4"
++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP"
+ "jsr @%1%#"
+ [(set_attr "type" "sfunc")
+ (set_attr "needs_delay_slot" "yes")])
+@@ -1336,7 +1336,7 @@
+
+ operands[3] = gen_reg_rtx (Pmode);
+ /* Emit the move of the address to a pseudo outside of the libcall. */
+- if (TARGET_HARD_SH4 && TARGET_SH3E)
++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP)
+ {
+ emit_move_insn (operands[3],
+ gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\"));
+@@ -1391,7 +1391,7 @@
+ (clobber (reg:SI R2_REG))
+ (clobber (reg:SI R3_REG))
+ (use (match_operand:SI 1 "arith_reg_operand" "r"))]
+- "TARGET_SH1 && ! TARGET_SH4"
++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP"
+ "jsr @%1%#"
+ [(set_attr "type" "sfunc")
+ (set_attr "needs_delay_slot" "yes")])
+@@ -1476,7 +1476,7 @@
+
+ operands[3] = gen_reg_rtx (Pmode);
+ /* Emit the move of the address to a pseudo outside of the libcall. */
+- if (TARGET_HARD_SH4 && TARGET_SH3E)
++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP)
+ {
+ emit_move_insn (operands[3],
+ gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\"));
+@@ -6446,6 +6446,8 @@
+ case SImode:
+ return \"shll2 %1\;mov.l @(r0,%1),%0\";
+ case HImode:
++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++ return \"add %1,%1\;mov.w @(r0,%1),%0\;extu.w %0,%0\";
+ return \"add %1,%1\;mov.w @(r0,%1),%0\";
+ case QImode:
+ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
+@@ -6455,7 +6457,15 @@
+ abort ();
+ }
+ }"
+- [(set_attr "length" "4")])
++ [(set (attr "length")
++ (cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1))
++ (const_string "2")
++ (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2))
++ (const_string "4")
++ ;; Put "match_dup" here so that insn_variable_length_p return 1.
++ (ne (match_dup 2) (match_dup 2))
++ (const_string "4")]
++ (const_string "6")))])
+
+ (define_insn "casesi_shift_media"
+ [(set (match_operand 0 "arith_reg_operand" "=r")
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh3-linux.h gcc-20030210/gcc/config/sh/sh3-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh3-linux.h Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh3-linux.h Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION fputs (" (SH3 GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "-D__LITTLE_ENDIAN__ \
++ -D__SH3__ -D__sh3__ \
++ -D__SIZE_TYPE__=unsigned\\ int \
++ -D__PTRDIFF_TYPE__=int \
++ %{fPIC:-D__PIC__ -D__pic__} \
++ %{fpic:-D__PIC__ -D__pic__} \
++ %{posix:-D_POSIX_SOURCE} \
++ %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++ "-musermode -ml -m3 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{mrelax:-relax} \
++ %{shared:-shared} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++ %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h gcc-20030210/gcc/config/sh/sh3eb-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh3eb-linux.h Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION fputs (" (SH3EB GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "-D__BIG_ENDIAN__ \
++ -D__SH3__ -D__sh3__ \
++ -D__SIZE_TYPE__=unsigned\\ int \
++ -D__PTRDIFF_TYPE__=int \
++ %{fPIC:-D__PIC__ -D__pic__} \
++ %{fpic:-D__PIC__ -D__pic__} \
++ %{posix:-D_POSIX_SOURCE} \
++ %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++ "-musermode -mb -m3 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{mrelax:-relax} \
++ %{shared:-shared} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++ %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh4-linux.h gcc-20030210/gcc/config/sh/sh4-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh4-linux.h Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh4-linux.h Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION fputs (" (SH4 GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "-D__LITTLE_ENDIAN__ \
++ -D__SH4__ \
++ -D__SIZE_TYPE__=unsigned\\ int \
++ -D__PTRDIFF_TYPE__=int \
++ %{fPIC:-D__PIC__ -D__pic__} \
++ %{fpic:-D__PIC__ -D__pic__} \
++ %{posix:-D_POSIX_SOURCE} \
++ %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++ "-musermode -ml -m4 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{mrelax:-relax} \
++ %{shared:-shared} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++ %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h gcc-20030210/gcc/config/sh/sh4eb-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh4eb-linux.h Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION fputs (" (SH4EB GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "-D__BIG_ENDIAN__ \
++ -D__SH4__ \
++ -D__SIZE_TYPE__=unsigned\\ int \
++ -D__PTRDIFF_TYPE__=int \
++ %{fPIC:-D__PIC__ -D__pic__} \
++ %{fpic:-D__PIC__ -D__pic__} \
++ %{posix:-D_POSIX_SOURCE} \
++ %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++ "-musermode -mb -m4 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{mrelax:-relax} \
++ %{shared:-shared} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++ %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux gcc-20030210/gcc/config/sh/t-linux
+--- gcc-20030210.orig/gcc/config/sh/t-linux Thu May 17 12:16:12 2001
++++ gcc-20030210/gcc/config/sh/t-linux Sat Feb 22 01:40:14 2003
+@@ -1,10 +1,20 @@
+-TARGET_LIBGCC2_CFLAGS = -fpic
++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES
++LIBGCC1 = libgcc1-asm.a
++CROSS_LIBGCC1 = libgcc1-asm.a
++LIBGCC1_TEST = libgcc1-test
+ LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movstr \
+ _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \
+ _ic_invalidate
++LIB2ADDEH = $(srcdir)/unwind-sjlj.c
++LIB2ADDEHDEP = unwind.inc unwind-sjlj.c
+
+-MULTILIB_OPTIONS= mb m3e/m4
++MULTILIB_OPTIONS= mb m4
+ MULTILIB_DIRNAMES=
+ MULTILIB_MATCHES =
+
+-EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o
++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
++# Override t-slibgcc-elf-ver to export some libgcc symbols with
++# the symbol versions that glibc used and SH specific.
++SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
++ $(srcdir)/config/sh/libgcc-glibc.ver
+diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux-nomulti gcc-20030210/gcc/config/sh/t-linux-nomulti
+--- gcc-20030210.orig/gcc/config/sh/t-linux-nomulti Thu Jan 1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/t-linux-nomulti Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,9 @@
++LIBGCC = libgcc.a
++EXTRA_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o
++
++INSTALL_LIBGCC = install-libgcc
++
++MULTILIB_OPTIONS=
++MULTILIB_DIRNAMES=
++MULTILIB_MATCHES =
++EXTRA_MULTILIB_PARTS=
+diff -ruN gcc-20030210.orig/gcc/config.gcc gcc-20030210/gcc/config.gcc
+--- gcc-20030210.orig/gcc/config.gcc Fri Jan 31 19:17:13 2003
++++ gcc-20030210/gcc/config.gcc Sat Feb 22 01:40:14 2003
+@@ -337,9 +337,9 @@
+ sparc*-*-*)
+ cpu_type=sparc
+ ;;
+-sh64-*-*)
+- cpu_type=sh
+- ;;
++sh*-*-*)
++ cpu_type=sh
++ ;;
+ esac
+
+ tm_file=${cpu_type}/${cpu_type}.h
+@@ -3018,9 +3018,31 @@
+ thread_file='rtems'
+ fi
+ ;;
+-sh-*-linux*)
++sh*-*-linux*)
+ tm_file="${tm_file} sh/elf.h sh/linux.h"
+- tmake_file="sh/t-sh sh/t-elf sh/t-linux"
++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux sh/t-linux"
++ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
++ case $machine in
++ sh3eb-*)
++ tm_file="${tm_file} sh/sh3eb-linux.h"
++ tmake_file="${tmake_file} sh/t-linux-nomulti"
++ ;;
++ sh4eb-*)
++ tm_file="${tm_file} sh/sh4eb-linux.h"
++ tmake_file="${tmake_file} sh/t-linux-nomulti"
++ ;;
++ sh3-*)
++ tm_file="${tm_file} sh/sh3-linux.h"
++ tmake_file="${tmake_file} sh/t-linux-nomulti"
++ ;;
++ sh4-*)
++ tm_file="${tm_file} sh/sh4-linux.h"
++ tmake_file="${tmake_file} sh/t-linux-nomulti"
++ ;;
++ *)
++ ;;
++ esac
++ xmake_file=x-linux
+ gas=yes gnu_ld=yes
+ float_format=sh
+ ;;
+diff -ruN gcc-20030210.orig/gcc/dwarf2out.c gcc-20030210/gcc/dwarf2out.c
+--- gcc-20030210.orig/gcc/dwarf2out.c Mon Feb 10 19:36:25 2003
++++ gcc-20030210/gcc/dwarf2out.c Sat Feb 22 01:40:14 2003
+@@ -10224,7 +10224,9 @@
+ /* We can have a normal definition following an inline one in the
+ case of redefinition of GNU C extern inlines.
+ It seems reasonable to use AT_specification in this case. */
+- && !get_AT_unsigned (old_die, DW_AT_inline))
++ && !get_AT_unsigned (old_die, DW_AT_inline)
++ /* Skip the nested function. */
++ && !decl_function_context (decl))
+ {
+ /* ??? This can happen if there is a bug in the program, for
+ instance, if it has duplicate function definitions. Ideally,
+diff -ruN gcc-20030210.orig/gcc/final.c gcc-20030210/gcc/final.c
+--- gcc-20030210.orig/gcc/final.c Fri Jan 31 19:17:20 2003
++++ gcc-20030210/gcc/final.c Sat Feb 22 01:40:14 2003
+@@ -1128,7 +1128,7 @@
+ }
+ }
+
+- INSN_ADDRESSES (uid) = insn_current_address;
++ INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
+
+ if (GET_CODE (insn) == NOTE || GET_CODE (insn) == BARRIER
+ || GET_CODE (insn) == CODE_LABEL)
+diff -ruN gcc-20030210.orig/gcc/mkmap-symver.awk gcc-20030210/gcc/mkmap-symver.awk
+--- gcc-20030210.orig/gcc/mkmap-symver.awk Fri Jan 31 19:17:26 2003
++++ gcc-20030210/gcc/mkmap-symver.awk Sat Feb 22 01:40:14 2003
+@@ -89,7 +89,11 @@
+ output(inherit[lib]);
+
+ printf("%s {\n", lib);
+- printf(" global:\n");
++ for (sym in ver)
++ if ((ver[sym] == lib) && (sym in def))
++ count++;
++ if (count > 0)
++ printf(" global:\n");
+ for (sym in ver)
+ if ((ver[sym] == lib) && (sym in def))
+ {
+diff -ruN gcc-20030210.orig/gcc/reload1.c gcc-20030210/gcc/reload1.c
+--- gcc-20030210.orig/gcc/reload1.c Fri Jan 31 19:17:29 2003
++++ gcc-20030210/gcc/reload1.c Sat Feb 22 01:40:14 2003
+@@ -6103,6 +6103,7 @@
+ for (j = 0; j < n_reloads; j++)
+ if (rld[j].in != 0
+ && rld[j].when_needed != RELOAD_OTHER
++ && rld[j].when_needed != RELOAD_FOR_OUTPUT_ADDRESS
+ && reg_overlap_mentioned_for_reload_p (rld[j].in,
+ rld[i].in))
+ rld[j].when_needed
+diff -ruN gcc-20030210.orig/gcc/reorg.c gcc-20030210/gcc/reorg.c
+--- gcc-20030210.orig/gcc/reorg.c Fri Jan 31 19:17:30 2003
++++ gcc-20030210/gcc/reorg.c Sat Feb 22 01:40:14 2003
+@@ -3265,6 +3265,14 @@
+ || condjump_in_parallel_p (XVECEXP (PATTERN (insn), 0, 0))))
+ continue;
+
++#ifdef MD_CAN_REDIRECT_BRANCH
++ /* On some targets, branches with delay slots can have a limited
++ displacement. Give the back end a chance to tell us we can't do
++ this. */
++ if (! MD_CAN_REDIRECT_BRANCH (insn, delay_insn))
++ continue;
++#endif
++
+ target_label = JUMP_LABEL (delay_insn);
+
+ if (target_label)
+diff -ruN gcc-20030210.orig/gcc/tree-inline.c gcc-20030210/gcc/tree-inline.c
+--- gcc-20030210.orig/gcc/tree-inline.c Fri Jan 31 19:17:33 2003
++++ gcc-20030210/gcc/tree-inline.c Sat Feb 22 01:40:14 2003
+@@ -836,11 +836,17 @@
+
+ /* Don't try to inline functions that are not well-suited to
+ inlining. */
+- if (!inlinable_function_p (fn, id))
+- return NULL_TREE;
++ if (! inlinable_function_p (fn, id)
++ || ! (*lang_hooks.tree_inlining.start_inlining) (fn))
++ {
++ if (DECL_INLINE (fn) && warn_inline && ! flag_really_no_inline)
++ {
++ warning_with_decl (fn, "inlining failed in call to `%s'");
++ warning ("called from here");
++ }
+
+- if (! (*lang_hooks.tree_inlining.start_inlining) (fn))
+- return NULL_TREE;
++ return NULL_TREE;
++ }
+
+ /* Set the current filename and line number to the function we are
+ inlining so that when we create new _STMT nodes here they get
+diff -ruN gcc-20030210.orig/libjava/Makefile.in gcc-20030210/libjava/Makefile.in
+--- gcc-20030210.orig/libjava/Makefile.in Tue Jan 28 10:44:37 2003
++++ gcc-20030210/libjava/Makefile.in Sat Feb 22 01:40:14 2003
+@@ -1637,6 +1637,7 @@
+ "AS=$(AS)" \
+ "CC=$(CC)" \
+ "CXX=$(CXX)" \
++ "GCJ=$(GCJ)" \
+ "LD=$(LD)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "NM=$(NM)" \
+diff -ruN gcc-20030210.orig/libjava/configure gcc-20030210/libjava/configure
+--- gcc-20030210.orig/libjava/configure Tue Jan 28 10:44:37 2003
++++ gcc-20030210/libjava/configure Sat Feb 22 01:42:11 2003
+@@ -2031,7 +2031,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/libjava/java/net/natInetAddress.cc gcc-20030210/libjava/java/net/natInetAddress.cc
+--- gcc-20030210.orig/libjava/java/net/natInetAddress.cc Tue Mar 5 05:02:19 2002
++++ gcc-20030210/libjava/java/net/natInetAddress.cc Sat Feb 22 01:40:14 2003
+@@ -56,7 +56,7 @@
+ #endif
+
+ #ifndef HAVE_GETHOSTNAME_DECL
+-extern "C" int gethostname (char *name, int namelen);
++extern "C" int gethostname (char *name, unsigned int namelen);
+ #endif
+
+ #ifdef DISABLE_JAVA_NET
+diff -ruN gcc-20030210.orig/libjava/libltdl/aclocal.m4 gcc-20030210/libjava/libltdl/aclocal.m4
+--- gcc-20030210.orig/libjava/libltdl/aclocal.m4 Sun Sep 10 17:04:40 2000
++++ gcc-20030210/libjava/libltdl/aclocal.m4 Sat Feb 22 01:40:14 2003
+@@ -573,7 +573,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case "$host_cpu" in
+- alpha* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | i*86 | powerpc* | sparc* | ia64* | sh*)
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/libjava/sysdep/sh/locks.h gcc-20030210/libjava/sysdep/sh/locks.h
+--- gcc-20030210.orig/libjava/sysdep/sh/locks.h Thu Jan 1 09:00:00 1970
++++ gcc-20030210/libjava/sysdep/sh/locks.h Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,72 @@
++// locks.h - Thread synchronization primitives. SuperH implementation.
++
++/* Copyright (C) 2002 Free Software Foundation
++
++ This file is part of libgcj.
++
++This software is copyrighted work licensed under the terms of the
++Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
++details. */
++
++#ifndef __SYSDEP_LOCKS_H__
++#define __SYSDEP_LOCKS_H__
++
++typedef size_t obj_addr_t; /* Integer type big enough for object */
++ /* address. */
++
++static unsigned char __cas_lock = 0;
++
++inline static void
++__cas_start_atomic (void)
++{
++ unsigned int val;
++
++ do
++ __asm__ __volatile__ ("tas.b @%1; movt %0"
++ : "=r" (val)
++ : "r" (&__cas_lock)
++ : "memory");
++ while (val == 0);
++}
++
++inline static void
++__cas_end_atomic (void)
++{
++ __asm__ __volatile__ (" " : : : "memory");
++ __cas_lock = 0;
++}
++
++inline static bool
++compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old,
++ obj_addr_t new_val)
++{
++ bool ret;
++
++ __cas_start_atomic ();
++ if (*addr != old)
++ ret = false;
++ else
++ {
++ *addr = new_val;
++ ret = true;
++ }
++ __cas_end_atomic ();
++
++ return ret;
++}
++
++inline static void
++release_set (volatile obj_addr_t *addr, obj_addr_t new_val)
++{
++ __asm__ __volatile__ (" " : : : "memory");
++ *(addr) = new_val;
++}
++
++inline static bool
++compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old,
++ obj_addr_t new_val)
++{
++ return compare_and_swap (addr, old, new_val);
++}
++
++#endif /* ! __SYSDEP_LOCKS_H__ */
+diff -ruN gcc-20030210.orig/libstdc++-v3/acinclude.m4 gcc-20030210/libstdc++-v3/acinclude.m4
+--- gcc-20030210.orig/libstdc++-v3/acinclude.m4 Tue Jan 28 02:30:41 2003
++++ gcc-20030210/libstdc++-v3/acinclude.m4 Sat Feb 22 01:40:14 2003
+@@ -1828,9 +1828,10 @@
+ GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+
+ # Passed down for canadian crosses.
+- if test x"$CANADIAN" = xyes; then
+- TOPLEVEL_INCLUDES='-I$(includedir)'
+- fi
++ #if test x"$CANADIAN" = xyes; then
++ # TOPLEVEL_INCLUDES='-I$(includedir)'
++ #fi
++ TOPLEVEL_INCLUDES=''
+
+ LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+
+diff -ruN gcc-20030210.orig/libstdc++-v3/aclocal.m4 gcc-20030210/libstdc++-v3/aclocal.m4
+--- gcc-20030210.orig/libstdc++-v3/aclocal.m4 Mon Feb 10 19:36:47 2003
++++ gcc-20030210/libstdc++-v3/aclocal.m4 Sat Feb 22 01:40:14 2003
+@@ -1840,9 +1840,10 @@
+ GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+
+ # Passed down for canadian crosses.
+- if test x"$CANADIAN" = xyes; then
+- TOPLEVEL_INCLUDES='-I$(includedir)'
+- fi
++ #if test x"$CANADIAN" = xyes; then
++ # TOPLEVEL_INCLUDES='-I$(includedir)'
++ #fi
++ TOPLEVEL_INCLUDES=''
+
+ LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+
+diff -ruN gcc-20030210.orig/libstdc++-v3/configure gcc-20030210/libstdc++-v3/configure
+--- gcc-20030210.orig/libstdc++-v3/configure Mon Feb 10 19:37:17 2003
++++ gcc-20030210/libstdc++-v3/configure Sat Feb 22 01:40:14 2003
+@@ -1982,7 +1982,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh*)
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+@@ -22340,9 +22340,10 @@
+ GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+
+ # Passed down for canadian crosses.
+- if test x"$CANADIAN" = xyes; then
+- TOPLEVEL_INCLUDES='-I$(includedir)'
+- fi
++ #if test x"$CANADIAN" = xyes; then
++ # TOPLEVEL_INCLUDES='-I$(includedir)'
++ #fi
++ TOPLEVEL_INCLUDES=''
+
+ LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+
+diff -ruN gcc-20030210.orig/libtool.m4 gcc-20030210/libtool.m4
+--- gcc-20030210.orig/libtool.m4 Fri Jan 31 19:16:59 2003
++++ gcc-20030210/libtool.m4 Sat Feb 22 01:40:14 2003
+@@ -597,7 +597,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/zlib/configure gcc-20030210/zlib/configure
+--- gcc-20030210.orig/zlib/configure Tue Jan 28 10:44:15 2003
++++ gcc-20030210/zlib/configure Sat Feb 22 01:40:14 2003
+@@ -1571,7 +1571,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch
new file mode 100644
index 0000000..0de46fc
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch
@@ -0,0 +1,98 @@
+g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003
+
+The first hunk fixes the error
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+ while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+ (procedure "g++_include_flags" line 21)
+ invoked from within
+"g++_include_flags [get_multilibs] "
+ (procedure "g++_init" line 63)
+ invoked from within
+"${tool}_init $test_file_name"
+ (procedure "runtest" line 19)
+ invoked from within
+"runtest $test_name"
+ ("foreach" body line 42)
+ invoked from within
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+The fix isn't especially pretty, but it worked for me, and can't hurt the
+more common native compiler case. Maybe someone who knows the code better
+can come up with a better fix.
+
+The second hunk fixes the error
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+when trying to compile g++ testcases (!); setting up
+the shared library environment when running crosstests of g++
+should either be done by a special board file, or by
+setting up a remote chroot environment (see http://kegel.com/crosstool),
+not by blithely setting LD_LIBRARY_PATH on the local system.
+
+--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003
++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003
+@@ -72,6 +72,8 @@
+ #
+ proc g++_include_flags { paths } {
+ global srcdir
++ global objdir
++ global target_triplet
+ global HAVE_LIBSTDCXX_V3
+ global TESTING_IN_BUILD_TREE
+
+@@ -90,6 +92,20 @@
+
+ if { ${HAVE_LIBSTDCXX_V3} } {
+ set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++ if { $odir_v3 == "" } {
++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++ # first assume no multilibs
++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++ }
++ if { $odir_v3 == "" } {
++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++ # assume multilib only one level deep
++ set multisub [file tail $gccpath]
++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++ }
++ if { $odir_v3 == "" } {
++ error "Can't find libstdc++-v3"
++ }
+ append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+ } else {
+ set odir_v2 [lookfor_file ${gccpath} libstdc++]
+@@ -192,16 +192,20 @@
+ }
+ }
+
+- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+- # (for the 64-bit ABI). The right way to do this would be to modify
+- # unix.exp -- but that's not an option since it's part of DejaGNU
+- # proper, so we do it here. We really only need to do
+- # this on IRIX, but it shouldn't hurt to do it anywhere else.
+- setenv LD_LIBRARY_PATH $ld_library_path
+- setenv SHLIB_PATH $ld_library_path
+- setenv LD_LIBRARYN32_PATH $ld_library_path
+- setenv LD_LIBRARY64_PATH $ld_library_path
++ if {![is_remote target]} {
++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++ # (for the 64-bit ABI). The right way to do this would be to modify
++ # unix.exp -- but that's not an option since it's part of DejaGNU
++ # proper, so we do it here. We really only need to do
++ # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++ # Doing this causes us to be unable to run cross-compilers.
++ setenv LD_LIBRARY_PATH $ld_library_path
++ setenv SHLIB_PATH $ld_library_path
++ setenv LD_LIBRARYN32_PATH $ld_library_path
++ setenv LD_LIBRARY64_PATH $ld_library_path
++ }
+
+ return "$flags"
+ }
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch
new file mode 100644
index 0000000..db78ba1
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch
@@ -0,0 +1,6864 @@
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am
+--- gcc-3.2.2.orig/libffi/Makefile.am Tue Jan 28 10:43:56 2003
++++ gcc/libffi/Makefile.am Tue Jan 28 10:48:33 2003
+@@ -8,14 +8,17 @@
+ src/mips/n32.s src/mips/o32.S src/mips/o32.s \
+ src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
+ src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
++ src/x86/ffi64.c src/x86/unix64.S \
+ src/alpha/ffi.c src/alpha/osf.S \
+ src/m68k/ffi.c src/m68k/sysv.S \
+ src/powerpc/ffi.c src/powerpc/sysv.S \
+ src/powerpc/ppc_closure.S src/powerpc/asm.h \
+ src/powerpc/ffi_darwin.c \
+ src/powerpc/darwin.S src/powerpc/aix.S \
+- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
+- src/arm/ffi.c src/arm/sysv.S
++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
++ src/arm/ffi.c src/arm/sysv.S \
++ src/s390/ffi.c src/s390/sysv.S \
++ src/sh/ffi.c src/sh/sysv.S
+
+ VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
+
+@@ -83,6 +86,7 @@
+ ffitest_LDFLAGS = -shared-libgcc
+
+ TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
+ TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
+ TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
+ TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
+@@ -91,9 +95,12 @@
+ TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
+ TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
+ TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+ TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+ TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
+
+ ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@)
+ ## Work around automake deficiency
+@@ -103,6 +110,10 @@
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
+ endif
++if MIPS_LINUX
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
++endif
+ if MIPS_SGI
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+@@ -147,6 +158,18 @@
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
+ endif
++if S390
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++endif
++if X86_64
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++endif
++if SH
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
++libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
++endif
+
+ AM_CFLAGS = -fexceptions
+
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in
+--- gcc-3.2.2.orig/libffi/Makefile.in Wed Jan 29 07:59:05 2003
++++ gcc/libffi/Makefile.in Wed Jan 29 07:58:58 2003
+@@ -91,14 +91,17 @@
+ src/mips/n32.s src/mips/o32.S src/mips/o32.s \
+ src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
+ src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
++ src/x86/ffi64.c src/x86/unix64.S \
+ src/alpha/ffi.c src/alpha/osf.S \
+ src/m68k/ffi.c src/m68k/sysv.S \
+ src/powerpc/ffi.c src/powerpc/sysv.S \
+ src/powerpc/ppc_closure.S src/powerpc/asm.h \
+ src/powerpc/ffi_darwin.c \
+ src/powerpc/darwin.S src/powerpc/aix.S \
+- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
+- src/arm/ffi.c src/arm/sysv.S
++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
++ src/arm/ffi.c src/arm/sysv.S \
++ src/s390/ffi.c src/s390/sysv.S \
++ src/sh/ffi.c src/sh/sysv.S
+
+
+ VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
+@@ -162,6 +165,7 @@
+ ffitest_LDFLAGS = -shared-libgcc
+
+ TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
+ TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
+ TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
+ TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
+@@ -170,14 +174,18 @@
+ TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
+ TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
+ TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+ TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+ TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
+
+ libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+ src/raw_api.c src/java_raw_api.c
+
+ @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
++@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
+ @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
+ @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
+@@ -189,7 +197,11 @@
+ @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
+ @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
+ @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
++@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
+ @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
++@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
+ @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
+ @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
+@@ -201,6 +213,9 @@
+ @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
+ @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
+ @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
++@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
+
+ AM_CFLAGS = -fexceptions
+
+@@ -208,7 +223,7 @@
+
+ INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
+ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
++mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs
+ CONFIG_HEADER = fficonfig.h
+ CONFIG_CLEAN_FILES =
+ LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
+@@ -220,10 +235,6 @@
+ LIBS = @LIBS@
+ libffi_convenience_la_LDFLAGS =
+ libffi_convenience_la_LIBADD =
+-@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
+-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
+ @ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+ @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo
+@@ -234,12 +245,29 @@
+ @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
+ @MIPS_GCC_TRUE@src/mips/n32.lo
+-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
++@S390_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
+ @M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+ @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
++@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
++@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
++@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
++@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
++@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo
++@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
++@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
++@X86_64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
++@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \
++@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo
+ @SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+ @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \
+@@ -247,62 +275,75 @@
+ @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+ @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
+-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo
+-@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
+-@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
++@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo
++@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
++@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
++@MIPS_SGI_TRUE@src/mips/n32.lo
+ @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+ @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
+-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
+-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
+-@MIPS_SGI_TRUE@src/mips/n32.lo
++@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
++@SH_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo
+ libffi_la_LIBADD =
++@SH_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
++@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \
++@SH_TRUE@src/sh/ffi.lo
++@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
++@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
++@X86_TRUE@src/x86/sysv.lo
+ @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+ @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \
+ @POWERPC_TRUE@src/powerpc/ppc_closure.lo
+-@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
+-@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
+-@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+-@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
+-@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@MIPS_LINUX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo
+ @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+ @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo
+ @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+ @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \
+-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo
+-@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
+-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
+-@X86_TRUE@src/x86/sysv.lo
++@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo
++@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+ @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
+ @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \
+ @ARM_TRUE@src/arm/ffi.lo
++@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
++@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
++@S390_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
++@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
++@X86_64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
++@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \
++@X86_64_TRUE@src/x86/sysv.lo
+ @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+ @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
+-@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
+-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+ noinst_PROGRAMS = ffitest$(EXEEXT)
+ PROGRAMS = $(noinst_PROGRAMS)
+
+@@ -578,8 +616,8 @@
+ -chmod 777 $(distdir)
+ $(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \
+ $(distdir)/src/m68k $(distdir)/src/mips \
+- $(distdir)/src/powerpc $(distdir)/src/sparc \
+- $(distdir)/src/x86
++ $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \
++ $(distdir)/src/sparc $(distdir)/src/x86
+ @for file in $(DISTFILES); do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4
+--- gcc-3.2.2.orig/libffi/acinclude.m4 Sun Sep 10 16:43:14 2000
++++ gcc/libffi/acinclude.m4 Tue Dec 17 03:22:47 2002
+@@ -4,5 +4,8 @@
+ dnl to add a definition of LIBTOOL to Makefile.in.
+ ifelse(yes,no,[
+ AC_DEFUN([AC_PROG_LIBTOOL],)
++AC_DEFUN([AM_PROG_LIBTOOL],)
+ AC_SUBST(LIBTOOL)
+ ])
++
++sinclude(../config/accross.m4)
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4
+--- gcc-3.2.2.orig/libffi/aclocal.m4 Fri Feb 1 07:25:31 2002
++++ gcc/libffi/aclocal.m4 Tue Dec 17 03:22:47 2002
+@@ -1,6 +1,6 @@
+-dnl aclocal.m4 generated automatically by aclocal 1.4
++dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+ dnl This file is free software; the Free Software Foundation
+ dnl gives unlimited permission to copy and/or distribute it,
+ dnl with or without modifications, as long as this notice is preserved.
+@@ -16,108 +16,15 @@
+ dnl to add a definition of LIBTOOL to Makefile.in.
+ ifelse(yes,no,[
+ AC_DEFUN([AC_PROG_LIBTOOL],)
++AC_DEFUN([AM_PROG_LIBTOOL],)
+ AC_SUBST(LIBTOOL)
+ ])
+
+-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
+-[changequote(<<, >>)dnl
+-dnl The name to #define.
+-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+-dnl The cache variable name.
+-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+-changequote([, ])dnl
+-AC_MSG_CHECKING(size of $1)
+-AC_CACHE_VAL(AC_CV_NAME,
+-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence.
+- AC_TRY_COMPILE([#include "confdefs.h"
+-#include <sys/types.h>
+-$2
+-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
+- if test x$AC_CV_NAME != x ; then break; fi
+-done
+-])
+-if test x$AC_CV_NAME = x ; then
+- AC_MSG_ERROR([cannot determine a size for $1])
+-fi
+-AC_MSG_RESULT($AC_CV_NAME)
+-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
+-undefine([AC_TYPE_NAME])dnl
+-undefine([AC_CV_NAME])dnl
+-])
+-
+-AC_DEFUN([AC_C_BIGENDIAN_CROSS],
+-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
+-[ac_cv_c_bigendian=unknown
+-# See if sys/param.h defines the BYTE_ORDER macro.
+-AC_TRY_COMPILE([#include <sys/types.h>
+-#include <sys/param.h>], [
+-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+- bogus endian macros
+-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
+-AC_TRY_COMPILE([#include <sys/types.h>
+-#include <sys/param.h>], [
+-#if BYTE_ORDER != BIG_ENDIAN
+- not big endian
+-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
+-if test $ac_cv_c_bigendian = unknown; then
+-AC_TRY_RUN([main () {
+- /* Are we little or big endian? From Harbison&Steele. */
+- union
+- {
+- long l;
+- char c[sizeof (long)];
+- } u;
+- u.l = 1;
+- exit (u.c[sizeof (long) - 1] == 1);
+-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
+-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
+-fi])
+-if test $ac_cv_c_bigendian = unknown; then
+-AC_MSG_CHECKING(to probe for byte ordering)
+-[
+-cat >conftest.c <<EOF
+-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
+-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
+-int main() { _ascii (); _ebcdic (); return 0; }
+-EOF
+-] if test -f conftest.c ; then
+- if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then
+- if test `grep -l BIGenDianSyS conftest.o` ; then
+- echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
+- ac_cv_c_bigendian=yes
+- fi
+- if test `grep -l LiTTleEnDian conftest.o` ; then
+- echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
+- if test $ac_cv_c_bigendian = yes ; then
+- ac_cv_c_bigendian=unknown;
+- else
+- ac_cv_c_bigendian=no
+- fi
+- fi
+- echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG
+- fi
+- fi
+-AC_MSG_RESULT($ac_cv_c_bigendian)
+-fi
+-if test $ac_cv_c_bigendian = yes; then
+- AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
+- BYTEORDER=4321
+-else
+- BYTEORDER=1234
+-fi
+-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
+-if test $ac_cv_c_bigendian = unknown; then
+- AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
+-fi
+-])
++sinclude(../config/accross.m4)
+
+ # Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+-AC_DEFUN(AM_CONFIG_HEADER,
++AC_DEFUN([AM_CONFIG_HEADER],
+ [AC_PREREQ([2.12])
+ AC_CONFIG_HEADER([$1])
+ dnl When config.status generates a header, we must update the stamp-h file.
+@@ -147,7 +54,7 @@
+ dnl Usage:
+ dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+-AC_DEFUN(AM_INIT_AUTOMAKE,
++AC_DEFUN([AM_INIT_AUTOMAKE],
+ [AC_REQUIRE([AC_PROG_INSTALL])
+ PACKAGE=[$1]
+ AC_SUBST(PACKAGE)
+@@ -175,7 +82,7 @@
+ # Check to make sure that the build environment is sane.
+ #
+
+-AC_DEFUN(AM_SANITY_CHECK,
++AC_DEFUN([AM_SANITY_CHECK],
+ [AC_MSG_CHECKING([whether build environment is sane])
+ # Just in case
+ sleep 1
+@@ -216,7 +123,7 @@
+
+ dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+ dnl The program must properly implement --version.
+-AC_DEFUN(AM_MISSING_PROG,
++AC_DEFUN([AM_MISSING_PROG],
+ [AC_MSG_CHECKING(for working $2)
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+@@ -235,7 +142,7 @@
+
+ # serial 1
+
+-AC_DEFUN(AM_MAINTAINER_MODE,
++AC_DEFUN([AM_MAINTAINER_MODE],
+ [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+@@ -252,7 +159,7 @@
+
+ # Define a conditional.
+
+-AC_DEFUN(AM_CONDITIONAL,
++AC_DEFUN([AM_CONDITIONAL],
+ [AC_SUBST($1_TRUE)
+ AC_SUBST($1_FALSE)
+ if $2; then
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure
+--- gcc-3.2.2.orig/libffi/configure Wed Jan 29 07:59:05 2003
++++ gcc/libffi/configure Sat Feb 1 20:16:19 2003
+@@ -633,17 +633,16 @@
+
+ if test "${srcdir}" = "."; then
+ if test "${with_target_subdir}" != "."; then
+- libffi_basedir="${srcdir}/${with_multisrctop}.."
++ libffi_basedir="${with_multisrctop}../"
+ else
+- libffi_basedir="${srcdir}/${with_multisrctop}"
++ libffi_basedir="${with_multisrctop}"
+ fi
+ else
+- libffi_basedir="${srcdir}"
++ libffi_basedir=
+ fi
+
+-
+ ac_aux_dir=
+-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
++for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+@@ -655,13 +654,14 @@
+ fi
+ done
+ if test -z "$ac_aux_dir"; then
+- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
++ { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; }
+ fi
+ ac_config_guess=$ac_aux_dir/config.guess
+ ac_config_sub=$ac_aux_dir/config.sub
+ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
++
+ # Make sure we can run config.sub.
+ if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+@@ -1238,9 +1238,18 @@
+ ;;
+
+ hpux10.20*|hpux11*)
+- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+- lt_cv_file_magic_cmd=/usr/bin/file
+- lt_cv_file_magic_test_file=/usr/lib/libc.sl
++ case $host_cpu in
++ hppa*)
++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
++ lt_cv_file_magic_cmd=/usr/bin/file
++ lt_cv_file_magic_test_file=/usr/lib/libc.sl
++ ;;
++ ia64*)
++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
++ lt_cv_file_magic_cmd=/usr/bin/file
++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
++ ;;
++ esac
+ ;;
+
+ irix5* | irix6*)
+@@ -1267,7 +1276,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+ case $host_cpu in
+- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+@@ -1330,13 +1339,13 @@
+ deplibs_check_method=$lt_cv_deplibs_check_method
+
+ echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+-echo "configure:1334: checking for object suffix" >&5
++echo "configure:1343: checking for object suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ rm -f conftest*
+ echo 'int i = 1;' > conftest.$ac_ext
+-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ for ac_file in conftest.*; do
+ case $ac_file in
+ *.c) ;;
+@@ -1356,7 +1365,7 @@
+
+
+ echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+-echo "configure:1360: checking for executable suffix" >&5
++echo "configure:1369: checking for executable suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1366,7 +1375,7 @@
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+- if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++ if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj) ;;
+@@ -1399,7 +1408,7 @@
+ file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
+-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5
++echo "configure:1412: checking for ${ac_tool_prefix}file" >&5
+ if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1461,7 +1470,7 @@
+ if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo $ac_n "checking for file""... $ac_c" 1>&6
+-echo "configure:1465: checking for file" >&5
++echo "configure:1474: checking for file" >&5
+ if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1532,7 +1541,7 @@
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1536: checking for $ac_word" >&5
++echo "configure:1545: 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
+@@ -1564,7 +1573,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:1568: checking for $ac_word" >&5
++echo "configure:1577: 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
+@@ -1599,7 +1608,7 @@
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}strip; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1603: checking for $ac_word" >&5
++echo "configure:1612: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1631,7 +1640,7 @@
+ # Extract the first word of "strip", so it can be a program name with args.
+ set dummy strip; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1635: checking for $ac_word" >&5
++echo "configure:1644: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1698,8 +1707,8 @@
+ case $host in
+ *-*-irix6*)
+ # Find out which ABI we are using.
+- echo '#line 1702 "configure"' > conftest.$ac_ext
+- if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++ echo '#line 1711 "configure"' > conftest.$ac_ext
++ if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+@@ -1715,12 +1724,70 @@
+ rm -rf conftest*
+ ;;
+
++ia64-*-hpux*)
++ # Find out which ABI we are using.
++ echo 'int i;' > conftest.$ac_ext
++ if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++ case "`/usr/bin/file conftest.o`" in
++ *ELF-32*)
++ HPUX_IA64_MODE="32"
++ ;;
++ *ELF-64*)
++ HPUX_IA64_MODE="64"
++ ;;
++ esac
++ fi
++ rm -rf conftest*
++ ;;
++
++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
++ # Find out which ABI we are using.
++ echo 'int i;' > conftest.$ac_ext
++ if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++ case "`/usr/bin/file conftest.o`" in
++ *32-bit*)
++ case $host in
++ x86_64-*linux*)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ ppc64-*linux*)
++ LD="${LD-ld} -m elf32ppclinux"
++ ;;
++ s390x-*linux*)
++ LD="${LD-ld} -m elf_s390"
++ ;;
++ sparc64-*linux*)
++ LD="${LD-ld} -m elf32_sparc"
++ ;;
++ esac
++ ;;
++ *64-bit*)
++ case $host in
++ x86_64-*linux*)
++ LD="${LD-ld} -m elf_x86_64"
++ ;;
++ ppc*-*linux*|powerpc*-*linux*)
++ LD="${LD-ld} -m elf64ppc"
++ ;;
++ s390*-*linux*)
++ LD="${LD-ld} -m elf64_s390"
++ ;;
++ sparc*-*linux*)
++ LD="${LD-ld} -m elf64_sparc"
++ ;;
++ esac
++ ;;
++ esac
++ fi
++ rm -rf conftest*
++ ;;
++
+ *-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+-echo "configure:1724: checking whether the C compiler needs -belf" >&5
++echo "configure:1791: checking whether the C compiler needs -belf" >&5
+ if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1733,14 +1800,14 @@
+ cross_compiling=$ac_cv_prog_cc_cross
+
+ cat > conftest.$ac_ext <<EOF
+-#line 1737 "configure"
++#line 1804 "configure"
+ #include "confdefs.h"
+
+ int main() {
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=yes
+ else
+@@ -1868,7 +1935,7 @@
+ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+ # ./install, which can be erroneously created by make from ./install.sh.
+ echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+-echo "configure:1872: checking for a BSD compatible install" >&5
++echo "configure:1939: checking for a BSD compatible install" >&5
+ if test -z "$INSTALL"; then
+ if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -1921,7 +1988,7 @@
+ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+ echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+-echo "configure:1925: checking whether build environment is sane" >&5
++echo "configure:1992: checking whether build environment is sane" >&5
+ # Just in case
+ sleep 1
+ echo timestamp > conftestfile
+@@ -1978,7 +2045,7 @@
+ test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+ echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5
++echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5
+ set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -2017,7 +2084,7 @@
+
+ missing_dir=`cd $ac_aux_dir && pwd`
+ echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+-echo "configure:2021: checking for working aclocal" >&5
++echo "configure:2088: checking for working aclocal" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf. Sigh.
+@@ -2030,7 +2097,7 @@
+ fi
+
+ echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+-echo "configure:2034: checking for working autoconf" >&5
++echo "configure:2101: checking for working autoconf" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf. Sigh.
+@@ -2043,7 +2110,7 @@
+ fi
+
+ echo $ac_n "checking for working automake""... $ac_c" 1>&6
+-echo "configure:2047: checking for working automake" >&5
++echo "configure:2114: checking for working automake" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf. Sigh.
+@@ -2056,7 +2123,7 @@
+ fi
+
+ echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+-echo "configure:2060: checking for working autoheader" >&5
++echo "configure:2127: checking for working autoheader" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf. Sigh.
+@@ -2069,7 +2136,7 @@
+ fi
+
+ echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+-echo "configure:2073: checking for working makeinfo" >&5
++echo "configure:2140: checking for working makeinfo" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf. Sigh.
+@@ -2086,7 +2153,7 @@
+
+
+ echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+-echo "configure:2090: checking for executable suffix" >&5
++echo "configure:2157: checking for executable suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2096,7 +2163,7 @@
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+- if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++ if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj) ;;
+@@ -2117,7 +2184,7 @@
+ ac_exeext=$EXEEXT
+
+ echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5
++echo "configure:2188: 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"
+@@ -2143,7 +2210,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:2147: checking for $ac_word" >&5
++echo "configure:2214: 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
+@@ -2173,7 +2240,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:2177: checking for $ac_word" >&5
++echo "configure:2244: 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
+@@ -2224,7 +2291,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:2228: checking for $ac_word" >&5
++echo "configure:2295: 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
+@@ -2256,7 +2323,7 @@
+ fi
+
+ echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
++echo "configure:2327: 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.
+@@ -2267,12 +2334,12 @@
+
+ cat > conftest.$ac_ext << EOF
+
+-#line 2271 "configure"
++#line 2338 "configure"
+ #include "confdefs.h"
+
+ main(){return(0);}
+ EOF
+-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2343: \"$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
+@@ -2298,12 +2365,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:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
++echo "configure:2369: 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:2307: checking whether we are using GNU C" >&5
++echo "configure:2374: 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
+@@ -2312,7 +2379,7 @@
+ yes;
+ #endif
+ EOF
+-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$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:2383: \"$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
+@@ -2331,7 +2398,7 @@
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5
++echo "configure:2402: 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
+@@ -2381,17 +2448,23 @@
+ i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
+ sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
+ sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
+ ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
+ m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
++mips64*-*);;
++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
+ powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
+ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
++sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
+ esac
+
+ if test $TARGETDIR = unknown; then
+@@ -2418,6 +2491,15 @@
+ fi
+
+
++if test x$TARGET = xMIPS_LINUX; then
++ MIPS_LINUX_TRUE=
++ MIPS_LINUX_FALSE='#'
++else
++ MIPS_LINUX_TRUE='#'
++ MIPS_LINUX_FALSE=
++fi
++
++
+ if test x$TARGET = xSPARC; then
+ SPARC_TRUE=
+ SPARC_FALSE='#'
+@@ -2507,8 +2589,39 @@
+ ARM_FALSE=
+ fi
+
++
++if test x$TARGET = xS390; then
++ S390_TRUE=
++ S390_FALSE='#'
++else
++ S390_TRUE='#'
++ S390_FALSE=
++fi
++
++
++if test x$TARGET = xX86_64; then
++ X86_64_TRUE=
++ X86_64_FALSE='#'
++else
++ X86_64_TRUE='#'
++ X86_64_FALSE=
++fi
++
++
++if test x$TARGET = xSH; then
++ SH_TRUE=
++ SH_FALSE='#'
++else
++ SH_TRUE='#'
++ SH_FALSE=
++fi
++
++if test x$TARGET = xMIPS_LINUX; then
++ TARGET=MIPS
++fi
++
+ echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+-echo "configure:2512: checking how to run the C preprocessor" >&5
++echo "configure:2625: checking how to run the C preprocessor" >&5
+ # On Suns, sometimes $CPP names a directory.
+ if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+@@ -2523,13 +2636,13 @@
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+-#line 2527 "configure"
++#line 2640 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ :
+@@ -2540,13 +2653,13 @@
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+-#line 2544 "configure"
++#line 2657 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ :
+@@ -2557,13 +2670,13 @@
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+-#line 2561 "configure"
++#line 2674 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ :
+@@ -2588,12 +2701,12 @@
+ echo "$ac_t""$CPP" 1>&6
+
+ echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+-echo "configure:2592: checking for ANSI C header files" >&5
++echo "configure:2705: checking for ANSI C header files" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2597 "configure"
++#line 2710 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ #include <stdarg.h>
+@@ -2601,7 +2714,7 @@
+ #include <float.h>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ rm -rf conftest*
+@@ -2618,7 +2731,7 @@
+ if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 2622 "configure"
++#line 2735 "configure"
+ #include "confdefs.h"
+ #include <string.h>
+ EOF
+@@ -2636,7 +2749,7 @@
+ if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 2640 "configure"
++#line 2753 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ EOF
+@@ -2657,7 +2770,7 @@
+ :
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2661 "configure"
++#line 2774 "configure"
+ #include "confdefs.h"
+ #include <ctype.h>
+ #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+@@ -2668,7 +2781,7 @@
+ exit (0); }
+
+ EOF
+-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+ :
+ else
+@@ -2694,12 +2807,12 @@
+ for ac_func in memcpy
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:2698: checking for $ac_func" >&5
++echo "configure:2811: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2703 "configure"
++#line 2816 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -2722,7 +2835,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -2749,19 +2862,19 @@
+ # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+ # for constant arguments. Useless!
+ echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+-echo "configure:2753: checking for working alloca.h" >&5
++echo "configure:2866: checking for working alloca.h" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2758 "configure"
++#line 2871 "configure"
+ #include "confdefs.h"
+ #include <alloca.h>
+ int main() {
+ char *p = alloca(2 * sizeof(int));
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+ else
+@@ -2782,12 +2895,12 @@
+ fi
+
+ echo $ac_n "checking for alloca""... $ac_c" 1>&6
+-echo "configure:2786: checking for alloca" >&5
++echo "configure:2899: checking for alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2791 "configure"
++#line 2904 "configure"
+ #include "confdefs.h"
+
+ #ifdef __GNUC__
+@@ -2815,7 +2928,7 @@
+ char *p = (char *) alloca(1);
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+ else
+@@ -2847,12 +2960,12 @@
+
+
+ echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+-echo "configure:2851: checking whether alloca needs Cray hooks" >&5
++echo "configure:2964: checking whether alloca needs Cray hooks" >&5
+ if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2856 "configure"
++#line 2969 "configure"
+ #include "confdefs.h"
+ #if defined(CRAY) && ! defined(CRAY2)
+ webecray
+@@ -2877,12 +2990,12 @@
+ if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:2881: checking for $ac_func" >&5
++echo "configure:2994: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2886 "configure"
++#line 2999 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -2905,7 +3018,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -2932,7 +3045,7 @@
+ fi
+
+ echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+-echo "configure:2936: checking stack direction for C alloca" >&5
++echo "configure:3049: checking stack direction for C alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2940,7 +3053,7 @@
+ ac_cv_c_stack_direction=0
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 2944 "configure"
++#line 3057 "configure"
+ #include "confdefs.h"
+ find_stack_direction ()
+ {
+@@ -2959,7 +3072,7 @@
+ exit (find_stack_direction() < 0);
+ }
+ EOF
+-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+ ac_cv_c_stack_direction=1
+ else
+@@ -2982,13 +3095,13 @@
+
+
+ echo $ac_n "checking size of short""... $ac_c" 1>&6
+-echo "configure:2986: checking size of short" >&5
++echo "configure:3099: checking size of short" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 2992 "configure"
++#line 3105 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -2998,7 +3111,7 @@
+ switch (0) case 0: case (sizeof (short) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_short=$ac_size
+ else
+@@ -3021,13 +3134,13 @@
+
+
+ echo $ac_n "checking size of int""... $ac_c" 1>&6
+-echo "configure:3025: checking size of int" >&5
++echo "configure:3138: checking size of int" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3031 "configure"
++#line 3144 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3037,7 +3150,7 @@
+ switch (0) case 0: case (sizeof (int) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_int=$ac_size
+ else
+@@ -3060,13 +3173,13 @@
+
+
+ echo $ac_n "checking size of long""... $ac_c" 1>&6
+-echo "configure:3064: checking size of long" >&5
++echo "configure:3177: checking size of long" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3070 "configure"
++#line 3183 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3076,7 +3189,7 @@
+ switch (0) case 0: case (sizeof (long) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_long=$ac_size
+ else
+@@ -3099,13 +3212,13 @@
+
+
+ echo $ac_n "checking size of long long""... $ac_c" 1>&6
+-echo "configure:3103: checking size of long long" >&5
++echo "configure:3216: checking size of long long" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3109 "configure"
++#line 3222 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3115,7 +3228,7 @@
+ switch (0) case 0: case (sizeof (long long) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_long_long=$ac_size
+ else
+@@ -3138,13 +3251,13 @@
+
+
+ echo $ac_n "checking size of float""... $ac_c" 1>&6
+-echo "configure:3142: checking size of float" >&5
++echo "configure:3255: checking size of float" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3148 "configure"
++#line 3261 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3154,7 +3267,7 @@
+ switch (0) case 0: case (sizeof (float) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_float=$ac_size
+ else
+@@ -3177,13 +3290,13 @@
+
+
+ echo $ac_n "checking size of double""... $ac_c" 1>&6
+-echo "configure:3181: checking size of double" >&5
++echo "configure:3294: checking size of double" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3187 "configure"
++#line 3300 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3193,7 +3306,7 @@
+ switch (0) case 0: case (sizeof (double) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_double=$ac_size
+ else
+@@ -3216,13 +3329,13 @@
+
+
+ echo $ac_n "checking size of long double""... $ac_c" 1>&6
+-echo "configure:3220: checking size of long double" >&5
++echo "configure:3333: checking size of long double" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3226 "configure"
++#line 3339 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3232,7 +3345,7 @@
+ switch (0) case 0: case (sizeof (long double) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_long_double=$ac_size
+ else
+@@ -3256,13 +3369,13 @@
+
+
+ echo $ac_n "checking size of void *""... $ac_c" 1>&6
+-echo "configure:3260: checking size of void *" >&5
++echo "configure:3373: checking size of void *" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
+ cat > conftest.$ac_ext <<EOF
+-#line 3266 "configure"
++#line 3379 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3272,7 +3385,7 @@
+ switch (0) case 0: case (sizeof (void *) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_sizeof_void_p=$ac_size
+ else
+@@ -3295,14 +3408,14 @@
+
+
+ echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+-echo "configure:3299: checking whether byte ordering is bigendian" >&5
++echo "configure:3412: checking whether byte ordering is bigendian" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ ac_cv_c_bigendian=unknown
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat > conftest.$ac_ext <<EOF
+-#line 3306 "configure"
++#line 3419 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #include <sys/param.h>
+@@ -3313,11 +3426,11 @@
+ #endif
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat > conftest.$ac_ext <<EOF
+-#line 3321 "configure"
++#line 3434 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #include <sys/param.h>
+@@ -3328,7 +3441,7 @@
+ #endif
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_bigendian=yes
+ else
+@@ -3348,7 +3461,7 @@
+ echo $ac_n "cross-compiling... " 2>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 3352 "configure"
++#line 3465 "configure"
+ #include "confdefs.h"
+ main () {
+ /* Are we little or big endian? From Harbison&Steele. */
+@@ -3361,7 +3474,7 @@
+ exit (u.c[sizeof (long) - 1] == 1);
+ }
+ EOF
+-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+ ac_cv_c_bigendian=no
+ else
+@@ -3379,7 +3492,7 @@
+ echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+ if test $ac_cv_c_bigendian = unknown; then
+ echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
+-echo "configure:3383: checking to probe for byte ordering" >&5
++echo "configure:3496: checking to probe for byte ordering" >&5
+
+ cat >conftest.c <<EOF
+ short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+@@ -3414,6 +3527,10 @@
+ #define WORDS_BIGENDIAN 1
+ EOF
+
++ cat >> confdefs.h <<\EOF
++#define HOST_WORDS_BIG_ENDIAN 1
++EOF
++
+ BYTEORDER=4321
+ else
+ BYTEORDER=1234
+@@ -3429,7 +3546,7 @@
+
+ if test x$TARGET = xSPARC; then
+ echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
+-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5
++echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5
+ if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -3439,14 +3556,14 @@
+ CFLAGS="$CFLAGS -fpic"
+ LDFLAGS="$LDFLAGS -shared"
+ cat > conftest.$ac_ext <<EOF
+-#line 3443 "configure"
++#line 3560 "configure"
+ #include "confdefs.h"
+ asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
+ int main() {
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ libffi_cv_as_sparc_ua_pcrel=yes
+ else
+@@ -3709,6 +3826,8 @@
+ s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g
+ s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g
+ s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g
++s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g
++s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g
+ s%@SPARC_TRUE@%$SPARC_TRUE%g
+ s%@SPARC_FALSE@%$SPARC_FALSE%g
+ s%@X86_TRUE@%$X86_TRUE%g
+@@ -3729,6 +3848,12 @@
+ s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g
+ s%@ARM_TRUE@%$ARM_TRUE%g
+ s%@ARM_FALSE@%$ARM_FALSE%g
++s%@S390_TRUE@%$S390_TRUE%g
++s%@S390_FALSE@%$S390_FALSE%g
++s%@X86_64_TRUE@%$X86_64_TRUE%g
++s%@X86_64_FALSE@%$X86_64_FALSE%g
++s%@SH_TRUE@%$SH_TRUE%g
++s%@SH_FALSE@%$SH_FALSE%g
+ s%@CPP@%$CPP%g
+ s%@ALLOCA@%$ALLOCA%g
+ s%@TARGET@%$TARGET%g
+@@ -3969,7 +4094,7 @@
+
+ if test -n "$CONFIG_FILES"; then
+ LD="${ORIGINAL_LD_FOR_MULTILIBS}"
+- ac_file=Makefile . ${libffi_basedir}/../config-ml.in
++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
+ fi
+
+ exit 0
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in
+--- gcc-3.2.2.orig/libffi/configure.in Tue Jan 28 10:43:56 2003
++++ gcc/libffi/configure.in Sat Feb 1 20:16:19 2003
+@@ -22,14 +22,15 @@
+
+ if test "${srcdir}" = "."; then
+ if test "${with_target_subdir}" != "."; then
+- libffi_basedir="${srcdir}/${with_multisrctop}.."
++ libffi_basedir="${with_multisrctop}../"
+ else
+- libffi_basedir="${srcdir}/${with_multisrctop}"
++ libffi_basedir="${with_multisrctop}"
+ fi
+ else
+- libffi_basedir="${srcdir}"
++ libffi_basedir=
+ fi
+ AC_SUBST(libffi_basedir)
++AC_CONFIG_AUX_DIR(${libffi_basedir}..)
+
+ AC_CANONICAL_HOST
+
+@@ -56,17 +57,23 @@
+ i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
+ sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
+ sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
+ ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
+ m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
++mips64*-*);;
++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
+ powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
+ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
++sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
+ esac
+
+ if test $TARGETDIR = unknown; then
+@@ -75,6 +82,7 @@
+
+ AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
+ AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
++AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX)
+ AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
+ AM_CONDITIONAL(X86, test x$TARGET = xX86)
+ AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
+@@ -85,6 +93,13 @@
+ AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
+ AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
+ AM_CONDITIONAL(ARM, test x$TARGET = xARM)
++AM_CONDITIONAL(S390, test x$TARGET = xS390)
++AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
++AM_CONDITIONAL(SH, test x$TARGET = xSH)
++
++if test x$TARGET = xMIPS_LINUX; then
++ TARGET=MIPS
++fi
+
+ AC_HEADER_STDC
+ AC_CHECK_FUNCS(memcpy)
+@@ -171,7 +186,7 @@
+ [
+ if test -n "$CONFIG_FILES"; then
+ LD="${ORIGINAL_LD_FOR_MULTILIBS}"
+- ac_file=Makefile . ${libffi_basedir}/../config-ml.in
++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
+ fi
+ ],
+ srcdir=${srcdir}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in
+--- gcc-3.2.2.orig/libffi/include/Makefile.in Tue Oct 9 14:32:16 2001
++++ gcc/libffi/include/Makefile.in Mon Apr 29 13:14:44 2002
+@@ -99,7 +99,7 @@
+
+ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+-TAR = gnutar
++TAR = gtar
+ GZIP_ENV = --best
+ all: all-redirect
+ .SUFFIXES:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in
+--- gcc-3.2.2.orig/libffi/include/ffi.h.in Wed Mar 13 07:35:56 2002
++++ gcc/libffi/include/ffi.h.in Wed Jan 29 00:54:28 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------*-C-*-
+- libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions
++ libffi @VERSION@ - Copyright (c) 1996-2003 Cygnus Solutions
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+@@ -164,6 +164,12 @@
+ #endif
+ #endif
+
++#ifdef S390
++#if defined (__s390x__)
++#define S390X
++#endif
++#endif
++
+ #ifndef LIBFFI_ASM
+
+ /* ---- Generic type definitions ----------------------------------------- */
+@@ -189,16 +195,23 @@
+ #endif
+ #endif
+
+- /* ---- Intel x86 ---------------- */
+-#ifdef X86
++ /* ---- Intel x86 Win32 ---------- */
++#ifdef X86_WIN32
+ FFI_SYSV,
++ FFI_STDCALL,
++ /* TODO: Add fastcall support for the sake of completeness */
+ FFI_DEFAULT_ABI = FFI_SYSV,
+ #endif
+
+- /* ---- Intel x86 Win32 ---------- */
+-#ifdef X86_WIN32
++ /* ---- Intel x86 and AMD x86-64 - */
++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
+ FFI_SYSV,
++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */
++#ifdef __i386__
+ FFI_DEFAULT_ABI = FFI_SYSV,
++#else
++ FFI_DEFAULT_ABI = FFI_UNIX64,
++#endif
+ #endif
+
+ /* ---- Intel ia64 ---------------- */
+@@ -251,6 +264,18 @@
+ FFI_DEFAULT_ABI = FFI_SYSV,
+ #endif
+
++ /* ---- S390 --------------------- */
++#ifdef S390
++ FFI_SYSV,
++ FFI_DEFAULT_ABI = FFI_SYSV,
++#endif
++
++ /* ---- SuperH ------------------- */
++#ifdef SH
++ FFI_SYSV,
++ FFI_DEFAULT_ABI = FFI_SYSV,
++#endif
++
+ /* Leave this for debugging purposes */
+ FFI_LAST_ABI
+
+@@ -264,7 +289,7 @@
+ /*@null@*/ struct _ffi_type **elements;
+ } ffi_type;
+
+-/* These are defined in ffi.c */
++/* These are defined in types.c */
+ extern ffi_type ffi_type_void;
+ extern ffi_type ffi_type_uint8;
+ extern ffi_type ffi_type_sint8;
+@@ -373,13 +398,7 @@
+
+ /* ---- Definitions for closures ----------------------------------------- */
+
+-#ifdef X86
+-
+-#define FFI_CLOSURES 1 /* x86 supports closures */
+-#define FFI_TRAMPOLINE_SIZE 10
+-#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */
+-
+-#elif defined(X86_WIN32)
++#ifdef __i386__
+
+ #define FFI_CLOSURES 1 /* x86 supports closures */
+ #define FFI_TRAMPOLINE_SIZE 10
+@@ -424,6 +443,40 @@
+ #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */
+ #define FFI_NATIVE_RAW_API 0
+
++#elif defined(SPARC64)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 24
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(SPARC)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 16
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(S390)
++
++#define FFI_CLOSURES 1
++#ifdef S390X
++#define FFI_TRAMPOLINE_SIZE 32
++#else
++#define FFI_TRAMPOLINE_SIZE 16
++#endif
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(SH)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 16
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(__x86_64__)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 24
++#define FFI_NATIVE_RAW_API 0
++
+ #else
+
+ #define FFI_CLOSURES 0
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c
+--- gcc-3.2.2.orig/libffi/src/arm/ffi.c Sat Mar 3 07:21:23 2001
++++ gcc/libffi/src/arm/ffi.c Fri Jul 19 08:08:30 2002
+@@ -36,13 +36,10 @@
+ /*@=exportheader@*/
+ {
+ register unsigned int i;
+- register int tmp;
+- register unsigned int avn;
+ register void **p_argv;
+ register char *argp;
+ register ffi_type **p_arg;
+
+- tmp = 0;
+ argp = stack;
+
+ if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
+@@ -50,11 +47,10 @@
+ argp += 4;
+ }
+
+- avn = ecif->cif->nargs;
+ p_argv = ecif->avalue;
+
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+- (i != 0) && (avn != 0);
++ (i != 0);
+ i--, p_arg++)
+ {
+ size_t z;
+@@ -64,9 +60,6 @@
+ argp = (char *) ALIGN(argp, (*p_arg)->alignment);
+ }
+
+- if (avn != 0)
+- {
+- avn--;
+ z = (*p_arg)->size;
+ if (z < sizeof(int))
+ {
+@@ -107,7 +100,6 @@
+ }
+ p_argv++;
+ argp += z;
+- }
+ }
+
+ return;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S
+--- gcc-3.2.2.orig/libffi/src/arm/sysv.S Sat Mar 3 07:21:23 2001
++++ gcc/libffi/src/arm/sysv.S Mon Sep 30 03:08:58 2002
+@@ -28,8 +28,15 @@
+ #ifdef HAVE_MACHINE_ASM_H
+ #include <machine/asm.h>
+ #else
+-/* XXX these lose for some platforms, I'm sure. */
++#ifdef __USER_LABEL_PREFIX__
++#define CONCAT1(a, b) CONCAT2(a, b)
++#define CONCAT2(a, b) a ## b
++
++/* Use the right prefix for global labels. */
++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
++#else
+ #define CNAME(x) x
++#endif
+ #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+ #endif
+
+@@ -96,12 +103,20 @@
+
+ # return FLOAT
+ cmp a4, #FFI_TYPE_FLOAT
++#ifdef __SOFTFP__
++ streq a1, [a3]
++#else
+ stfeqs f0, [a3]
++#endif
+ beq epilogue
+
+ # return DOUBLE or LONGDOUBLE
+ cmp a4, #FFI_TYPE_DOUBLE
++#ifdef __SOFTFP__
++ stmeqia a3, {a1, a2}
++#else
+ stfeqd f0, [a3]
++#endif
+
+ epilogue:
+ ldmfd sp!, {a1-a4, fp, pc}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c
+--- gcc-3.2.2.orig/libffi/src/java_raw_api.c Tue Apr 9 07:31:14 2002
++++ gcc/libffi/src/java_raw_api.c Tue Oct 8 23:55:02 2002
+@@ -81,21 +81,14 @@
+ {
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_SINT8:
+- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
++ *args = (void*) ((char*)(raw++) + 3);
+ break;
+
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_SINT16:
+- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
++ *args = (void*) ((char*)(raw++) + 2);
+ break;
+
+-#if SIZEOF_ARG >= 4
+- case FFI_TYPE_UINT32:
+- case FFI_TYPE_SINT32:
+- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
+- break;
+-#endif
+-
+ #if SIZEOF_ARG == 8
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+@@ -157,31 +150,54 @@
+ switch ((*tp)->type)
+ {
+ case FFI_TYPE_UINT8:
++#if WORDS_BIGENDIAN
++ *(UINT32*)(raw++) = *(UINT8*) (*args);
++#else
+ (raw++)->uint = *(UINT8*) (*args);
++#endif
+ break;
+
+ case FFI_TYPE_SINT8:
++#if WORDS_BIGENDIAN
++ *(SINT32*)(raw++) = *(SINT8*) (*args);
++#else
+ (raw++)->sint = *(SINT8*) (*args);
++#endif
+ break;
+
+ case FFI_TYPE_UINT16:
++#if WORDS_BIGENDIAN
++ *(UINT32*)(raw++) = *(UINT16*) (*args);
++#else
+ (raw++)->uint = *(UINT16*) (*args);
++#endif
+ break;
+
+ case FFI_TYPE_SINT16:
++#if WORDS_BIGENDIAN
++ *(SINT32*)(raw++) = *(SINT16*) (*args);
++#else
+ (raw++)->sint = *(SINT16*) (*args);
++#endif
+ break;
+
+-#if SIZEOF_ARG >= 4
+ case FFI_TYPE_UINT32:
++#if WORDS_BIGENDIAN
++ *(UINT32*)(raw++) = *(UINT32*) (*args);
++#else
+ (raw++)->uint = *(UINT32*) (*args);
++#endif
+ break;
+
+ case FFI_TYPE_SINT32:
++#if WORDS_BIGENDIAN
++ *(SINT32*)(raw++) = *(SINT32*) (*args);
++#else
+ (raw++)->sint = *(SINT32*) (*args);
+- break;
+ #endif
+- case FFI_TYPE_FLOAT:
++ break;
++
++ case FFI_TYPE_FLOAT:
+ (raw++)->flt = *(FLOAT32*) (*args);
+ break;
+
+@@ -211,6 +227,55 @@
+
+ #if !FFI_NATIVE_RAW_API
+
++static void
++ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
++{
++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
++ switch (cif->rtype->type)
++ {
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_UINT32:
++ *(UINT64 *)rvalue <<= 32;
++ break;
++
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_INT:
++ *(SINT64 *)rvalue <<= 32;
++ break;
++
++ default:
++ break;
++ }
++#endif
++}
++
++static void
++ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
++{
++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
++ switch (cif->rtype->type)
++ {
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_UINT32:
++ *(UINT64 *)rvalue >>= 32;
++ break;
++
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_INT:
++ *(SINT64 *)rvalue >>= 32;
++ break;
++
++ default:
++ break;
++ }
++#endif
++}
+
+ /* This is a generic definition of ffi_raw_call, to be used if the
+ * native system does not provide a machine-specific implementation.
+@@ -227,6 +292,7 @@
+ void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
+ ffi_java_raw_to_ptrarray (cif, raw, avalue);
+ ffi_call (cif, fn, rvalue, avalue);
++ ffi_java_rvalue_to_raw (cif, rvalue);
+ }
+
+ #if FFI_CLOSURES /* base system provides closures */
+@@ -240,6 +306,7 @@
+
+ ffi_java_ptrarray_to_raw (cif, avalue, raw);
+ (*cl->fun) (cif, rvalue, raw, cl->user_data);
++ ffi_java_raw_to_rvalue (cif, rvalue);
+ }
+
+ /* Again, here is the generic version of ffi_prep_raw_closure, which
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c
+--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c Sun Aug 8 22:27:19 1999
++++ gcc/libffi/src/m68k/ffi.c Fri Jul 19 08:08:30 2002
+@@ -16,14 +16,11 @@
+ ffi_prep_args (void *stack, extended_cif *ecif)
+ {
+ unsigned int i;
+- int tmp;
+- unsigned int avn;
+ void **p_argv;
+ char *argp;
+ ffi_type **p_arg;
+ void *struct_value_ptr;
+
+- tmp = 0;
+ argp = stack;
+
+ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
+@@ -32,11 +29,10 @@
+ else
+ struct_value_ptr = NULL;
+
+- avn = ecif->cif->nargs;
+ p_argv = ecif->avalue;
+
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+- i != 0 && avn != 0;
++ i != 0;
+ i--, p_arg++)
+ {
+ size_t z;
+@@ -45,9 +41,6 @@
+ if (((*p_arg)->alignment - 1) & (unsigned) argp)
+ argp = (char *) ALIGN (argp, (*p_arg)->alignment);
+
+- if (avn != 0)
+- {
+- avn--;
+ z = (*p_arg)->size;
+ if (z < sizeof (int))
+ {
+@@ -82,7 +75,6 @@
+ memcpy (argp, *p_argv, z);
+ p_argv++;
+ argp += z;
+- }
+ }
+
+ return struct_value_ptr;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c
+--- gcc-3.2.2.orig/libffi/src/mips/ffi.c Sat Mar 3 07:21:23 2001
++++ gcc/libffi/src/mips/ffi.c Fri Jul 19 08:08:31 2002
+@@ -23,6 +23,7 @@
+ OTHER DEALINGS IN THE SOFTWARE.
+ ----------------------------------------------------------------------- */
+
++#include <sgidefs.h>
+ #include <ffi.h>
+ #include <ffi_common.h>
+
+@@ -50,7 +51,6 @@
+ int flags)
+ {
+ register int i;
+- register int avn;
+ register void **p_argv;
+ register char *argp;
+ register ffi_type **p_arg;
+@@ -80,12 +80,9 @@
+ FIX_ARGP;
+ }
+
+- avn = ecif->cif->nargs;
+ p_argv = ecif->avalue;
+
+- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+- i && avn;
+- i--, p_arg++)
++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
+ {
+ size_t z;
+
+@@ -101,9 +98,6 @@
+ #define OFFSET sizeof(int)
+ #endif
+
+- if (avn)
+- {
+- avn--;
+ z = (*p_arg)->size;
+ if (z < sizeof(SLOT_TYPE_UNSIGNED))
+ {
+@@ -179,7 +173,6 @@
+ p_argv++;
+ argp += z;
+ FIX_ARGP;
+- }
+ }
+
+ return;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S
+--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S Sat Jan 19 01:22:34 2002
++++ gcc/libffi/src/powerpc/darwin.S Thu Jan 23 03:21:55 2003
+@@ -3,8 +3,6 @@
+
+ PowerPC Assembly glue.
+
+- $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $
+-
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ ``Software''), to deal in the Software without restriction, including
+@@ -39,30 +37,34 @@
+ .text
+ .align 2
+ _ffi_call_DARWIN:
+- mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
++LFB0:
++ mr r12,r8 /* We only need r12 until the call,
++ so it doesn't have to be saved... */
++LFB1:
+ /* Save the old stack pointer as AP. */
+ mr r8,r1
+-
++LCFI0:
+ /* Allocate the stack space we need. */
+ stwux r1,r1,r4
+
+ /* Save registers we use. */
+ mflr r9
+
+- stw r28,-16(r8)
++ stw r28,-16(r8)
+ stw r29,-12(r8)
+ stw r30, -8(r8)
+ stw r31, -4(r8)
+-
+- stw r9, 8(r8)
++
++ stw r9, 8(r8)
+ stw r2, 20(r1)
++LCFI1:
+
+ /* Save arguments over call... */
+- mr r31,r5 /* flags, */
+- mr r30,r6 /* rvalue, */
+- mr r29,r7 /* function address, */
+- mr r28,r8 /* our AP. */
+-
++ mr r31,r5 /* flags, */
++ mr r30,r6 /* rvalue, */
++ mr r29,r7 /* function address, */
++ mr r28,r8 /* our AP. */
++LCFI2:
+ /* Call ffi_prep_args. */
+ mr r4,r1
+ li r9,0
+@@ -145,7 +147,8 @@
+ L(float_return_value):
+ stfs f1,0(r30)
+ b L(done_return_value)
+-//END(_ffi_call_DARWIN)
++LFE1:
++/* END(_ffi_call_DARWIN) */
+
+ /* Provide a null definition of _ffi_call_AIX. */
+ .text
+@@ -155,5 +158,61 @@
+ .align 2
+ _ffi_call_AIX:
+ blr
+-//END(_ffi_call_AIX)
++/* END(_ffi_call_AIX) */
+
++.data
++.section __TEXT,__eh_frame
++Lframe1:
++ .set L$set$0,LECIE1-LSCIE1
++ .long L$set$0 ; Length of Common Information Entry
++LSCIE1:
++ .long 0x0 ; CIE Identifier Tag
++ .byte 0x1 ; CIE Version
++ .ascii "zR\0" ; CIE Augmentation
++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor
++ .byte 0x41 ; CIE RA Column
++ .byte 0x1 ; uleb128 0x1; Augmentation size
++ .byte 0x10 ; FDE Encoding (pcrel)
++ .byte 0xc ; DW_CFA_def_cfa
++ .byte 0x1 ; uleb128 0x1
++ .byte 0x0 ; uleb128 0x0
++ .align 2
++LECIE1:
++LSFDE1:
++ .set L$set$1,LEFDE1-LASFDE1
++ .long L$set$1 ; FDE Length
++LASFDE1:
++ .set L$set$2,LASFDE1-Lframe1
++ .long L$set$2 ; FDE CIE offset
++ .long LFB0-. ; FDE initial location
++ .set L$set$3,LFE1-LFB0
++ .long L$set$3 ; FDE address range
++ .byte 0x0 ; uleb128 0x0; Augmentation size
++ .byte 0x4 ; DW_CFA_advance_loc4
++ .set L$set$4,LCFI0-LFB1
++ .long L$set$4
++ .byte 0xd ; DW_CFA_def_cfa_register
++ .byte 0x08 ; uleb128 0x08
++ .byte 0x4 ; DW_CFA_advance_loc4
++ .set L$set$5,LCFI1-LCFI0
++ .long L$set$5
++ .byte 0x11 ; DW_CFA_offset_extended_sf
++ .byte 0x41 ; uleb128 0x41
++ .byte 0x7e ; sleb128 -2
++ .byte 0x9f ; DW_CFA_offset, column 0x1f
++ .byte 0x1 ; uleb128 0x1
++ .byte 0x9e ; DW_CFA_offset, column 0x1e
++ .byte 0x2 ; uleb128 0x2
++ .byte 0x9d ; DW_CFA_offset, column 0x1d
++ .byte 0x3 ; uleb128 0x3
++ .byte 0x9c ; DW_CFA_offset, column 0x1c
++ .byte 0x4 ; uleb128 0x4
++ .byte 0x4 ; DW_CFA_advance_loc4
++ .set L$set$6,LCFI2-LCFI1
++ .long L$set$6
++ .byte 0xd ; DW_CFA_def_cfa_register
++ .byte 0x1c ; uleb128 0x1c
++ .align 2
++LEFDE1:
++
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c
+--- gcc-3.2.2.orig/libffi/src/prep_cif.c Sat Mar 3 07:21:22 2001
++++ gcc/libffi/src/prep_cif.c Mon Sep 30 20:59:42 2002
+@@ -103,7 +103,8 @@
+ /* Perform a sanity check on the return type */
+ FFI_ASSERT(ffi_type_test(cif->rtype));
+
+-#ifndef M68K
++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */
++#if !defined M68K && !defined __x86_64__ && !defined S390
+ /* Make space for the return structure pointer */
+ if (cif->rtype->type == FFI_TYPE_STRUCT
+ #ifdef SPARC
+@@ -122,6 +123,7 @@
+ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
+ return FFI_BAD_TYPEDEF;
+
++#if !defined __x86_64__ && !defined S390
+ #ifdef SPARC
+ if (((*ptr)->type == FFI_TYPE_STRUCT
+ && ((*ptr)->size > 16 || cif->abi != FFI_V9))
+@@ -137,6 +139,7 @@
+
+ bytes += STACK_ARG_SIZE((*ptr)->size);
+ }
++#endif
+ }
+
+ cif->bytes = bytes;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c
+--- gcc-3.2.2.orig/libffi/src/s390/ffi.c Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/s390/ffi.c Thu Feb 6 08:58:57 2003
+@@ -0,0 +1,753 @@
++/* -----------------------------------------------------------------------
++ ffi.c - Copyright (c) 2000 Software AG
++
++ S390 Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++/*====================================================================*/
++/* Includes */
++/* -------- */
++/*====================================================================*/
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++#include <stdio.h>
++
++/*====================== End of Includes =============================*/
++
++/*====================================================================*/
++/* Defines */
++/* ------- */
++/*====================================================================*/
++
++/* Maximum number of GPRs available for argument passing. */
++#define MAX_GPRARGS 5
++
++/* Maximum number of FPRs available for argument passing. */
++#ifdef __s390x__
++#define MAX_FPRARGS 4
++#else
++#define MAX_FPRARGS 2
++#endif
++
++/* Round to multiple of 16. */
++#define ROUND_SIZE(size) (((size) + 15) & ~15)
++
++/* If these values change, sysv.S must be adapted! */
++#define FFI390_RET_VOID 0
++#define FFI390_RET_STRUCT 1
++#define FFI390_RET_FLOAT 2
++#define FFI390_RET_DOUBLE 3
++#define FFI390_RET_INT32 4
++#define FFI390_RET_INT64 5
++
++/*===================== End of Defines ===============================*/
++
++/*====================================================================*/
++/* Prototypes */
++/* ---------- */
++/*====================================================================*/
++
++static void ffi_prep_args (unsigned char *, extended_cif *);
++static int ffi_check_float_struct (ffi_type *);
++void
++#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
++__attribute__ ((visibility ("hidden")))
++#endif
++ffi_closure_helper_SYSV (ffi_closure *, unsigned long *,
++ unsigned long long *, unsigned long *);
++
++/*====================== End of Prototypes ===========================*/
++
++/*====================================================================*/
++/* Externals */
++/* --------- */
++/*====================================================================*/
++
++extern void ffi_call_SYSV(unsigned,
++ extended_cif *,
++ void (*)(unsigned char *, extended_cif *),
++ unsigned,
++ void *,
++ void (*fn)());
++
++extern void ffi_closure_SYSV(void);
++
++/*====================== End of Externals ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_check_struct_type. */
++/* */
++/* Function - Determine if a structure can be passed within a */
++/* general purpose or floating point register. */
++/* */
++/*====================================================================*/
++
++static int
++ffi_check_struct_type (ffi_type *arg)
++{
++ size_t size = arg->size;
++
++ /* If the struct has just one element, look at that element
++ to find out whether to consider the struct as floating point. */
++ while (arg->type == FFI_TYPE_STRUCT
++ && arg->elements[0] && !arg->elements[1])
++ arg = arg->elements[0];
++
++ /* Structs of size 1, 2, 4, and 8 are passed in registers,
++ just like the corresponding int/float types. */
++ switch (size)
++ {
++ case 1:
++ return FFI_TYPE_UINT8;
++
++ case 2:
++ return FFI_TYPE_UINT16;
++
++ case 4:
++ if (arg->type == FFI_TYPE_FLOAT)
++ return FFI_TYPE_FLOAT;
++ else
++ return FFI_TYPE_UINT32;
++
++ case 8:
++ if (arg->type == FFI_TYPE_DOUBLE)
++ return FFI_TYPE_DOUBLE;
++ else
++ return FFI_TYPE_UINT64;
++
++ default:
++ break;
++ }
++
++ /* Other structs are passed via a pointer to the data. */
++ return FFI_TYPE_POINTER;
++}
++
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_prep_args. */
++/* */
++/* Function - Prepare parameters for call to function. */
++/* */
++/* ffi_prep_args is called by the assembly routine once stack space */
++/* has been allocated for the function's arguments. */
++/* */
++/*====================================================================*/
++
++static void
++ffi_prep_args (unsigned char *stack, extended_cif *ecif)
++{
++ /* The stack space will be filled with those areas:
++
++ FPR argument register save area (highest addresses)
++ GPR argument register save area
++ temporary struct copies
++ overflow argument area (lowest addresses)
++
++ We set up the following pointers:
++
++ p_fpr: bottom of the FPR area (growing upwards)
++ p_gpr: bottom of the GPR area (growing upwards)
++ p_ov: bottom of the overflow area (growing upwards)
++ p_struct: top of the struct copy area (growing downwards)
++
++ All areas are kept aligned to twice the word size. */
++
++ int gpr_off = ecif->cif->bytes;
++ int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
++
++ unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
++ unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
++ unsigned char *p_struct = (unsigned char *)p_gpr;
++ unsigned long *p_ov = (unsigned long *)stack;
++
++ int n_fpr = 0;
++ int n_gpr = 0;
++ int n_ov = 0;
++
++ ffi_type **ptr;
++ void **p_argv = ecif->avalue;
++ int i;
++
++ /* If we returning a structure then we set the first parameter register
++ to the address of where we are returning this structure. */
++
++ if (ecif->cif->flags == FFI390_RET_STRUCT)
++ p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
++
++ /* Now for the arguments. */
++
++ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
++ i > 0;
++ i--, ptr++, p_argv++)
++ {
++ void *arg = *p_argv;
++ int type = (*ptr)->type;
++
++ /* Check how a structure type is passed. */
++ if (type == FFI_TYPE_STRUCT)
++ {
++ type = ffi_check_struct_type (*ptr);
++
++ /* If we pass the struct via pointer, copy the data. */
++ if (type == FFI_TYPE_POINTER)
++ {
++ p_struct -= ROUND_SIZE ((*ptr)->size);
++ memcpy (p_struct, (char *)arg, (*ptr)->size);
++ arg = &p_struct;
++ }
++ }
++
++ /* Pointers are passed like UINTs of the same size. */
++ if (type == FFI_TYPE_POINTER)
++#ifdef __s390x__
++ type = FFI_TYPE_UINT64;
++#else
++ type = FFI_TYPE_UINT32;
++#endif
++
++ /* Now handle all primitive int/float data types. */
++ switch (type)
++ {
++ case FFI_TYPE_DOUBLE:
++ if (n_fpr < MAX_FPRARGS)
++ p_fpr[n_fpr++] = *(unsigned long long *) arg;
++ else
++#ifdef __s390x__
++ p_ov[n_ov++] = *(unsigned long *) arg;
++#else
++ p_ov[n_ov++] = ((unsigned long *) arg)[0],
++ p_ov[n_ov++] = ((unsigned long *) arg)[1];
++#endif
++ break;
++
++ case FFI_TYPE_FLOAT:
++ if (n_fpr < MAX_FPRARGS)
++ p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
++ else
++ p_ov[n_ov++] = *(unsigned int *) arg;
++ break;
++
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++#ifdef __s390x__
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(unsigned long *) arg;
++ else
++ p_ov[n_ov++] = *(unsigned long *) arg;
++#else
++ if (n_gpr == MAX_GPRARGS-1)
++ n_gpr = MAX_GPRARGS;
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
++ p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
++ else
++ p_ov[n_ov++] = ((unsigned long *) arg)[0],
++ p_ov[n_ov++] = ((unsigned long *) arg)[1];
++#endif
++ break;
++
++ case FFI_TYPE_UINT32:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(unsigned int *) arg;
++ else
++ p_ov[n_ov++] = *(unsigned int *) arg;
++ break;
++
++ case FFI_TYPE_INT:
++ case FFI_TYPE_SINT32:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(signed int *) arg;
++ else
++ p_ov[n_ov++] = *(signed int *) arg;
++ break;
++
++ case FFI_TYPE_UINT16:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(unsigned short *) arg;
++ else
++ p_ov[n_ov++] = *(unsigned short *) arg;
++ break;
++
++ case FFI_TYPE_SINT16:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(signed short *) arg;
++ else
++ p_ov[n_ov++] = *(signed short *) arg;
++ break;
++
++ case FFI_TYPE_UINT8:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(unsigned char *) arg;
++ else
++ p_ov[n_ov++] = *(unsigned char *) arg;
++ break;
++
++ case FFI_TYPE_SINT8:
++ if (n_gpr < MAX_GPRARGS)
++ p_gpr[n_gpr++] = *(signed char *) arg;
++ else
++ p_ov[n_ov++] = *(signed char *) arg;
++ break;
++
++ default:
++ FFI_ASSERT (0);
++ break;
++ }
++ }
++}
++
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_prep_cif_machdep. */
++/* */
++/* Function - Perform machine dependent CIF processing. */
++/* */
++/*====================================================================*/
++
++ffi_status
++ffi_prep_cif_machdep(ffi_cif *cif)
++{
++ size_t struct_size = 0;
++ int n_gpr = 0;
++ int n_fpr = 0;
++ int n_ov = 0;
++
++ ffi_type **ptr;
++ int i;
++
++ /* Determine return value handling. */
++
++ switch (cif->rtype->type)
++ {
++ /* Void is easy. */
++ case FFI_TYPE_VOID:
++ cif->flags = FFI390_RET_VOID;
++ break;
++
++ /* Structures are returned via a hidden pointer. */
++ case FFI_TYPE_STRUCT:
++ cif->flags = FFI390_RET_STRUCT;
++ n_gpr++; /* We need one GPR to pass the pointer. */
++ break;
++
++ /* Floating point values are returned in fpr 0. */
++ case FFI_TYPE_FLOAT:
++ cif->flags = FFI390_RET_FLOAT;
++ break;
++
++ case FFI_TYPE_DOUBLE:
++ cif->flags = FFI390_RET_DOUBLE;
++ break;
++
++ /* Integer values are returned in gpr 2 (and gpr 3
++ for 64-bit values on 31-bit machines). */
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++ cif->flags = FFI390_RET_INT64;
++ break;
++
++ case FFI_TYPE_POINTER:
++ case FFI_TYPE_INT:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_SINT8:
++ /* These are to be extended to word size. */
++#ifdef __s390x__
++ cif->flags = FFI390_RET_INT64;
++#else
++ cif->flags = FFI390_RET_INT32;
++#endif
++ break;
++
++ default:
++ FFI_ASSERT (0);
++ break;
++ }
++
++ /* Now for the arguments. */
++
++ for (ptr = cif->arg_types, i = cif->nargs;
++ i > 0;
++ i--, ptr++)
++ {
++ int type = (*ptr)->type;
++
++ /* Check how a structure type is passed. */
++ if (type == FFI_TYPE_STRUCT)
++ {
++ type = ffi_check_struct_type (*ptr);
++
++ /* If we pass the struct via pointer, we must reserve space
++ to copy its data for proper call-by-value semantics. */
++ if (type == FFI_TYPE_POINTER)
++ struct_size += ROUND_SIZE ((*ptr)->size);
++ }
++
++ /* Now handle all primitive int/float data types. */
++ switch (type)
++ {
++ /* The first MAX_FPRARGS floating point arguments
++ go in FPRs, the rest overflow to the stack. */
++
++ case FFI_TYPE_DOUBLE:
++ if (n_fpr < MAX_FPRARGS)
++ n_fpr++;
++ else
++ n_ov += sizeof (double) / sizeof (long);
++ break;
++
++ case FFI_TYPE_FLOAT:
++ if (n_fpr < MAX_FPRARGS)
++ n_fpr++;
++ else
++ n_ov++;
++ break;
++
++ /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
++ if one is still available, or else on the stack. If only one
++ register is free, skip the register (it won't be used for any
++ subsequent argument either). */
++
++#ifndef __s390x__
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++ if (n_gpr == MAX_GPRARGS-1)
++ n_gpr = MAX_GPRARGS;
++ if (n_gpr < MAX_GPRARGS)
++ n_gpr += 2;
++ else
++ n_ov += 2;
++ break;
++#endif
++
++ /* Everything else is passed in GPRs (until MAX_GPRARGS
++ have been used) or overflows to the stack. */
++
++ default:
++ if (n_gpr < MAX_GPRARGS)
++ n_gpr++;
++ else
++ n_ov++;
++ break;
++ }
++ }
++
++ /* Total stack space as required for overflow arguments
++ and temporary structure copies. */
++
++ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
++
++ return FFI_OK;
++}
++
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_call. */
++/* */
++/* Function - Call the FFI routine. */
++/* */
++/*====================================================================*/
++
++void
++ffi_call(ffi_cif *cif,
++ void (*fn)(),
++ void *rvalue,
++ void **avalue)
++{
++ int ret_type = cif->flags;
++ extended_cif ecif;
++
++ ecif.cif = cif;
++ ecif.avalue = avalue;
++ ecif.rvalue = rvalue;
++
++ /* If we don't have a return value, we need to fake one. */
++ if (rvalue == NULL)
++ {
++ if (ret_type == FFI390_RET_STRUCT)
++ ecif.rvalue = alloca (cif->rtype->size);
++ else
++ ret_type = FFI390_RET_VOID;
++ }
++
++ switch (cif->abi)
++ {
++ case FFI_SYSV:
++ ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
++ ret_type, ecif.rvalue, fn);
++ break;
++
++ default:
++ FFI_ASSERT (0);
++ break;
++ }
++}
++
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_closure_helper_SYSV. */
++/* */
++/* Function - Call a FFI closure target function. */
++/* */
++/*====================================================================*/
++
++void
++ffi_closure_helper_SYSV (ffi_closure *closure,
++ unsigned long *p_gpr,
++ unsigned long long *p_fpr,
++ unsigned long *p_ov)
++{
++ unsigned long long ret_buffer;
++
++ void *rvalue = &ret_buffer;
++ void **avalue;
++ void **p_arg;
++
++ int n_gpr = 0;
++ int n_fpr = 0;
++ int n_ov = 0;
++
++ ffi_type **ptr;
++ int i;
++
++ /* Allocate buffer for argument list pointers. */
++
++ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
++
++ /* If we returning a structure, pass the structure address
++ directly to the target function. Otherwise, have the target
++ function store the return value to the GPR save area. */
++
++ if (closure->cif->flags == FFI390_RET_STRUCT)
++ rvalue = (void *) p_gpr[n_gpr++];
++
++ /* Now for the arguments. */
++
++ for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
++ i > 0;
++ i--, p_arg++, ptr++)
++ {
++ int deref_struct_pointer = 0;
++ int type = (*ptr)->type;
++
++ /* Check how a structure type is passed. */
++ if (type == FFI_TYPE_STRUCT)
++ {
++ type = ffi_check_struct_type (*ptr);
++
++ /* If we pass the struct via pointer, remember to
++ retrieve the pointer later. */
++ if (type == FFI_TYPE_POINTER)
++ deref_struct_pointer = 1;
++ }
++
++ /* Pointers are passed like UINTs of the same size. */
++ if (type == FFI_TYPE_POINTER)
++#ifdef __s390x__
++ type = FFI_TYPE_UINT64;
++#else
++ type = FFI_TYPE_UINT32;
++#endif
++
++ /* Now handle all primitive int/float data types. */
++ switch (type)
++ {
++ case FFI_TYPE_DOUBLE:
++ if (n_fpr < MAX_FPRARGS)
++ *p_arg = &p_fpr[n_fpr++];
++ else
++ *p_arg = &p_ov[n_ov],
++ n_ov += sizeof (double) / sizeof (long);
++ break;
++
++ case FFI_TYPE_FLOAT:
++ if (n_fpr < MAX_FPRARGS)
++ *p_arg = &p_fpr[n_fpr++];
++ else
++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
++ break;
++
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++#ifdef __s390x__
++ if (n_gpr < MAX_GPRARGS)
++ *p_arg = &p_gpr[n_gpr++];
++ else
++ *p_arg = &p_ov[n_ov++];
++#else
++ if (n_gpr == MAX_GPRARGS-1)
++ n_gpr = MAX_GPRARGS;
++ if (n_gpr < MAX_GPRARGS)
++ *p_arg = &p_gpr[n_gpr], n_gpr += 2;
++ else
++ *p_arg = &p_ov[n_ov], n_ov += 2;
++#endif
++ break;
++
++ case FFI_TYPE_INT:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_SINT32:
++ if (n_gpr < MAX_GPRARGS)
++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
++ else
++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
++ break;
++
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_SINT16:
++ if (n_gpr < MAX_GPRARGS)
++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
++ else
++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
++ break;
++
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_SINT8:
++ if (n_gpr < MAX_GPRARGS)
++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
++ else
++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
++ break;
++
++ default:
++ FFI_ASSERT (0);
++ break;
++ }
++
++ /* If this is a struct passed via pointer, we need to
++ actually retrieve that pointer. */
++ if (deref_struct_pointer)
++ *p_arg = *(void **)*p_arg;
++ }
++
++
++ /* Call the target function. */
++ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
++
++ /* Convert the return value. */
++ switch (closure->cif->rtype->type)
++ {
++ /* Void is easy, and so is struct. */
++ case FFI_TYPE_VOID:
++ case FFI_TYPE_STRUCT:
++ break;
++
++ /* Floating point values are returned in fpr 0. */
++ case FFI_TYPE_FLOAT:
++ p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
++ break;
++
++ case FFI_TYPE_DOUBLE:
++ p_fpr[0] = *(unsigned long long *) rvalue;
++ break;
++
++ /* Integer values are returned in gpr 2 (and gpr 3
++ for 64-bit values on 31-bit machines). */
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++#ifdef __s390x__
++ p_gpr[0] = *(unsigned long *) rvalue;
++#else
++ p_gpr[0] = ((unsigned long *) rvalue)[0],
++ p_gpr[1] = ((unsigned long *) rvalue)[1];
++#endif
++ break;
++
++ case FFI_TYPE_POINTER:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_UINT8:
++ p_gpr[0] = *(unsigned long *) rvalue;
++ break;
++
++ case FFI_TYPE_INT:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_SINT8:
++ p_gpr[0] = *(signed long *) rvalue;
++ break;
++
++ default:
++ FFI_ASSERT (0);
++ break;
++ }
++}
++
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/* */
++/* Name - ffi_prep_closure. */
++/* */
++/* Function - Prepare a FFI closure. */
++/* */
++/*====================================================================*/
++
++ffi_status
++ffi_prep_closure (ffi_closure *closure,
++ ffi_cif *cif,
++ void (*fun) (ffi_cif *, void *, void **, void *),
++ void *user_data)
++{
++ FFI_ASSERT (cif->abi == FFI_SYSV);
++
++#ifndef __s390x__
++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
++ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */
++ *(short *)&closure->tramp [4] = 0x1006;
++ *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */
++ *(long *)&closure->tramp [8] = (long)closure;
++ *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
++#else
++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
++ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */
++ *(short *)&closure->tramp [4] = 0x100e;
++ *(short *)&closure->tramp [6] = 0x0004;
++ *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */
++ *(long *)&closure->tramp[16] = (long)closure;
++ *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
++#endif
++
++ closure->cif = cif;
++ closure->user_data = user_data;
++ closure->fun = fun;
++
++ return FFI_OK;
++}
++
++/*======================== End of Routine ============================*/
++
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S
+--- gcc-3.2.2.orig/libffi/src/s390/sysv.S Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/s390/sysv.S Thu Nov 28 01:44:35 2002
+@@ -0,0 +1,425 @@
++/* -----------------------------------------------------------------------
++ sysv.S - Copyright (c) 2000 Software AG
++
++ S390 Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++
++#ifndef __s390x__
++
++.text
++
++ # r2: cif->bytes
++ # r3: &ecif
++ # r4: ffi_prep_args
++ # r5: ret_type
++ # r6: ecif.rvalue
++ # ov: fn
++
++ # This assumes we are using gas.
++ .globl ffi_call_SYSV
++ .type ffi_call_SYSV,%function
++ffi_call_SYSV:
++.LFB1:
++ stm %r6,%r15,24(%r15) # Save registers
++.LCFI0:
++ basr %r13,0 # Set up base register
++.Lbase:
++ lr %r11,%r15 # Set up frame pointer
++.LCFI1:
++ sr %r15,%r2
++ ahi %r15,-96-48 # Allocate stack
++ lr %r8,%r6 # Save ecif.rvalue
++ sr %r9,%r9
++ ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
++ l %r7,96(%r11) # Load function address
++ st %r11,0(%r15) # Set up back chain
++ ahi %r11,-48 # Register save area
++.LCFI2:
++
++ la %r2,96(%r15) # Save area
++ # r3 already holds &ecif
++ basr %r14,%r4 # Call ffi_prep_args
++
++ lm %r2,%r6,0(%r11) # Load arguments
++ ld %f0,32(%r11)
++ ld %f2,40(%r11)
++ la %r14,0(%r13,%r9) # Set return address
++ br %r7 # ... and call function
++
++.LretNone: # Return void
++ l %r4,48+56(%r11)
++ lm %r6,%r15,48+24(%r11)
++ br %r4
++
++.LretFloat:
++ l %r4,48+56(%r11)
++ ste %f0,0(%r8) # Return float
++ lm %r6,%r15,48+24(%r11)
++ br %r4
++
++.LretDouble:
++ l %r4,48+56(%r11)
++ std %f0,0(%r8) # Return double
++ lm %r6,%r15,48+24(%r11)
++ br %r4
++
++.LretInt32:
++ l %r4,48+56(%r11)
++ st %r2,0(%r8) # Return int
++ lm %r6,%r15,48+24(%r11)
++ br %r4
++
++.LretInt64:
++ l %r4,48+56(%r11)
++ stm %r2,%r3,0(%r8) # Return long long
++ lm %r6,%r15,48+24(%r11)
++ br %r4
++
++.Ltable:
++ .byte .LretNone-.Lbase # FFI390_RET_VOID
++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
++ .byte .LretInt32-.Lbase # FFI390_RET_INT32
++ .byte .LretInt64-.Lbase # FFI390_RET_INT64
++
++.LFE1:
++.ffi_call_SYSV_end:
++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
++
++
++ .globl ffi_closure_SYSV
++ .type ffi_closure_SYSV,%function
++ffi_closure_SYSV:
++.LFB2:
++ stm %r12,%r15,48(%r15) # Save registers
++.LCFI10:
++ basr %r13,0 # Set up base register
++.Lcbase:
++ stm %r2,%r6,8(%r15) # Save arguments
++ std %f0,64(%r15)
++ std %f2,72(%r15)
++ lr %r1,%r15 # Set up stack frame
++ ahi %r15,-96
++.LCFI11:
++ l %r12,.Lchelper-.Lcbase(%r13) # Get helper function
++ lr %r2,%r0 # Closure
++ la %r3,8(%r1) # GPRs
++ la %r4,64(%r1) # FPRs
++ la %r5,96(%r1) # Overflow
++ st %r1,0(%r15) # Set up back chain
++
++ bas %r14,0(%r12,%r13) # Call helper
++
++ l %r4,96+56(%r15)
++ ld %f0,96+64(%r15) # Load return registers
++ lm %r2,%r3,96+8(%r15)
++ lm %r12,%r15,96+48(%r15)
++ br %r4
++
++ .align 4
++.Lchelper:
++ .long ffi_closure_helper_SYSV-.Lcbase
++
++.LFE2:
++
++.ffi_closure_SYSV_end:
++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
++
++
++ .section .eh_frame,"a",@progbits
++.Lframe1:
++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
++.LSCIE1:
++ .4byte 0x0 # CIE Identifier Tag
++ .byte 0x1 # CIE Version
++ .ascii "zR\0" # CIE Augmentation
++ .uleb128 0x1 # CIE Code Alignment Factor
++ .sleb128 -4 # CIE Data Alignment Factor
++ .byte 0xe # CIE RA Column
++ .uleb128 0x1 # Augmentation size
++ .byte 0x1b # FDE Encoding (pcrel sdata4)
++ .byte 0xc # DW_CFA_def_cfa
++ .uleb128 0xf
++ .uleb128 0x60
++ .align 4
++.LECIE1:
++.LSFDE1:
++ .4byte .LEFDE1-.LASFDE1 # FDE Length
++.LASFDE1:
++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
++ .4byte .LFB1-. # FDE initial location
++ .4byte .LFE1-.LFB1 # FDE address range
++ .uleb128 0x0 # Augmentation size
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI0-.LFB1
++ .byte 0x8f # DW_CFA_offset, column 0xf
++ .uleb128 0x9
++ .byte 0x8e # DW_CFA_offset, column 0xe
++ .uleb128 0xa
++ .byte 0x8d # DW_CFA_offset, column 0xd
++ .uleb128 0xb
++ .byte 0x8c # DW_CFA_offset, column 0xc
++ .uleb128 0xc
++ .byte 0x8b # DW_CFA_offset, column 0xb
++ .uleb128 0xd
++ .byte 0x8a # DW_CFA_offset, column 0xa
++ .uleb128 0xe
++ .byte 0x89 # DW_CFA_offset, column 0x9
++ .uleb128 0xf
++ .byte 0x88 # DW_CFA_offset, column 0x8
++ .uleb128 0x10
++ .byte 0x87 # DW_CFA_offset, column 0x7
++ .uleb128 0x11
++ .byte 0x86 # DW_CFA_offset, column 0x6
++ .uleb128 0x12
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI1-.LCFI0
++ .byte 0xd # DW_CFA_def_cfa_register
++ .uleb128 0xb
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI2-.LCFI1
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0x90
++ .align 4
++.LEFDE1:
++.LSFDE2:
++ .4byte .LEFDE2-.LASFDE2 # FDE Length
++.LASFDE2:
++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
++ .4byte .LFB2-. # FDE initial location
++ .4byte .LFE2-.LFB2 # FDE address range
++ .uleb128 0x0 # Augmentation size
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI10-.LFB2
++ .byte 0x8f # DW_CFA_offset, column 0xf
++ .uleb128 0x9
++ .byte 0x8e # DW_CFA_offset, column 0xe
++ .uleb128 0xa
++ .byte 0x8d # DW_CFA_offset, column 0xd
++ .uleb128 0xb
++ .byte 0x8c # DW_CFA_offset, column 0xc
++ .uleb128 0xc
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI11-.LCFI10
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0xc0
++ .align 4
++.LEFDE2:
++
++#else
++
++.text
++
++ # r2: cif->bytes
++ # r3: &ecif
++ # r4: ffi_prep_args
++ # r5: ret_type
++ # r6: ecif.rvalue
++ # ov: fn
++
++ # This assumes we are using gas.
++ .globl ffi_call_SYSV
++ .type ffi_call_SYSV,%function
++ffi_call_SYSV:
++.LFB1:
++ stmg %r6,%r15,48(%r15) # Save registers
++.LCFI0:
++ larl %r13,.Lbase # Set up base register
++ lgr %r11,%r15 # Set up frame pointer
++.LCFI1:
++ sgr %r15,%r2
++ aghi %r15,-160-80 # Allocate stack
++ lgr %r8,%r6 # Save ecif.rvalue
++ llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
++ lg %r7,160(%r11) # Load function address
++ stg %r11,0(%r15) # Set up back chain
++ aghi %r11,-80 # Register save area
++.LCFI2:
++
++ la %r2,160(%r15) # Save area
++ # r3 already holds &ecif
++ basr %r14,%r4 # Call ffi_prep_args
++
++ lmg %r2,%r6,0(%r11) # Load arguments
++ ld %f0,48(%r11)
++ ld %f2,56(%r11)
++ ld %f4,64(%r11)
++ ld %f6,72(%r11)
++ la %r14,0(%r13,%r9) # Set return address
++ br %r7 # ... and call function
++
++.Lbase:
++.LretNone: # Return void
++ lg %r4,80+112(%r11)
++ lmg %r6,%r15,80+48(%r11)
++ br %r4
++
++.LretFloat:
++ lg %r4,80+112(%r11)
++ ste %f0,0(%r8) # Return float
++ lmg %r6,%r15,80+48(%r11)
++ br %r4
++
++.LretDouble:
++ lg %r4,80+112(%r11)
++ std %f0,0(%r8) # Return double
++ lmg %r6,%r15,80+48(%r11)
++ br %r4
++
++.LretInt32:
++ lg %r4,80+112(%r11)
++ st %r2,0(%r8) # Return int
++ lmg %r6,%r15,80+48(%r11)
++ br %r4
++
++.LretInt64:
++ lg %r4,80+112(%r11)
++ stg %r2,0(%r8) # Return long
++ lmg %r6,%r15,80+48(%r11)
++ br %r4
++
++.Ltable:
++ .byte .LretNone-.Lbase # FFI390_RET_VOID
++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
++ .byte .LretInt32-.Lbase # FFI390_RET_INT32
++ .byte .LretInt64-.Lbase # FFI390_RET_INT64
++
++.LFE1:
++.ffi_call_SYSV_end:
++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
++
++
++ .globl ffi_closure_SYSV
++ .type ffi_closure_SYSV,%function
++ffi_closure_SYSV:
++.LFB2:
++ stmg %r14,%r15,112(%r15) # Save registers
++.LCFI10:
++ stmg %r2,%r6,16(%r15) # Save arguments
++ std %f0,128(%r15)
++ std %f2,136(%r15)
++ std %f4,144(%r15)
++ std %f6,152(%r15)
++ lgr %r1,%r15 # Set up stack frame
++ aghi %r15,-160
++.LCFI11:
++ lgr %r2,%r0 # Closure
++ la %r3,16(%r1) # GPRs
++ la %r4,128(%r1) # FPRs
++ la %r5,160(%r1) # Overflow
++ stg %r1,0(%r15) # Set up back chain
++
++ brasl %r14,ffi_closure_helper_SYSV # Call helper
++
++ lg %r14,160+112(%r15)
++ ld %f0,160+128(%r15) # Load return registers
++ lg %r2,160+16(%r15)
++ la %r15,160(%r15)
++ br %r14
++.LFE2:
++
++.ffi_closure_SYSV_end:
++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
++
++
++
++ .section .eh_frame,"a",@progbits
++.Lframe1:
++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
++.LSCIE1:
++ .4byte 0x0 # CIE Identifier Tag
++ .byte 0x1 # CIE Version
++ .ascii "zR\0" # CIE Augmentation
++ .uleb128 0x1 # CIE Code Alignment Factor
++ .sleb128 -8 # CIE Data Alignment Factor
++ .byte 0xe # CIE RA Column
++ .uleb128 0x1 # Augmentation size
++ .byte 0x1b # FDE Encoding (pcrel sdata4)
++ .byte 0xc # DW_CFA_def_cfa
++ .uleb128 0xf
++ .uleb128 0xa0
++ .align 8
++.LECIE1:
++.LSFDE1:
++ .4byte .LEFDE1-.LASFDE1 # FDE Length
++.LASFDE1:
++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
++ .4byte .LFB1-. # FDE initial location
++ .4byte .LFE1-.LFB1 # FDE address range
++ .uleb128 0x0 # Augmentation size
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI0-.LFB1
++ .byte 0x8f # DW_CFA_offset, column 0xf
++ .uleb128 0x5
++ .byte 0x8e # DW_CFA_offset, column 0xe
++ .uleb128 0x6
++ .byte 0x8d # DW_CFA_offset, column 0xd
++ .uleb128 0x7
++ .byte 0x8c # DW_CFA_offset, column 0xc
++ .uleb128 0x8
++ .byte 0x8b # DW_CFA_offset, column 0xb
++ .uleb128 0x9
++ .byte 0x8a # DW_CFA_offset, column 0xa
++ .uleb128 0xa
++ .byte 0x89 # DW_CFA_offset, column 0x9
++ .uleb128 0xb
++ .byte 0x88 # DW_CFA_offset, column 0x8
++ .uleb128 0xc
++ .byte 0x87 # DW_CFA_offset, column 0x7
++ .uleb128 0xd
++ .byte 0x86 # DW_CFA_offset, column 0x6
++ .uleb128 0xe
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI1-.LCFI0
++ .byte 0xd # DW_CFA_def_cfa_register
++ .uleb128 0xb
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI2-.LCFI1
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0xf0
++ .align 8
++.LEFDE1:
++.LSFDE2:
++ .4byte .LEFDE2-.LASFDE2 # FDE Length
++.LASFDE2:
++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
++ .4byte .LFB2-. # FDE initial location
++ .4byte .LFE2-.LFB2 # FDE address range
++ .uleb128 0x0 # Augmentation size
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI10-.LFB2
++ .byte 0x8f # DW_CFA_offset, column 0xf
++ .uleb128 0x5
++ .byte 0x8e # DW_CFA_offset, column 0xe
++ .uleb128 0x6
++ .byte 0x4 # DW_CFA_advance_loc4
++ .4byte .LCFI11-.LCFI10
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0x140
++ .align 8
++.LEFDE2:
++
++#endif
++
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c
+--- gcc-3.2.2.orig/libffi/src/sh/ffi.c Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/sh/ffi.c Fri Jul 19 10:08:43 2002
+@@ -0,0 +1,722 @@
++/* -----------------------------------------------------------------------
++ ffi.c - Copyright (c) 2002 Kaz Kojima
++
++ SuperH Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++
++#define NGREGARG 4
++#if defined(__SH4__)
++#define NFREGARG 8
++#endif
++
++#if defined(__HITACHI__)
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
++#else
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
++#endif
++
++/* If the structure has essentialy an unique element, return its type. */
++static int
++simple_type (ffi_type *arg)
++{
++ if (arg->type != FFI_TYPE_STRUCT)
++ return arg->type;
++ else if (arg->elements[1])
++ return FFI_TYPE_STRUCT;
++
++ return simple_type (arg->elements[0]);
++}
++
++static int
++return_type (ffi_type *arg)
++{
++ unsigned short type;
++
++ if (arg->type != FFI_TYPE_STRUCT)
++ return arg->type;
++
++ type = simple_type (arg->elements[0]);
++ if (! arg->elements[1])
++ {
++ switch (type)
++ {
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_UINT32:
++ return FFI_TYPE_INT;
++
++ default:
++ return type;
++ }
++ }
++
++ /* gcc uses r0/r1 pair for some kind of structures. */
++ if (arg->size <= 2 * sizeof (int))
++ {
++ int i = 0;
++ ffi_type *e;
++
++ while ((e = arg->elements[i++]))
++ {
++ type = simple_type (e);
++ switch (type)
++ {
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_INT:
++ case FFI_TYPE_FLOAT:
++ return FFI_TYPE_UINT64;
++
++ default:
++ break;
++ }
++ }
++ }
++
++ return FFI_TYPE_STRUCT;
++}
++
++/* ffi_prep_args is called by the assembly routine once stack space
++ has been allocated for the function's arguments */
++
++/*@-exportheader@*/
++void ffi_prep_args(char *stack, extended_cif *ecif)
++/*@=exportheader@*/
++{
++ register unsigned int i;
++ register int tmp;
++ register unsigned int avn;
++ register void **p_argv;
++ register char *argp;
++ register ffi_type **p_arg;
++ int greg, ireg;
++#if defined(__SH4__)
++ int freg = 0;
++#endif
++
++ tmp = 0;
++ argp = stack;
++
++ if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
++ {
++ *(void **) argp = ecif->rvalue;
++ argp += 4;
++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
++ }
++ else
++ ireg = 0;
++
++ /* Set arguments for registers. */
++ greg = ireg;
++ avn = ecif->cif->nargs;
++ p_argv = ecif->avalue;
++
++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
++ {
++ size_t z;
++
++ z = (*p_arg)->size;
++ if (z < sizeof(int))
++ {
++ if (greg++ >= NGREGARG)
++ continue;
++
++ z = sizeof(int);
++ switch ((*p_arg)->type)
++ {
++ case FFI_TYPE_SINT8:
++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_UINT8:
++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_SINT16:
++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_UINT16:
++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_STRUCT:
++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ }
++ argp += z;
++ }
++ else if (z == sizeof(int))
++ {
++#if defined(__SH4__)
++ if ((*p_arg)->type == FFI_TYPE_FLOAT)
++ {
++ if (freg++ >= NFREGARG)
++ continue;
++ }
++ else
++#endif
++ {
++ if (greg++ >= NGREGARG)
++ continue;
++ }
++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++ argp += z;
++ }
++#if defined(__SH4__)
++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++ {
++ if (freg + 1 >= NFREGARG)
++ continue;
++ freg = (freg + 1) & ~1;
++ freg += 2;
++ memcpy (argp, *p_argv, z);
++ argp += z;
++ }
++#endif
++ else
++ {
++ int n = (z + sizeof (int) - 1) / sizeof (int);
++#if defined(__SH4__)
++ if (greg + n - 1 >= NGREGARG)
++ continue;
++ greg += n;
++#else
++ if (greg >= NGREGARG)
++ continue;
++ else if (greg + n - 1 >= NGREGARG)
++ greg = NGREGARG;
++ else
++ greg += n;
++#endif
++ memcpy (argp, *p_argv, z);
++ argp += z;
++ }
++ }
++
++ /* Set arguments on stack. */
++ greg = ireg;
++#if defined(__SH4__)
++ freg = 0;
++#endif
++ p_argv = ecif->avalue;
++
++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
++ {
++ size_t z;
++
++ z = (*p_arg)->size;
++ if (z < sizeof(int))
++ {
++ if (greg++ < NGREGARG)
++ continue;
++
++ z = sizeof(int);
++ switch ((*p_arg)->type)
++ {
++ case FFI_TYPE_SINT8:
++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_UINT8:
++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_SINT16:
++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_UINT16:
++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
++ break;
++
++ case FFI_TYPE_STRUCT:
++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ }
++ argp += z;
++ }
++ else if (z == sizeof(int))
++ {
++#if defined(__SH4__)
++ if ((*p_arg)->type == FFI_TYPE_FLOAT)
++ {
++ if (freg++ < NFREGARG)
++ continue;
++ }
++ else
++#endif
++ {
++ if (greg++ < NGREGARG)
++ continue;
++ }
++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++ argp += z;
++ }
++#if defined(__SH4__)
++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++ {
++ if (freg + 1 < NFREGARG)
++ {
++ freg = (freg + 1) & ~1;
++ freg += 2;
++ continue;
++ }
++ memcpy (argp, *p_argv, z);
++ argp += z;
++ }
++#endif
++ else
++ {
++ int n = (z + sizeof (int) - 1) / sizeof (int);
++ if (greg + n - 1 < NGREGARG)
++ {
++ greg += n;
++ continue;
++ }
++#if (! defined(__SH4__))
++ else if (greg < NGREGARG)
++ {
++ greg = NGREGARG;
++ continue;
++ }
++#endif
++ memcpy (argp, *p_argv, z);
++ argp += z;
++ }
++ }
++
++ return;
++}
++
++/* Perform machine dependent cif processing */
++ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
++{
++ int i, j;
++ int size, type;
++ int n, m;
++ int greg;
++#if defined(__SH4__)
++ int freg = 0;
++#endif
++
++ cif->flags = 0;
++
++ greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
++ STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
++
++#if defined(__SH4__)
++ for (i = j = 0; i < cif->nargs && j < 12; i++)
++ {
++ type = (cif->arg_types)[i]->type;
++ switch (type)
++ {
++ case FFI_TYPE_FLOAT:
++ if (freg >= NFREGARG)
++ continue;
++ freg++;
++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
++ j++;
++ break;
++
++ case FFI_TYPE_DOUBLE:
++ if ((freg + 1) >= NFREGARG)
++ continue;
++ freg = (freg + 1) & ~1;
++ freg += 2;
++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
++ j++;
++ break;
++
++ default:
++ size = (cif->arg_types)[i]->size;
++ n = (size + sizeof (int) - 1) / sizeof (int);
++ if (greg + n - 1 >= NGREGARG)
++ continue;
++ greg += n;
++ for (m = 0; m < n; m++)
++ cif->flags += FFI_TYPE_INT << (2 * j++);
++ break;
++ }
++ }
++#else
++ for (i = j = 0; i < cif->nargs && j < 4; i++)
++ {
++ size = (cif->arg_types)[i]->size;
++ n = (size + sizeof (int) - 1) / sizeof (int);
++ if (greg >= NGREGARG)
++ continue;
++ else if (greg + n - 1 >= NGREGARG)
++ greg = NGREGARG;
++ else
++ greg += n;
++ for (m = 0; m < n; m++)
++ cif->flags += FFI_TYPE_INT << (2 * j++);
++ }
++#endif
++
++ /* Set the return type flag */
++ switch (cif->rtype->type)
++ {
++ case FFI_TYPE_STRUCT:
++ cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
++ break;
++
++ case FFI_TYPE_VOID:
++ case FFI_TYPE_FLOAT:
++ case FFI_TYPE_DOUBLE:
++ case FFI_TYPE_SINT64:
++ case FFI_TYPE_UINT64:
++ cif->flags += (unsigned) cif->rtype->type << 24;
++ break;
++
++ default:
++ cif->flags += FFI_TYPE_INT << 24;
++ break;
++ }
++
++ return FFI_OK;
++}
++
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_SYSV(void (*)(char *, extended_cif *),
++ /*@out@*/ extended_cif *,
++ unsigned, unsigned,
++ /*@out@*/ unsigned *,
++ void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++
++void ffi_call(/*@dependent@*/ ffi_cif *cif,
++ void (*fn)(),
++ /*@out@*/ void *rvalue,
++ /*@dependent@*/ void **avalue)
++{
++ extended_cif ecif;
++
++ ecif.cif = cif;
++ ecif.avalue = avalue;
++
++ /* If the return value is a struct and we don't have a return */
++ /* value address then we need to make one */
++
++ if ((rvalue == NULL) &&
++ (cif->rtype->type == FFI_TYPE_STRUCT))
++ {
++ /*@-sysunrecog@*/
++ ecif.rvalue = alloca(cif->rtype->size);
++ /*@=sysunrecog@*/
++ }
++ else
++ ecif.rvalue = rvalue;
++
++
++ switch (cif->abi)
++ {
++ case FFI_SYSV:
++ /*@-usedef@*/
++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
++ cif->flags, ecif.rvalue, fn);
++ /*@=usedef@*/
++ break;
++ default:
++ FFI_ASSERT(0);
++ break;
++ }
++}
++
++extern void ffi_closure_SYSV (void);
++#if defined(__SH4__)
++extern void __ic_invalidate (void *line);
++#endif
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++ ffi_cif* cif,
++ void (*fun)(ffi_cif*, void*, void**, void*),
++ void *user_data)
++{
++ unsigned int *tramp;
++
++ FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
++
++ tramp = (unsigned int *) &closure->tramp[0];
++#ifdef __LITTLE_ENDIAN__
++ tramp[0] = 0xd301d202;
++ tramp[1] = 0x0009422b;
++#else
++ tramp[0] = 0xd202d301;
++ tramp[1] = 0x422b0009;
++#endif
++ *(void **) &tramp[2] = (void *)closure; /* ctx */
++ *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
++
++ closure->cif = cif;
++ closure->fun = fun;
++ closure->user_data = user_data;
++
++#if defined(__SH4__)
++ /* Flush the icache. */
++ __ic_invalidate(&closure->tramp[0]);
++#endif
++
++ return FFI_OK;
++}
++
++/* Basically the trampoline invokes ffi_closure_SYSV, and on
++ * entry, r3 holds the address of the closure.
++ * After storing the registers that could possibly contain
++ * parameters to be passed into the stack frame and setting
++ * up space for a return value, ffi_closure_SYSV invokes the
++ * following helper function to do most of the work.
++ */
++
++#ifdef __LITTLE_ENDIAN__
++#define OFS_INT8 0
++#define OFS_INT16 2
++#else
++#define OFS_INT8 3
++#define OFS_INT16 2
++#endif
++
++int
++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
++ unsigned long *pgr, unsigned long *pfr,
++ unsigned long *pst)
++{
++ void **avalue;
++ ffi_type **p_arg;
++ int i, avn;
++ int ireg, greg = 0;
++#if defined(__SH4__)
++ int freg = 0;
++#endif
++ ffi_cif *cif;
++ double temp;
++
++ cif = closure->cif;
++ avalue = alloca(cif->nargs * sizeof(void *));
++
++ /* Copy the caller's structure return value address so that the closure
++ returns the data directly to the caller. */
++ if (cif->rtype->type == FFI_TYPE_STRUCT)
++ {
++ rvalue = *pgr++;
++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
++ }
++ else
++ ireg = 0;
++
++ cif = closure->cif;
++ greg = ireg;
++ avn = cif->nargs;
++
++ /* Grab the addresses of the arguments from the stack frame. */
++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
++ {
++ size_t z;
++
++ z = (*p_arg)->size;
++ if (z < sizeof(int))
++ {
++ if (greg++ >= NGREGARG)
++ continue;
++
++ z = sizeof(int);
++ switch ((*p_arg)->type)
++ {
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_UINT8:
++ avalue[i] = (((char *)pgr) + OFS_INT8);
++ break;
++
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT16:
++ avalue[i] = (((char *)pgr) + OFS_INT16);
++ break;
++
++ case FFI_TYPE_STRUCT:
++ avalue[i] = pgr;
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ }
++ pgr++;
++ }
++ else if (z == sizeof(int))
++ {
++#if defined(__SH4__)
++ if ((*p_arg)->type == FFI_TYPE_FLOAT)
++ {
++ if (freg++ >= NFREGARG)
++ continue;
++ avalue[i] = pfr;
++ pfr++;
++ }
++ else
++#endif
++ {
++ if (greg++ >= NGREGARG)
++ continue;
++ avalue[i] = pgr;
++ pgr++;
++ }
++ }
++#if defined(__SH4__)
++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++ {
++ if (freg + 1 >= NFREGARG)
++ continue;
++ freg = (freg + 1) & ~1;
++ freg += 2;
++ avalue[i] = pfr;
++ pfr += 2;
++ }
++#endif
++ else
++ {
++ int n = (z + sizeof (int) - 1) / sizeof (int);
++#if defined(__SH4__)
++ if (greg + n - 1 >= NGREGARG)
++ continue;
++ greg += n;
++#else
++ if (greg >= NGREGARG)
++ continue;
++ else if (greg + n - 1 >= NGREGARG)
++ greg = NGREGARG;
++ else
++ greg += n;
++#endif
++ avalue[i] = pgr;
++ pgr += n;
++ }
++ }
++
++ greg = ireg;
++#if defined(__SH4__)
++ freg = 0;
++#endif
++
++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
++ {
++ size_t z;
++
++ z = (*p_arg)->size;
++ if (z < sizeof(int))
++ {
++ if (greg++ < NGREGARG)
++ continue;
++
++ z = sizeof(int);
++ switch ((*p_arg)->type)
++ {
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_UINT8:
++ avalue[i] = (((char *)pst) + OFS_INT8);
++ break;
++
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT16:
++ avalue[i] = (((char *)pst) + OFS_INT16);
++ break;
++
++ case FFI_TYPE_STRUCT:
++ avalue[i] = pst;
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ }
++ pst++;
++ }
++ else if (z == sizeof(int))
++ {
++#if defined(__SH4__)
++ if ((*p_arg)->type == FFI_TYPE_FLOAT)
++ {
++ if (freg++ < NFREGARG)
++ continue;
++ }
++ else
++#endif
++ {
++ if (greg++ < NGREGARG)
++ continue;
++ }
++ avalue[i] = pst;
++ pst++;
++ }
++#if defined(__SH4__)
++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++ {
++ if (freg + 1 < NFREGARG)
++ {
++ freg = (freg + 1) & ~1;
++ freg += 2;
++ continue;
++ }
++ avalue[i] = pst;
++ pst += 2;
++ }
++#endif
++ else
++ {
++ int n = (z + sizeof (int) - 1) / sizeof (int);
++ if (greg + n - 1 < NGREGARG)
++ {
++ greg += n;
++ continue;
++ }
++#if (! defined(__SH4__))
++ else if (greg < NGREGARG)
++ {
++ greg = NGREGARG;
++ continue;
++ }
++#endif
++ avalue[i] = pst;
++ pst += n;
++ }
++ }
++
++ (closure->fun) (cif, rvalue, avalue, closure->user_data);
++
++ /* Tell ffi_closure_osf how to perform return type promotions. */
++ return cif->rtype->type;
++}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S
+--- gcc-3.2.2.orig/libffi/src/sh/sysv.S Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/sh/sysv.S Tue Dec 17 03:22:48 2002
+@@ -0,0 +1,773 @@
++/* -----------------------------------------------------------------------
++ sysv.S - Copyright (c) 2002 Kaz Kojima
++
++ SuperH Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++
++#define LIBFFI_ASM
++#include <ffi.h>
++#ifdef HAVE_MACHINE_ASM_H
++#include <machine/asm.h>
++#else
++/* XXX these lose for some platforms, I'm sure. */
++#define CNAME(x) x
++#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
++#endif
++
++#if defined(__HITACHI__)
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
++#else
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
++#endif
++
++.text
++
++ # r4: ffi_prep_args
++ # r5: &ecif
++ # r6: bytes
++ # r7: flags
++ # sp+0: rvalue
++ # sp+4: fn
++
++ # This assumes we are using gas.
++ENTRY(ffi_call_SYSV)
++ # Save registers
++.LFB1:
++ mov.l r8,@-r15
++.LCFI0:
++ mov.l r9,@-r15
++.LCFI1:
++ mov.l r10,@-r15
++.LCFI2:
++ mov.l r12,@-r15
++.LCFI3:
++ mov.l r14,@-r15
++.LCFI4:
++ sts.l pr,@-r15
++.LCFI5:
++ mov r15,r14
++.LCFI6:
++#if defined(__SH4__)
++ mov r6,r8
++ mov r7,r9
++
++ sub r6,r15
++ add #-16,r15
++ mov #~7,r0
++ and r0,r15
++
++ mov r4,r0
++ jsr @r0
++ mov r15,r4
++
++ mov r9,r1
++ shlr8 r9
++ shlr8 r9
++ shlr8 r9
++
++ mov #FFI_TYPE_STRUCT,r2
++ cmp/eq r2,r9
++ bf 1f
++#if STRUCT_VALUE_ADDRESS_WITH_ARG
++ mov.l @r15+,r4
++ bra 2f
++ mov #5,r2
++#else
++ mov.l @r15+,r10
++#endif
++1:
++ mov #4,r2
++2:
++ mov #4,r3
++
++L_pass:
++ cmp/pl r8
++ bf L_call_it
++
++ mov r1,r0
++ and #3,r0
++
++L_pass_d:
++ cmp/eq #FFI_TYPE_DOUBLE,r0
++ bf L_pass_f
++
++ mov r3,r0
++ and #1,r0
++ tst r0,r0
++ bt 1f
++ add #1,r3
++1:
++ mov r15,r0
++ and #7,r0
++ tst r0,r0
++ bt 2f
++ add #4,r15
++2:
++ mov #12,r0
++ cmp/hs r0,r3
++ bt/s 3f
++ shlr2 r1
++ bsr L_pop_d
++ nop
++3:
++ add #2,r3
++ bra L_pass
++ add #-8,r8
++
++L_pop_d:
++ mov r3,r0
++ add r0,r0
++ add r3,r0
++ add #-12,r0
++ braf r0
++ nop
++#ifdef __LITTLE_ENDIAN__
++ fmov.s @r15+,fr5
++ rts
++ fmov.s @r15+,fr4
++ fmov.s @r15+,fr7
++ rts
++ fmov.s @r15+,fr6
++ fmov.s @r15+,fr9
++ rts
++ fmov.s @r15+,fr8
++ fmov.s @r15+,fr11
++ rts
++ fmov.s @r15+,fr10
++#else
++ fmov.s @r15+,fr4
++ rts
++ fmov.s @r15+,fr5
++ fmov.s @r15+,fr6
++ rts
++ fmov.s @r15+,fr7
++ fmov.s @r15+,fr8
++ rts
++ fmov.s @r15+,fr9
++ fmov.s @r15+,fr10
++ rts
++ fmov.s @r15+,fr11
++#endif
++
++L_pass_f:
++ cmp/eq #FFI_TYPE_FLOAT,r0
++ bf L_pass_i
++
++ mov #12,r0
++ cmp/hs r0,r3
++ bt/s 2f
++ shlr2 r1
++ bsr L_pop_f
++ nop
++2:
++ add #1,r3
++ bra L_pass
++ add #-4,r8
++
++L_pop_f:
++ mov r3,r0
++ shll2 r0
++ add #-16,r0
++ braf r0
++ nop
++#ifdef __LITTLE_ENDIAN__
++ rts
++ fmov.s @r15+,fr5
++ rts
++ fmov.s @r15+,fr4
++ rts
++ fmov.s @r15+,fr7
++ rts
++ fmov.s @r15+,fr6
++ rts
++ fmov.s @r15+,fr9
++ rts
++ fmov.s @r15+,fr8
++ rts
++ fmov.s @r15+,fr11
++ rts
++ fmov.s @r15+,fr10
++#else
++ rts
++ fmov.s @r15+,fr4
++ rts
++ fmov.s @r15+,fr5
++ rts
++ fmov.s @r15+,fr6
++ rts
++ fmov.s @r15+,fr7
++ rts
++ fmov.s @r15+,fr8
++ rts
++ fmov.s @r15+,fr9
++ rts
++ fmov.s @r15+,fr10
++ rts
++ fmov.s @r15+,fr11
++#endif
++
++L_pass_i:
++ cmp/eq #FFI_TYPE_INT,r0
++ bf L_call_it
++
++ mov #8,r0
++ cmp/hs r0,r2
++ bt/s 2f
++ shlr2 r1
++ bsr L_pop_i
++ nop
++2:
++ add #1,r2
++ bra L_pass
++ add #-4,r8
++
++L_pop_i:
++ mov r2,r0
++ shll2 r0
++ add #-16,r0
++ braf r0
++ nop
++ rts
++ mov.l @r15+,r4
++ rts
++ mov.l @r15+,r5
++ rts
++ mov.l @r15+,r6
++ rts
++ mov.l @r15+,r7
++
++L_call_it:
++ # call function
++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
++ mov r10, r2
++#endif
++ mov.l @(28,r14),r1
++ jsr @r1
++ nop
++
++L_ret_d:
++ mov #FFI_TYPE_DOUBLE,r2
++ cmp/eq r2,r9
++ bf L_ret_ll
++
++ mov.l @(24,r14),r1
++#ifdef __LITTLE_ENDIAN__
++ fmov.s fr1,@r1
++ add #4,r1
++ bra L_epilogue
++ fmov.s fr0,@r1
++#else
++ fmov.s fr0,@r1
++ add #4,r1
++ bra L_epilogue
++ fmov.s fr1,@r1
++#endif
++
++L_ret_ll:
++ mov #FFI_TYPE_SINT64,r2
++ cmp/eq r2,r9
++ bt/s 1f
++ mov #FFI_TYPE_UINT64,r2
++ cmp/eq r2,r9
++ bf L_ret_f
++
++1:
++ mov.l @(24,r14),r2
++ mov.l r0,@r2
++ bra L_epilogue
++ mov.l r1,@(4,r2)
++
++L_ret_f:
++ mov #FFI_TYPE_FLOAT,r2
++ cmp/eq r2,r9
++ bf L_ret_i
++
++ mov.l @(24,r14),r1
++ bra L_epilogue
++ fmov.s fr0,@r1
++
++L_ret_i:
++ mov #FFI_TYPE_INT,r2
++ cmp/eq r2,r9
++ bf L_epilogue
++
++ mov.l @(24,r14),r1
++ bra L_epilogue
++ mov.l r0,@r1
++
++L_epilogue:
++ # Remove the space we pushed for the args
++ mov r14,r15
++
++ lds.l @r15+,pr
++ mov.l @r15+,r14
++ mov.l @r15+,r12
++ mov.l @r15+,r10
++ mov.l @r15+,r9
++ rts
++ mov.l @r15+,r8
++#else
++ mov r6,r8
++ mov r7,r9
++
++ sub r6,r15
++ add #-16,r15
++ mov #~7,r0
++ and r0,r15
++
++ mov r4,r0
++ jsr @r0
++ mov r15,r4
++
++ mov r9,r3
++ shlr8 r9
++ shlr8 r9
++ shlr8 r9
++
++ mov #FFI_TYPE_STRUCT,r2
++ cmp/eq r2,r9
++ bf 1f
++#if STRUCT_VALUE_ADDRESS_WITH_ARG
++ mov.l @r15+,r4
++ bra 2f
++ mov #5,r2
++#else
++ mov.l @r15+,r10
++#endif
++1:
++ mov #4,r2
++2:
++
++L_pass:
++ cmp/pl r8
++ bf L_call_it
++
++ mov r3,r0
++ and #3,r0
++
++L_pass_d:
++ cmp/eq #FFI_TYPE_DOUBLE,r0
++ bf L_pass_i
++
++ mov r15,r0
++ and #7,r0
++ tst r0,r0
++ bt 1f
++ add #4,r15
++1:
++ mov #8,r0
++ cmp/hs r0,r2
++ bt/s 2f
++ shlr2 r3
++ bsr L_pop_d
++ nop
++2:
++ add #2,r2
++ bra L_pass
++ add #-8,r8
++
++L_pop_d:
++ mov r2,r0
++ add r0,r0
++ add r2,r0
++ add #-12,r0
++ add r0,r0
++ braf r0
++ nop
++ mov.l @r15+,r4
++ rts
++ mov.l @r15+,r5
++ mov.l @r15+,r5
++ rts
++ mov.l @r15+,r6
++ mov.l @r15+,r6
++ rts
++ mov.l @r15+,r7
++ rts
++ mov.l @r15+,r7
++
++L_pass_i:
++ mov #8,r0
++ cmp/hs r0,r2
++ bt/s 2f
++ shlr2 r3
++ bsr L_pop_i
++ nop
++2:
++ add #1,r2
++ bra L_pass
++ add #-4,r8
++
++L_pop_i:
++ mov r2,r0
++ shll2 r0
++ add #-16,r0
++ braf r0
++ nop
++ rts
++ mov.l @r15+,r4
++ rts
++ mov.l @r15+,r5
++ rts
++ mov.l @r15+,r6
++ rts
++ mov.l @r15+,r7
++
++L_call_it:
++ # call function
++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
++ mov r10, r2
++#endif
++ mov.l @(28,r14),r1
++ jsr @r1
++ nop
++
++L_ret_d:
++ mov #FFI_TYPE_DOUBLE,r2
++ cmp/eq r2,r9
++ bf L_ret_ll
++
++ mov.l @(24,r14),r2
++ mov.l r0,@r2
++ bra L_epilogue
++ mov.l r1,@(4,r2)
++
++L_ret_ll:
++ mov #FFI_TYPE_SINT64,r2
++ cmp/eq r2,r9
++ bt/s 1f
++ mov #FFI_TYPE_UINT64,r2
++ cmp/eq r2,r9
++ bf L_ret_i
++
++1:
++ mov.l @(24,r14),r2
++ mov.l r0,@r2
++ bra L_epilogue
++ mov.l r1,@(4,r2)
++
++L_ret_i:
++ mov #FFI_TYPE_FLOAT,r2
++ cmp/eq r2,r9
++ bt 1f
++ mov #FFI_TYPE_INT,r2
++ cmp/eq r2,r9
++ bf L_epilogue
++1:
++ mov.l @(24,r14),r1
++ bra L_epilogue
++ mov.l r0,@r1
++
++L_epilogue:
++ # Remove the space we pushed for the args
++ mov r14,r15
++
++ lds.l @r15+,pr
++ mov.l @r15+,r14
++ mov.l @r15+,r12
++ mov.l @r15+,r10
++ mov.l @r15+,r9
++ rts
++ mov.l @r15+,r8
++#endif
++.LFE1:
++.ffi_call_SYSV_end:
++ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
++
++.globl ffi_closure_helper_SYSV
++
++ENTRY(ffi_closure_SYSV)
++.LFB2:
++ mov.l r14,@-r15
++.LCFI7:
++ sts.l pr,@-r15
++
++ /* Stack layout:
++ ...
++ 32 bytes (floating register parameters, SH-4 only)
++ 16 bytes (register parameters)
++ 4 bytes (result)
++ 4 bytes (5th arg)
++ <- new stack pointer
++ */
++.LCFI8:
++#if defined(__SH4__)
++ add #-56,r15
++#else
++ add #-24,r15
++#endif
++.LCFI9:
++ mov r15,r14
++.LCFIA:
++ mov r14,r1
++ add #24,r1
++ mov.l r7,@-r1
++ mov.l r6,@-r1
++ mov.l r5,@-r1
++ mov.l r4,@-r1
++ mov r1,r6
++
++#if defined(__SH4__)
++ mov r14,r1
++ add #56,r1
++#ifdef __LITTLE_ENDIAN__
++ fmov.s fr10,@-r1
++ fmov.s fr11,@-r1
++ fmov.s fr8,@-r1
++ fmov.s fr9,@-r1
++ fmov.s fr6,@-r1
++ fmov.s fr7,@-r1
++ fmov.s fr4,@-r1
++ fmov.s fr5,@-r1
++#else
++ fmov.s fr11,@-r1
++ fmov.s fr10,@-r1
++ fmov.s fr9,@-r1
++ fmov.s fr8,@-r1
++ fmov.s fr7,@-r1
++ fmov.s fr6,@-r1
++ fmov.s fr5,@-r1
++ fmov.s fr4,@-r1
++#endif
++ mov r1,r7
++#endif
++
++ mov r14,r1
++ add #4,r1
++ mov r1,r5
++
++ mov r14,r1
++#if defined(__SH4__)
++ add #64,r1
++#else
++ add #32,r1
++#endif
++ mov.l r1,@r14
++
++ mov.l L_helper,r0
++ jsr @r0
++ mov r3,r4
++
++ shll r0
++ mov r0,r1
++ mova L_table,r0
++ add r1,r0
++ mov.w @r0,r0
++ mov r14,r2
++ braf r0
++ add #4,r2
++0:
++ .align 2
++L_helper:
++ .long ffi_closure_helper_SYSV
++L_table:
++ .short L_case_v - 0b /* FFI_TYPE_VOID */
++ .short L_case_i - 0b /* FFI_TYPE_INT */
++#if defined(__SH4__)
++ .short L_case_f - 0b /* FFI_TYPE_FLOAT */
++ .short L_case_d - 0b /* FFI_TYPE_DOUBLE */
++ .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */
++#else
++ .short L_case_i - 0b /* FFI_TYPE_FLOAT */
++ .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */
++ .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */
++#endif
++ .short L_case_uq - 0b /* FFI_TYPE_UINT8 */
++ .short L_case_q - 0b /* FFI_TYPE_SINT8 */
++ .short L_case_uh - 0b /* FFI_TYPE_UINT16 */
++ .short L_case_h - 0b /* FFI_TYPE_SINT16 */
++ .short L_case_i - 0b /* FFI_TYPE_UINT32 */
++ .short L_case_i - 0b /* FFI_TYPE_SINT32 */
++ .short L_case_ll - 0b /* FFI_TYPE_UINT64 */
++ .short L_case_ll - 0b /* FFI_TYPE_SINT64 */
++ .short L_case_v - 0b /* FFI_TYPE_STRUCT */
++ .short L_case_i - 0b /* FFI_TYPE_POINTER */
++
++#if defined(__SH4__)
++L_case_d:
++#ifdef __LITTLE_ENDIAN__
++ fmov.s @r2+,fr1
++ bra L_case_v
++ fmov.s @r2,fr0
++#else
++ fmov.s @r2+,fr0
++ bra L_case_v
++ fmov.s @r2,fr1
++#endif
++
++L_case_f:
++ bra L_case_v
++ fmov.s @r2,fr0
++#endif
++
++L_case_ll:
++ mov.l @r2+,r0
++ bra L_case_v
++ mov.l @r2,r1
++
++L_case_i:
++ bra L_case_v
++ mov.l @r2,r0
++
++L_case_q:
++#ifdef __LITTLE_ENDIAN__
++#else
++ add #3,r2
++#endif
++ bra L_case_v
++ mov.b @r2,r0
++
++L_case_uq:
++#ifdef __LITTLE_ENDIAN__
++#else
++ add #3,r2
++#endif
++ mov.b @r2,r0
++ bra L_case_v
++ extu.b r0,r0
++
++L_case_h:
++#ifdef __LITTLE_ENDIAN__
++#else
++ add #2,r2
++#endif
++ bra L_case_v
++ mov.w @r2,r0
++
++L_case_uh:
++#ifdef __LITTLE_ENDIAN__
++#else
++ add #2,r2
++#endif
++ mov.w @r2,r0
++ extu.w r0,r0
++ /* fall through */
++
++L_case_v:
++#if defined(__SH4__)
++ add #56,r15
++#else
++ add #24,r15
++#endif
++ lds.l @r15+,pr
++ rts
++ mov.l @r15+,r14
++.LFE2:
++.ffi_closure_SYSV_end:
++ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
++
++ .section ".eh_frame","aw",@progbits
++__FRAME_BEGIN__:
++ .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */
++.LSCIE1:
++ .4byte 0x0 /* CIE Identifier Tag */
++ .byte 0x1 /* CIE Version */
++ .byte 0x0 /* CIE Augmentation */
++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */
++ .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */
++ .byte 0x11 /* CIE RA Column */
++ .byte 0xc /* DW_CFA_def_cfa */
++ .byte 0xf /* uleb128 0xf */
++ .byte 0x0 /* uleb128 0x0 */
++ .align 2
++.LECIE1:
++.LSFDE1:
++ .4byte .LEFDE1-.LASFDE1 /* FDE Length */
++.LASFDE1:
++ .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */
++ .4byte .LFB1 /* FDE initial location */
++ .4byte .LFE1-.LFB1 /* FDE address range */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI0-.LFB1
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x4 /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI1-.LCFI0
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x8 /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI2-.LCFI1
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0xc /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI3-.LCFI2
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x10 /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI4-.LCFI3
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x14 /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI5-.LCFI4
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x18 /* uleb128 0x4 */
++ .byte 0x91 /* DW_CFA_offset, column 0x11 */
++ .byte 0x6 /* uleb128 0x6 */
++ .byte 0x8e /* DW_CFA_offset, column 0xe */
++ .byte 0x5 /* uleb128 0x5 */
++ .byte 0x8c /* DW_CFA_offset, column 0xc */
++ .byte 0x4 /* uleb128 0x4 */
++ .byte 0x8a /* DW_CFA_offset, column 0xa */
++ .byte 0x3 /* uleb128 0x3 */
++ .byte 0x89 /* DW_CFA_offset, column 0x9 */
++ .byte 0x2 /* uleb128 0x2 */
++ .byte 0x88 /* DW_CFA_offset, column 0x8 */
++ .byte 0x1 /* uleb128 0x1 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI6-.LCFI5
++ .byte 0xd /* DW_CFA_def_cfa_register */
++ .byte 0xe /* uleb128 0xe */
++ .align 2
++.LEFDE1:
++
++.LSFDE3:
++ .4byte .LEFDE3-.LASFDE3 /* FDE Length */
++.LASFDE3:
++ .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */
++ .4byte .LFB2 /* FDE initial location */
++ .4byte .LFE2-.LFB2 /* FDE address range */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI7-.LFB2
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x4 /* uleb128 0x4 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI8-.LCFI7
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++ .byte 0x8 /* uleb128 0x8 */
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFI9-.LCFI8
++ .byte 0xe /* DW_CFA_def_cfa_offset */
++#if defined(__SH4__)
++ .byte 8+56 /* uleb128 8+56 */
++#else
++ .byte 8+24 /* uleb128 8+24 */
++#endif
++ .byte 0x91 /* DW_CFA_offset, column 0x11 */
++ .byte 0x2
++ .byte 0x8e /* DW_CFA_offset, column 0xe */
++ .byte 0x1
++ .byte 0x4 /* DW_CFA_advance_loc4 */
++ .4byte .LCFIA-.LCFI9
++ .byte 0xd /* DW_CFA_def_cfa_register */
++ .byte 0xe /* uleb128 0xe */
++ .align 2
++.LEFDE3:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c
+--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c Sat Mar 3 07:21:23 2001
++++ gcc/libffi/src/sparc/ffi.c Sat Jan 4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+- ffi.c - Copyright (c) 1996 Cygnus Solutions
++ ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions
+
+ Sparc Foreign Function Interface
+
+@@ -28,20 +28,22 @@
+
+ #include <stdlib.h>
+
++#ifdef SPARC64
++extern void ffi_closure_v9(void);
++#else
++extern void ffi_closure_v8(void);
++#endif
++
+ /* ffi_prep_args is called by the assembly routine once stack space
+ has been allocated for the function's arguments */
+
+ void ffi_prep_args_v8(char *stack, extended_cif *ecif)
+ {
+ int i;
+- int tmp;
+- int avn;
+ void **p_argv;
+ char *argp;
+ ffi_type **p_arg;
+
+- tmp = 0;
+-
+ /* Skip 16 words for the window save area */
+ argp = stack + 16*sizeof(int);
+
+@@ -66,18 +68,12 @@
+ ((int*)argp)[5] = 0;
+ #endif
+
+- avn = ecif->cif->nargs;
+ p_argv = ecif->avalue;
+
+- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+- i && avn;
+- i--, p_arg++)
++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
+ {
+ size_t z;
+
+- if (avn)
+- {
+- avn--;
+ if ((*p_arg)->type == FFI_TYPE_STRUCT
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ || (*p_arg)->type == FFI_TYPE_LONGDOUBLE
+@@ -122,7 +118,6 @@
+ }
+ p_argv++;
+ argp += z;
+- }
+ }
+
+ return;
+@@ -420,3 +415,101 @@
+ }
+
+ }
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++ ffi_cif* cif,
++ void (*fun)(ffi_cif*, void*, void**, void*),
++ void *user_data)
++{
++ unsigned int *tramp = (unsigned int *) &closure->tramp[0];
++ unsigned long fn;
++ unsigned long ctx = (unsigned long) closure;
++
++#ifdef SPARC64
++ /* Trampoline address is equal to the closure address. We take advantage
++ of that to reduce the trampoline size by 8 bytes. */
++ FFI_ASSERT (cif->abi == FFI_V9);
++ fn = (unsigned long) ffi_closure_v9;
++ tramp[0] = 0x83414000; /* rd %pc, %g1 */
++ tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */
++ tramp[2] = 0x81c14000; /* jmp %g5 */
++ tramp[3] = 0x01000000; /* nop */
++ *((unsigned long *) &tramp[4]) = fn;
++#else
++ FFI_ASSERT (cif->abi == FFI_V8);
++ fn = (unsigned long) ffi_closure_v8;
++ tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */
++ tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */
++ tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */
++ tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */
++#endif
++
++ closure->cif = cif;
++ closure->fun = fun;
++ closure->user_data = user_data;
++
++ /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */
++#ifdef SPARC64
++ asm volatile ("flush %0" : : "r" (closure) : "memory");
++ asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory");
++#else
++ asm volatile ("iflush %0" : : "r" (closure) : "memory");
++ asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory");
++#endif
++
++ return FFI_OK;
++}
++
++int
++ffi_closure_sparc_inner(ffi_closure *closure,
++ void *rvalue, unsigned long *gpr, double *fpr)
++{
++ ffi_cif *cif;
++ void **avalue;
++ ffi_type **arg_types;
++ int i, avn, argn;
++
++ cif = closure->cif;
++ avalue = alloca(cif->nargs * sizeof(void *));
++
++ argn = 0;
++
++ /* Copy the caller's structure return address to that the closure
++ returns the data directly to the caller. */
++ if (cif->flags == FFI_TYPE_STRUCT)
++ {
++ rvalue = (void *) gpr[0];
++ argn = 1;
++ }
++
++ i = 0;
++ avn = cif->nargs;
++ arg_types = cif->arg_types;
++
++ /* Grab the addresses of the arguments from the stack frame. */
++ while (i < avn)
++ {
++ /* Assume big-endian. FIXME */
++ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
++
++#ifdef SPARC64
++ if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT
++ || arg_types[i]->type == FFI_TYPE_DOUBLE
++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
++ || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
++#endif
++ ))
++ avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
++ else
++#endif
++ avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
++ i++;
++ }
++
++ /* Invoke the closure. */
++ (closure->fun) (cif, rvalue, avalue, closure->user_data);
++
++ /* Tell ffi_closure_sparc how to perform return type promotions. */
++ return cif->rtype->type;
++}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S
+--- gcc-3.2.2.orig/libffi/src/sparc/v8.S Mon Apr 29 05:12:04 2002
++++ gcc/libffi/src/sparc/v8.S Sat Jan 4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+- v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
++ v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions
+
+ Sparc Foreign Function Interface
+
+@@ -94,6 +94,72 @@
+ .ffi_call_V8_end:
+ .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
+
++
++#define STACKFRAME 104 /* 16*4 register window +
++ 1*4 struct return +
++ 6*4 args backing store +
++ 3*4 locals */
++
++/* ffi_closure_v8(...)
++
++ Receives the closure argument in %g2. */
++
++ .text
++ .align 8
++ .globl ffi_closure_v8
++
++ffi_closure_v8:
++ .register %g2, #scratch
++.LLFB2:
++ save %sp, -STACKFRAME, %sp
++.LLCFI1:
++
++ ! Store all of the potential argument registers in va_list format.
++ st %i0, [%fp+68+0]
++ st %i1, [%fp+68+4]
++ st %i2, [%fp+68+8]
++ st %i3, [%fp+68+12]
++ st %i4, [%fp+68+16]
++ st %i5, [%fp+68+20]
++
++ ! Call ffi_closure_sparc_inner to do the bulk of the work.
++ mov %g2, %o0
++ add %fp, -8, %o1
++ add %fp, 68, %o2
++ call ffi_closure_sparc_inner
++ mov 0, %o3
++
++ ! Load up the return value in the proper type.
++ cmp %o0, FFI_TYPE_VOID
++ be done1
++
++ cmp %o0, FFI_TYPE_FLOAT
++ be,a done1
++ ld [%fp-8], %f0
++
++ cmp %o0, FFI_TYPE_DOUBLE
++ be,a done1
++ ldd [%fp-8], %f0
++
++ cmp %o0, FFI_TYPE_SINT64
++ be,a integer
++ ld [%fp-4], %i1
++
++ cmp %o0, FFI_TYPE_UINT64
++ be,a integer
++ ld [%fp-4], %i1
++
++integer:
++ ld [%fp-8], %i0
++
++done1:
++ ret
++ restore
++.LLFE2:
++
++.ffi_closure_v8_end:
++ .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
++
+ #ifdef SPARC64
+ #define WS 8
+ #define nword xword
+@@ -148,3 +214,26 @@
+ .byte 0x1f ! uleb128 0x1f
+ .align WS
+ .LLEFDE1:
++.LLSFDE2:
++ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length
++.LLASFDE2:
++ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset
++#ifdef HAVE_AS_SPARC_UA_PCREL
++ .uaword %r_disp32(.LLFB2)
++ .uaword .LLFE2-.LLFB2 ! FDE address range
++#else
++ .align WS
++ .nword .LLFB2
++ .uanword .LLFE2-.LLFB2 ! FDE address range
++#endif
++ .byte 0x0 ! uleb128 0x0; Augmentation size
++ .byte 0x4 ! DW_CFA_advance_loc4
++ .uaword .LLCFI1-.LLFB2
++ .byte 0xd ! DW_CFA_def_cfa_register
++ .byte 0x1e ! uleb128 0x1e
++ .byte 0x2d ! DW_CFA_GNU_window_save
++ .byte 0x9 ! DW_CFA_register
++ .byte 0xf ! uleb128 0xf
++ .byte 0x1f ! uleb128 0x1f
++ .align WS
++.LLEFDE2:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S
+--- gcc-3.2.2.orig/libffi/src/sparc/v9.S Mon Apr 29 05:12:04 2002
++++ gcc/libffi/src/sparc/v9.S Sat Jan 4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+- v9.S - Copyright (c) 2000 Cygnus Solutions
++ v9.S - Copyright (c) 2000, 2003 Cygnus Solutions
+
+ Sparc 64bit Foreign Function Interface
+
+@@ -99,7 +99,7 @@
+ cmp %i3, FFI_TYPE_STRUCT
+ be,pn %icc, dostruct
+
+- cmp %i3, FFI_TYPE_LONGDOUBLE
++ cmp %i3, FFI_TYPE_LONGDOUBLE
+ bne,pt %icc, done
+ nop
+ std %f0, [%i4+0]
+@@ -125,6 +125,88 @@
+ .ffi_call_V9_end:
+ .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
+
++
++#define STACKFRAME 240 /* 16*8 register window +
++ 6*8 args backing store +
++ 8*8 locals */
++#define FP %fp+STACK_BIAS
++
++/* ffi_closure_v9(...)
++
++ Receives the closure argument in %g1. */
++
++ .text
++ .align 8
++ .globl ffi_closure_v9
++
++ffi_closure_v9:
++.LLFB2:
++ save %sp, -STACKFRAME, %sp
++.LLCFI1:
++
++ ! Store all of the potential argument registers in va_list format.
++ stx %i0, [FP+128+0]
++ stx %i1, [FP+128+8]
++ stx %i2, [FP+128+16]
++ stx %i3, [FP+128+24]
++ stx %i4, [FP+128+32]
++ stx %i5, [FP+128+40]
++
++ ! Store possible floating point argument registers too.
++ std %f0, [FP-48]
++ std %f2, [FP-40]
++ std %f4, [FP-32]
++ std %f6, [FP-24]
++ std %f8, [FP-16]
++ std %f10, [FP-8]
++
++ ! Call ffi_closure_sparc_inner to do the bulk of the work.
++ mov %g1, %o0
++ add %fp, STACK_BIAS-64, %o1
++ add %fp, STACK_BIAS+128, %o2
++ call ffi_closure_sparc_inner
++ add %fp, STACK_BIAS-48, %o3
++
++ ! Load up the return value in the proper type.
++ cmp %o0, FFI_TYPE_VOID
++ be,pn %icc, done1
++
++ cmp %o0, FFI_TYPE_FLOAT
++ be,a,pn %icc, done1
++ ld [FP-64], %f0
++
++ cmp %o0, FFI_TYPE_DOUBLE
++ be,a,pn %icc, done1
++ ldd [FP-64], %f0
++
++ cmp %o0, FFI_TYPE_LONGDOUBLE
++ be,a,pn %icc, longdouble1
++ ldd [FP-64], %f0
++
++ cmp %o0, FFI_TYPE_STRUCT
++ be,pn %icc, struct1
++
++ ! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER
++ ldx [FP-64], %i0
++
++done1:
++ ret
++ restore
++
++struct1:
++ ldx [FP-56], %i2
++ ret
++ restore
++
++longdouble1:
++ ldd [FP-56], %f2
++ ret
++ restore
++.LLFE2:
++
++.ffi_closure_v9_end:
++ .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
++
+ .section ".eh_frame",#alloc,#write
+ .LLframe1:
+ .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry
+@@ -169,5 +251,27 @@
+ .byte 0x1f ! uleb128 0x1f
+ .align 8
+ .LLEFDE1:
+-
++.LLSFDE2:
++ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length
++.LLASFDE2:
++ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset
++#ifdef HAVE_AS_SPARC_UA_PCREL
++ .uaword %r_disp32(.LLFB2)
++ .uaword .LLFE2-.LLFB2 ! FDE address range
++#else
++ .align 8
++ .xword .LLFB2
++ .uaxword .LLFE2-.LLFB2 ! FDE address range
++#endif
++ .byte 0x0 ! uleb128 0x0; Augmentation size
++ .byte 0x4 ! DW_CFA_advance_loc4
++ .uaword .LLCFI1-.LLFB2
++ .byte 0xd ! DW_CFA_def_cfa_register
++ .byte 0x1e ! uleb128 0x1e
++ .byte 0x2d ! DW_CFA_GNU_window_save
++ .byte 0x9 ! DW_CFA_register
++ .byte 0xf ! uleb128 0xf
++ .byte 0x1f ! uleb128 0x1f
++ .align 8
++.LLEFDE2:
+ #endif
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c
+--- gcc-3.2.2.orig/libffi/src/types.c Tue Mar 27 11:39:16 2001
++++ gcc/libffi/src/types.c Wed Nov 27 07:24:05 2002
+@@ -42,7 +42,8 @@
+ FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
+ FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
+
+-#if defined ALPHA || defined SPARC64
++#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \
++ || defined IA64
+
+ FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
+
+@@ -52,22 +53,12 @@
+
+ #endif
+
+-#ifdef X86
++#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K
+
+ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+
+-#elif defined X86_WIN32
+-
+-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+-
+-#elif defined ARM
+-
+-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+-
+-#elif defined M68K
++#elif defined SH
+
+ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+@@ -80,12 +71,7 @@
+ #endif
+
+
+-#ifdef X86
+-
+-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
+-
+-#elif defined X86_WIN32
++#if defined X86 || defined X86_WIN32 || defined M68K
+
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
+@@ -95,25 +81,25 @@
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
+
+-#elif defined M68K
++#elif defined SH
+
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
+
+ #elif defined SPARC
+
+ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
+-
+ #ifdef SPARC64
+-
+ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
+-
+ #else
+-
+ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
+-
+ #endif
+
++#elif defined X86_64
++
++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
++
+ #else
+
+ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c
+--- gcc-3.2.2.orig/libffi/src/x86/ffi.c Tue May 28 18:22:08 2002
++++ gcc/libffi/src/x86/ffi.c Fri Dec 6 10:16:45 2002
+@@ -1,5 +1,8 @@
+ /* -----------------------------------------------------------------------
+- ffi.c - Copyright (c) 1996, 1998, 1999 Cygnus Solutions
++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc.
++ Copyright (c) 2002 Ranjit Mathew
++ Copyright (c) 2002 Bo Thorsen
++ Copyright (c) 2002 Roger Sayle
+
+ x86 Foreign Function Interface
+
+@@ -23,6 +26,8 @@
+ OTHER DEALINGS IN THE SOFTWARE.
+ ----------------------------------------------------------------------- */
+
++#ifndef __x86_64__
++
+ #include <ffi.h>
+ #include <ffi_common.h>
+
+@@ -36,12 +41,10 @@
+ /*@=exportheader@*/
+ {
+ register unsigned int i;
+- register int tmp;
+ register void **p_argv;
+ register char *argp;
+ register ffi_type **p_arg;
+
+- tmp = 0;
+ argp = stack;
+
+ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
+@@ -148,6 +151,18 @@
+ /*@=declundef@*/
+ /*@=exportheader@*/
+
++#ifdef X86_WIN32
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *),
++ /*@out@*/ extended_cif *,
++ unsigned, unsigned,
++ /*@out@*/ unsigned *,
++ void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++#endif /* X86_WIN32 */
++
+ void ffi_call(/*@dependent@*/ ffi_cif *cif,
+ void (*fn)(),
+ /*@out@*/ void *rvalue,
+@@ -180,6 +195,14 @@
+ cif->flags, ecif.rvalue, fn);
+ /*@=usedef@*/
+ break;
++#ifdef X86_WIN32
++ case FFI_STDCALL:
++ /*@-usedef@*/
++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
++ cif->flags, ecif.rvalue, fn);
++ /*@=usedef@*/
++ break;
++#endif /* X86_WIN32 */
+ default:
+ FFI_ASSERT(0);
+ break;
+@@ -266,12 +289,10 @@
+ /*@=exportheader@*/
+ {
+ register unsigned int i;
+- register int tmp;
+ register void **p_argv;
+ register char *argp;
+ register ffi_type **p_arg;
+
+- tmp = 0;
+ argp = stack;
+
+ if ( cif->rtype->type == FFI_TYPE_STRUCT ) {
+@@ -281,13 +302,14 @@
+
+ p_argv = avalue;
+
+- for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+ {
+ size_t z;
+
+ /* Align if necessary */
+- if (((*p_arg)->alignment - 1) & (unsigned) argp)
++ if (((*p_arg)->alignment - 1) & (unsigned) argp) {
+ argp = (char *) ALIGN(argp, (*p_arg)->alignment);
++ }
+
+ z = (*p_arg)->size;
+
+@@ -298,7 +320,7 @@
+ p_argv++;
+ argp += z;
+ }
+-
++
+ return;
+ }
+
+@@ -449,6 +471,15 @@
+ /*@out@*/ unsigned *,
+ void (*fn)());
+
++#ifdef X86_WIN32
++extern void
++ffi_call_STDCALL(void (*)(char *, extended_cif *),
++ /*@out@*/ extended_cif *,
++ unsigned, unsigned,
++ /*@out@*/ unsigned *,
++ void (*fn)());
++#endif /* X86_WIN32 */
++
+ void
+ ffi_raw_call(/*@dependent@*/ ffi_cif *cif,
+ void (*fn)(),
+@@ -483,6 +514,14 @@
+ cif->flags, ecif.rvalue, fn);
+ /*@=usedef@*/
+ break;
++#ifdef X86_WIN32
++ case FFI_STDCALL:
++ /*@-usedef@*/
++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes,
++ cif->flags, ecif.rvalue, fn);
++ /*@=usedef@*/
++ break;
++#endif /* X86_WIN32 */
+ default:
+ FFI_ASSERT(0);
+ break;
+@@ -490,3 +529,5 @@
+ }
+
+ #endif
++
++#endif /* __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c
+--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/x86/ffi64.c Wed Jan 29 00:54:28 2003
+@@ -0,0 +1,706 @@
++/* -----------------------------------------------------------------------
++ ffi.c - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
++
++ x86-64 Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++#include <stdarg.h>
++
++/* ffi_prep_args is called by the assembly routine once stack space
++ has been allocated for the function's arguments */
++
++#ifdef __x86_64__
++
++#define MAX_GPR_REGS 6
++#define MAX_SSE_REGS 8
++typedef struct
++{
++ /* Registers for argument passing. */
++ long gpr[MAX_GPR_REGS];
++ __int128_t sse[MAX_SSE_REGS];
++
++ /* Stack space for arguments. */
++ char argspace[0];
++} stackLayout;
++
++/* All reference to register classes here is identical to the code in
++ gcc/config/i386/i386.c. Do *not* change one without the other. */
++
++/* Register class used for passing given 64bit part of the argument.
++ These represent classes as documented by the PS ABI, with the exception
++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will
++ use SF or DFmode move instead of DImode to avoid reformating penalties.
++
++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
++ whenever possible (upper half does contain padding).
++ */
++enum x86_64_reg_class
++ {
++ X86_64_NO_CLASS,
++ X86_64_INTEGER_CLASS,
++ X86_64_INTEGERSI_CLASS,
++ X86_64_SSE_CLASS,
++ X86_64_SSESF_CLASS,
++ X86_64_SSEDF_CLASS,
++ X86_64_SSEUP_CLASS,
++ X86_64_X87_CLASS,
++ X86_64_X87UP_CLASS,
++ X86_64_MEMORY_CLASS
++ };
++
++#define MAX_CLASSES 4
++
++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal
++ of this code is to classify each 8bytes of incoming argument by the register
++ class and assign registers accordingly. */
++
++/* Return the union class of CLASS1 and CLASS2.
++ See the x86-64 PS ABI for details. */
++
++static enum x86_64_reg_class
++merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
++{
++ /* Rule #1: If both classes are equal, this is the resulting class. */
++ if (class1 == class2)
++ return class1;
++
++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
++ the other class. */
++ if (class1 == X86_64_NO_CLASS)
++ return class2;
++ if (class2 == X86_64_NO_CLASS)
++ return class1;
++
++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */
++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
++ return X86_64_MEMORY_CLASS;
++
++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */
++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
++ return X86_64_INTEGERSI_CLASS;
++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
++ return X86_64_INTEGER_CLASS;
++
++ /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used. */
++ if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
++ || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
++ return X86_64_MEMORY_CLASS;
++
++ /* Rule #6: Otherwise class SSE is used. */
++ return X86_64_SSE_CLASS;
++}
++
++/* Classify the argument of type TYPE and mode MODE.
++ CLASSES will be filled by the register class used to pass each word
++ of the operand. The number of words is returned. In case the parameter
++ should be passed in memory, 0 is returned. As a special case for zero
++ sized containers, classes[0] will be NO_CLASS and 1 is returned.
++
++ See the x86-64 PS ABI for details.
++*/
++static int
++classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
++ int *byte_offset)
++{
++ /* First, align to the right place. */
++ *byte_offset = ALIGN(*byte_offset, type->alignment);
++
++ switch (type->type)
++ {
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_SINT64:
++ case FFI_TYPE_POINTER:
++ if (((*byte_offset) % 8 + type->size) <= 4)
++ classes[0] = X86_64_INTEGERSI_CLASS;
++ else
++ classes[0] = X86_64_INTEGER_CLASS;
++ return 1;
++ case FFI_TYPE_FLOAT:
++ if (((*byte_offset) % 8) == 0)
++ classes[0] = X86_64_SSESF_CLASS;
++ else
++ classes[0] = X86_64_SSE_CLASS;
++ return 1;
++ case FFI_TYPE_DOUBLE:
++ classes[0] = X86_64_SSEDF_CLASS;
++ return 1;
++ case FFI_TYPE_LONGDOUBLE:
++ classes[0] = X86_64_X87_CLASS;
++ classes[1] = X86_64_X87UP_CLASS;
++ return 2;
++ case FFI_TYPE_STRUCT:
++ {
++ const int UNITS_PER_WORD = 8;
++ int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
++ ffi_type **ptr;
++ int i;
++ enum x86_64_reg_class subclasses[MAX_CLASSES];
++
++ /* If the struct is larger than 16 bytes, pass it on the stack. */
++ if (type->size > 16)
++ return 0;
++
++ for (i = 0; i < words; i++)
++ classes[i] = X86_64_NO_CLASS;
++
++ /* Merge the fields of structure. */
++ for (ptr=type->elements; (*ptr)!=NULL; ptr++)
++ {
++ int num;
++
++ num = classify_argument (*ptr, subclasses, byte_offset);
++ if (num == 0)
++ return 0;
++ for (i = 0; i < num; i++)
++ {
++ int pos = *byte_offset / 8;
++ classes[i + pos] =
++ merge_classes (subclasses[i], classes[i + pos]);
++ }
++
++ if ((*ptr)->type != FFI_TYPE_STRUCT)
++ *byte_offset += (*ptr)->size;
++ }
++
++ /* Final merger cleanup. */
++ for (i = 0; i < words; i++)
++ {
++ /* If one class is MEMORY, everything should be passed in
++ memory. */
++ if (classes[i] == X86_64_MEMORY_CLASS)
++ return 0;
++
++ /* The X86_64_SSEUP_CLASS should be always preceded by
++ X86_64_SSE_CLASS. */
++ if (classes[i] == X86_64_SSEUP_CLASS
++ && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
++ classes[i] = X86_64_SSE_CLASS;
++
++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */
++ if (classes[i] == X86_64_X87UP_CLASS
++ && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
++ classes[i] = X86_64_SSE_CLASS;
++ }
++ return words;
++ }
++
++ default:
++ FFI_ASSERT(0);
++ }
++ return 0; /* Never reached. */
++}
++
++/* Examine the argument and return set number of register required in each
++ class. Return 0 iff parameter should be passed in memory. */
++static int
++examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs)
++{
++ enum x86_64_reg_class class[MAX_CLASSES];
++ int offset = 0;
++ int n;
++
++ n = classify_argument (type, class, &offset);
++
++ if (n == 0)
++ return 0;
++
++ *int_nregs = 0;
++ *sse_nregs = 0;
++ for (n--; n>=0; n--)
++ switch (class[n])
++ {
++ case X86_64_INTEGER_CLASS:
++ case X86_64_INTEGERSI_CLASS:
++ (*int_nregs)++;
++ break;
++ case X86_64_SSE_CLASS:
++ case X86_64_SSESF_CLASS:
++ case X86_64_SSEDF_CLASS:
++ (*sse_nregs)++;
++ break;
++ case X86_64_NO_CLASS:
++ case X86_64_SSEUP_CLASS:
++ break;
++ case X86_64_X87_CLASS:
++ case X86_64_X87UP_CLASS:
++ if (!in_return)
++ return 0;
++ break;
++ default:
++ abort ();
++ }
++ return 1;
++}
++
++/* Functions to load floats and double to an SSE register placeholder. */
++extern void float2sse (float, __int128_t *);
++extern void double2sse (double, __int128_t *);
++extern void floatfloat2sse (void *, __int128_t *);
++
++/* Functions to put the floats and doubles back. */
++extern float sse2float (__int128_t *);
++extern double sse2double (__int128_t *);
++extern void sse2floatfloat(__int128_t *, void *);
++
++/*@-exportheader@*/
++void
++ffi_prep_args (stackLayout *stack, extended_cif *ecif)
++/*@=exportheader@*/
++{
++ int gprcount, ssecount, i, g, s;
++ void **p_argv;
++ void *argp = &stack->argspace;
++ ffi_type **p_arg;
++
++ /* First check if the return value should be passed in memory. If so,
++ pass the pointer as the first argument. */
++ gprcount = ssecount = 0;
++ if (ecif->cif->rtype->type != FFI_TYPE_VOID
++ && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0)
++ (void *)stack->gpr[gprcount++] = ecif->rvalue;
++
++ for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue;
++ i!=0; i--, p_arg++, p_argv++)
++ {
++ int in_register = 0;
++
++ switch ((*p_arg)->type)
++ {
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_SINT64:
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_POINTER:
++ if (gprcount < MAX_GPR_REGS)
++ {
++ stack->gpr[gprcount] = 0;
++ stack->gpr[gprcount++] = *(long long *)(*p_argv);
++ in_register = 1;
++ }
++ break;
++
++ case FFI_TYPE_FLOAT:
++ if (ssecount < MAX_SSE_REGS)
++ {
++ float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]);
++ in_register = 1;
++ }
++ break;
++
++ case FFI_TYPE_DOUBLE:
++ if (ssecount < MAX_SSE_REGS)
++ {
++ double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]);
++ in_register = 1;
++ }
++ break;
++ }
++
++ if (in_register)
++ continue;
++
++ /* Either all places in registers where filled, or this is a
++ type that potentially goes into a memory slot. */
++ if (examine_argument (*p_arg, 0, &g, &s) == 0
++ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
++ {
++ /* Pass this argument in memory. */
++ argp = (void *)ALIGN(argp, (*p_arg)->alignment);
++ memcpy (argp, *p_argv, (*p_arg)->size);
++ argp += (*p_arg)->size;
++ }
++ else
++ {
++ /* All easy cases are eliminated. Now fire the big guns. */
++
++ enum x86_64_reg_class classes[MAX_CLASSES];
++ int offset = 0, j, num;
++ void *a;
++
++ num = classify_argument (*p_arg, classes, &offset);
++ for (j=0, a=*p_argv; j<num; j++, a+=8)
++ {
++ switch (classes[j])
++ {
++ case X86_64_INTEGER_CLASS:
++ case X86_64_INTEGERSI_CLASS:
++ stack->gpr[gprcount++] = *(long long *)a;
++ break;
++ case X86_64_SSE_CLASS:
++ floatfloat2sse (a, &stack->sse[ssecount++]);
++ break;
++ case X86_64_SSESF_CLASS:
++ float2sse (*(float *)a, &stack->sse[ssecount++]);
++ break;
++ case X86_64_SSEDF_CLASS:
++ double2sse (*(double *)a, &stack->sse[ssecount++]);
++ break;
++ default:
++ abort();
++ }
++ }
++ }
++ }
++}
++
++/* Perform machine dependent cif processing. */
++ffi_status
++ffi_prep_cif_machdep (ffi_cif *cif)
++{
++ int gprcount, ssecount, i, g, s;
++
++ gprcount = ssecount = 0;
++
++ /* Reset the byte count. We handle this size estimation here. */
++ cif->bytes = 0;
++
++ /* If the return value should be passed in memory, pass the pointer
++ as the first argument. The actual memory isn't allocated here. */
++ if (cif->rtype->type != FFI_TYPE_VOID
++ && examine_argument (cif->rtype, 1, &g, &s) == 0)
++ gprcount = 1;
++
++ /* Go over all arguments and determine the way they should be passed.
++ If it's in a register and there is space for it, let that be so. If
++ not, add it's size to the stack byte count. */
++ for (i=0; i<cif->nargs; i++)
++ {
++ if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0
++ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
++ {
++ /* This is passed in memory. First align to the basic type. */
++ cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment);
++
++ /* Stack arguments are *always* at least 8 byte aligned. */
++ cif->bytes = ALIGN(cif->bytes, 8);
++
++ /* Now add the size of this argument. */
++ cif->bytes += cif->arg_types[i]->size;
++ }
++ else
++ {
++ gprcount += g;
++ ssecount += s;
++ }
++ }
++
++ /* Set the flag for the closures return. */
++ switch (cif->rtype->type)
++ {
++ case FFI_TYPE_VOID:
++ case FFI_TYPE_STRUCT:
++ case FFI_TYPE_SINT64:
++ case FFI_TYPE_FLOAT:
++ case FFI_TYPE_DOUBLE:
++ case FFI_TYPE_LONGDOUBLE:
++ cif->flags = (unsigned) cif->rtype->type;
++ break;
++
++ case FFI_TYPE_UINT64:
++ cif->flags = FFI_TYPE_SINT64;
++ break;
++
++ default:
++ cif->flags = FFI_TYPE_INT;
++ break;
++ }
++
++ return FFI_OK;
++}
++
++typedef struct
++{
++ long gpr[2];
++ __int128_t sse[2];
++ long double st0;
++} return_value;
++
++void
++ffi_fill_return_value (return_value *rv, extended_cif *ecif)
++{
++ enum x86_64_reg_class classes[MAX_CLASSES];
++ int i = 0, num;
++ long *gpr = rv->gpr;
++ __int128_t *sse = rv->sse;
++ signed char sc;
++ signed short ss;
++
++ /* This is needed because of the way x86-64 handles signed short
++ integers. */
++ switch (ecif->cif->rtype->type)
++ {
++ case FFI_TYPE_SINT8:
++ sc = *(signed char *)gpr;
++ *(long long *)ecif->rvalue = (long long)sc;
++ return;
++ case FFI_TYPE_SINT16:
++ ss = *(signed short *)gpr;
++ *(long long *)ecif->rvalue = (long long)ss;
++ return;
++ default:
++ /* Just continue. */
++ ;
++ }
++
++ num = classify_argument (ecif->cif->rtype, classes, &i);
++
++ if (num == 0)
++ /* Return in memory. */
++ ecif->rvalue = (void *) rv->gpr[0];
++ else if (num == 2 && classes[0] == X86_64_X87_CLASS &&
++ classes[1] == X86_64_X87UP_CLASS)
++ /* This is a long double (this is easiest to handle this way instead
++ of an eightbyte at a time as in the loop below. */
++ *((long double *)ecif->rvalue) = rv->st0;
++ else
++ {
++ void *a;
++
++ for (i=0, a=ecif->rvalue; i<num; i++, a+=8)
++ {
++ switch (classes[i])
++ {
++ case X86_64_INTEGER_CLASS:
++ case X86_64_INTEGERSI_CLASS:
++ *(long long *)a = *gpr;
++ gpr++;
++ break;
++ case X86_64_SSE_CLASS:
++ sse2floatfloat (sse++, a);
++ break;
++ case X86_64_SSESF_CLASS:
++ *(float *)a = sse2float (sse++);
++ break;
++ case X86_64_SSEDF_CLASS:
++ *(double *)a = sse2double (sse++);
++ break;
++ default:
++ abort();
++ }
++ }
++ }
++}
++
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *),
++ void (*) (return_value *, extended_cif *),
++ /*@out@*/ extended_cif *,
++ unsigned, /*@out@*/ unsigned *, void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++
++void ffi_call(/*@dependent@*/ ffi_cif *cif,
++ void (*fn)(),
++ /*@out@*/ void *rvalue,
++ /*@dependent@*/ void **avalue)
++{
++ extended_cif ecif;
++ int dummy;
++
++ ecif.cif = cif;
++ ecif.avalue = avalue;
++
++ /* If the return value is a struct and we don't have a return */
++ /* value address then we need to make one */
++
++ if ((rvalue == NULL) &&
++ (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0))
++ {
++ /*@-sysunrecog@*/
++ ecif.rvalue = alloca(cif->rtype->size);
++ /*@=sysunrecog@*/
++ }
++ else
++ ecif.rvalue = rvalue;
++
++ /* Stack must always be 16byte aligned. Make it so. */
++ cif->bytes = ALIGN(cif->bytes, 16);
++
++ switch (cif->abi)
++ {
++ case FFI_SYSV:
++ /* Calling 32bit code from 64bit is not possible */
++ FFI_ASSERT(0);
++ break;
++
++ case FFI_UNIX64:
++ /*@-usedef@*/
++ ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif,
++ cif->bytes, ecif.rvalue, fn);
++ /*@=usedef@*/
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ break;
++ }
++}
++
++extern void ffi_closure_UNIX64(void);
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++ ffi_cif* cif,
++ void (*fun)(ffi_cif*, void*, void**, void*),
++ void *user_data)
++{
++ volatile unsigned short *tramp;
++
++ /* FFI_ASSERT (cif->abi == FFI_OSF); */
++
++ tramp = (volatile unsigned short *) &closure->tramp[0];
++ tramp[0] = 0xbb49; /* mov <code>, %r11 */
++ tramp[5] = 0xba49; /* mov <data>, %r10 */
++ tramp[10] = 0xff49; /* jmp *%r11 */
++ tramp[11] = 0x00e3;
++ *(void * volatile *) &tramp[1] = ffi_closure_UNIX64;
++ *(void * volatile *) &tramp[6] = closure;
++
++ closure->cif = cif;
++ closure->fun = fun;
++ closure->user_data = user_data;
++
++ return FFI_OK;
++}
++
++int
++ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp)
++{
++ ffi_cif *cif;
++ void **avalue;
++ ffi_type **arg_types;
++ long i, avn, argn;
++
++ cif = closure->cif;
++ avalue = alloca(cif->nargs * sizeof(void *));
++
++ argn = 0;
++
++ i = 0;
++ avn = cif->nargs;
++ arg_types = cif->arg_types;
++
++ /* Grab the addresses of the arguments from the stack frame. */
++ while (i < avn)
++ {
++ switch (arg_types[i]->type)
++ {
++ case FFI_TYPE_SINT8:
++ case FFI_TYPE_UINT8:
++ case FFI_TYPE_SINT16:
++ case FFI_TYPE_UINT16:
++ case FFI_TYPE_SINT32:
++ case FFI_TYPE_UINT32:
++ case FFI_TYPE_SINT64:
++ case FFI_TYPE_UINT64:
++ case FFI_TYPE_POINTER:
++ {
++ if (l->gp_offset > 48-8)
++ {
++ avalue[i] = l->overflow_arg_area;
++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++ }
++ else
++ {
++ avalue[i] = (char *)l->reg_save_area + l->gp_offset;
++ l->gp_offset += 8;
++ }
++ }
++ break;
++
++ case FFI_TYPE_STRUCT:
++ /* FIXME */
++ FFI_ASSERT(0);
++ break;
++
++ case FFI_TYPE_DOUBLE:
++ {
++ if (l->fp_offset > 176-16)
++ {
++ avalue[i] = l->overflow_arg_area;
++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++ }
++ else
++ {
++ avalue[i] = (char *)l->reg_save_area + l->fp_offset;
++ l->fp_offset += 16;
++ }
++ }
++#if DEBUG_FFI
++ fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]);
++#endif
++ break;
++
++ case FFI_TYPE_FLOAT:
++ {
++ if (l->fp_offset > 176-16)
++ {
++ avalue[i] = l->overflow_arg_area;
++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++ }
++ else
++ {
++ avalue[i] = (char *)l->reg_save_area + l->fp_offset;
++ l->fp_offset += 16;
++ }
++ }
++#if DEBUG_FFI
++ fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]);
++#endif
++ break;
++
++ default:
++ FFI_ASSERT(0);
++ }
++
++ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
++ i++;
++ }
++
++ /* Invoke the closure. */
++ (closure->fun) (cif, rp, avalue, closure->user_data);
++
++ /* FIXME: Structs not supported. */
++ FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT);
++
++ /* Tell ffi_closure_UNIX64 how to perform return type promotions. */
++
++ return cif->rtype->type;
++}
++#endif /* ifndef __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S
+--- gcc-3.2.2.orig/libffi/src/x86/sysv.S Tue Jul 17 02:10:53 2001
++++ gcc/libffi/src/x86/sysv.S Fri Jul 19 08:08:31 2002
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+- sysv.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions
++ sysv.S - Copyright (c) 1996, 1998, 2001, 2002 Cygnus Solutions
+
+ X86 Foreign Function Interface
+
+@@ -23,6 +23,8 @@
+ OTHER DEALINGS IN THE SOFTWARE.
+ ----------------------------------------------------------------------- */
+
++#ifndef __x86_64__
++
+ #define LIBFFI_ASM
+ #include <ffi.h>
+
+@@ -163,3 +165,5 @@
+ .align 4
+ .LEFDE1:
+ .set .LLFDE1,.LEFDE1-.LSFDE1
++
++#endif /* ifndef __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S
+--- gcc-3.2.2.orig/libffi/src/x86/unix64.S Thu Jan 1 09:00:00 1970
++++ gcc/libffi/src/x86/unix64.S Wed Jan 29 00:54:28 2003
+@@ -0,0 +1,302 @@
++/* -----------------------------------------------------------------------
++ unix64.S - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
++
++ x86-64 Foreign Function Interface
++
++ Permission is hereby granted, free of charge, to any person obtaining
++ a copy of this software and associated documentation files (the
++ ``Software''), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Software, and to
++ permit persons to whom the Software is furnished to do so, subject to
++ the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++ ----------------------------------------------------------------------- */
++
++#ifdef __x86_64__
++#define LIBFFI_ASM
++#include <ffi.h>
++
++ .section .rodata
++.LC0:
++ .string "asm in progress %lld\n"
++.LC1:
++ .string "asm in progress\n"
++.text
++ .align 2
++.globl ffi_call_UNIX64
++ .type ffi_call_UNIX64,@function
++
++ffi_call_UNIX64:
++.LFB1:
++ pushq %rbp
++.LCFI0:
++ movq %rsp, %rbp
++.LCFI1:
++ /* Save all arguments */
++ subq $48, %rsp
++.LCFI2:
++ movq %rdi, -8(%rbp) /* ffi_prep_args */
++ movq %rsi, -16(%rbp) /* ffi_fill_return_value */
++ movq %rdx, -24(%rbp) /* ecif */
++ movq %rcx, -32(%rbp) /* cif->bytes */
++ movq %r8, -40(%rbp) /* ecif.rvalue */
++ movq %r9, -48(%rbp) /* fn */
++
++ /* Make room for all of the new args and the register args */
++ addl $176, %ecx
++.LCFI3:
++ subq %rcx, %rsp
++.LCFI4:
++ /* Setup the call to ffi_prep_args. */
++ movq %rdi, %rax /* &ffi_prep_args */
++ movq %rsp, %rdi /* stackLayout */
++ movq %rdx, %rsi /* ecif */
++ call *%rax /* ffi_prep_args(stackLayout, ecif);*/
++
++ /* ffi_prep_args have put all the register contents into the */
++ /* stackLayout struct. Now put the register values in place. */
++ movq (%rsp), %rdi
++ movq 8(%rsp), %rsi
++ movq 16(%rsp), %rdx
++ movq 24(%rsp), %rcx
++ movq 32(%rsp), %r8
++ movq 40(%rsp), %r9
++ movaps 48(%rsp), %xmm0
++ movaps 64(%rsp), %xmm1
++ movaps 80(%rsp), %xmm2
++ movaps 96(%rsp), %xmm3
++ movaps 112(%rsp), %xmm4
++ movaps 128(%rsp), %xmm5
++ movaps 144(%rsp), %xmm6
++ movaps 160(%rsp), %xmm7
++
++ /* Remove space for stackLayout so stack arguments are placed
++ correctly for the call. */
++.LCFI5:
++ addq $176, %rsp
++.LCFI6:
++ /* Call the user function. */
++ call *-48(%rbp)
++
++ /* Make stack space for the return_value struct. */
++ subq $64, %rsp
++
++ /* Fill in all potential return values to this struct. */
++ movq %rax, (%rsp)
++ movq %rdx, 8(%rsp)
++ movaps %xmm0, 16(%rsp)
++ movaps %xmm1, 32(%rsp)
++ fstpt 48(%rsp)
++
++ /* Now call ffi_fill_return_value. */
++ movq %rsp, %rdi /* struct return_value */
++ movq -24(%rbp), %rsi /* ecif */
++ movq -16(%rbp), %rax /* &ffi_fill_return_value */
++ call *%rax /* call it */
++
++ /* And the work is done. */
++ leave
++ ret
++.LFE1:
++.ffi_call_UNIX64_end:
++ .size ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64
++
++.text
++ .align 2
++.globl float2sse
++ .type float2sse,@function
++float2sse:
++ /* Save the contents of this sse-float in a pointer. */
++ movaps %xmm0, (%rdi)
++ ret
++
++ .align 2
++.globl floatfloat2sse
++ .type floatfloat2sse,@function
++floatfloat2sse:
++ /* Save the contents of these two sse-floats in a pointer. */
++ movq (%rdi), %xmm0
++ movaps %xmm0, (%rsi)
++ ret
++
++ .align 2
++.globl double2sse
++ .type double2sse,@function
++double2sse:
++ /* Save the contents of this sse-double in a pointer. */
++ movaps %xmm0, (%rdi)
++ ret
++
++ .align 2
++.globl sse2float
++ .type sse2float,@function
++sse2float:
++ /* Save the contents of this sse-float in a pointer. */
++ movaps (%rdi), %xmm0
++ ret
++
++ .align 2
++.globl sse2double
++ .type sse2double,@function
++sse2double:
++ /* Save the contents of this pointer in a sse-double. */
++ movaps (%rdi), %xmm0
++ ret
++
++ .align 2
++.globl sse2floatfloat
++ .type sse2floatfloat,@function
++sse2floatfloat:
++ /* Save the contents of this pointer in two sse-floats. */
++ movaps (%rdi), %xmm0
++ movq %xmm0, (%rsi)
++ ret
++
++ .align 2
++.globl ffi_closure_UNIX64
++ .type ffi_closure_UNIX64,@function
++
++ffi_closure_UNIX64:
++.LFB2:
++ pushq %rbp
++.LCFI10:
++ movq %rsp, %rbp
++.LCFI11:
++ subq $240, %rsp
++.LCFI12:
++ movq %rdi, -176(%rbp)
++ movq %rsi, -168(%rbp)
++ movq %rdx, -160(%rbp)
++ movq %rcx, -152(%rbp)
++ movq %r8, -144(%rbp)
++ movq %r9, -136(%rbp)
++ /* FIXME: We can avoid all this stashing of XMM registers by
++ (in ffi_prep_closure) computing the number of
++ floating-point args and moving it into %rax before calling
++ this function. Once this is done, uncomment the next few
++ lines and only the essential XMM registers will be written
++ to memory. This is a significant saving. */
++/* movzbl %al, %eax */
++/* movq %rax, %rdx */
++/* leaq 0(,%rdx,4), %rax */
++/* leaq 2f(%rip), %rdx */
++/* subq %rax, %rdx */
++ leaq -1(%rbp), %rax
++/* jmp *%rdx */
++ movaps %xmm7, -15(%rax)
++ movaps %xmm6, -31(%rax)
++ movaps %xmm5, -47(%rax)
++ movaps %xmm4, -63(%rax)
++ movaps %xmm3, -79(%rax)
++ movaps %xmm2, -95(%rax)
++ movaps %xmm1, -111(%rax)
++ movaps %xmm0, -127(%rax)
++2:
++ movl %edi, -180(%rbp)
++ movl $0, -224(%rbp)
++ movl $48, -220(%rbp)
++ leaq 16(%rbp), %rax
++ movq %rax, -216(%rbp)
++ leaq -176(%rbp), %rdx
++ movq %rdx, -208(%rbp)
++ leaq -224(%rbp), %rsi
++ movq %r10, %rdi
++ movq %rsp, %rdx
++ call ffi_closure_UNIX64_inner@PLT
++
++ cmpl $FFI_TYPE_FLOAT, %eax
++ je 1f
++ cmpl $FFI_TYPE_DOUBLE, %eax
++ je 2f
++ cmpl $FFI_TYPE_LONGDOUBLE, %eax
++ je 3f
++ cmpl $FFI_TYPE_STRUCT, %eax
++ je 4f
++ popq %rax
++ leave
++ ret
++1:
++2:
++3:
++ movaps -240(%rbp), %xmm0
++ leave
++ ret
++4:
++ leave
++ ret
++.LFE2:
++
++ .section .eh_frame,"a",@progbits
++.Lframe0:
++ .long .LECIE1-.LSCIE1
++.LSCIE1:
++ .long 0x0
++ .byte 0x1
++ .string "zR"
++ .uleb128 0x1
++ .sleb128 -8
++ .byte 0x10
++ .uleb128 0x1
++ .byte 0x1b
++ .byte 0xc
++ .uleb128 0x7
++ .uleb128 0x8
++ .byte 0x90
++ .uleb128 0x1
++ .align 8
++.LECIE1:
++.LSFDE1:
++ .long .LEFDE1-.LASFDE1
++.LASFDE1:
++ .long .LASFDE1-.Lframe0
++
++ .long .LFB1-.
++ .long .LFE1-.LFB1
++ .uleb128 0x0
++ .byte 0x4 # DW_CFA_advance_loc4
++ .long .LCFI0-.LFB1
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0x10
++ .byte 0x86 # DW_CFA_offset: r6 at cfa-16
++ .uleb128 0x2
++ .byte 0x4 # DW_CFA_advance_loc4
++ .long .LCFI1-.LCFI0
++ .byte 0x86 # DW_CFA_offset: r6 at cfa-16
++ .uleb128 0x2
++ .byte 0xd # DW_CFA_def_cfa_reg: r6
++ .uleb128 0x6
++ .align 8
++.LEFDE1:
++.LSFDE3:
++ .long .LEFDE3-.LASFDE3 # FDE Length
++.LASFDE3:
++ .long .LASFDE3-.Lframe0 # FDE CIE offset
++
++ .long .LFB2-. # FDE initial location
++ .long .LFE2-.LFB2 # FDE address range
++ .uleb128 0x0 # Augmentation size
++ .byte 0x4 # DW_CFA_advance_loc4
++ .long .LCFI10-.LFB2
++ .byte 0xe # DW_CFA_def_cfa_offset
++ .uleb128 0x10
++ .byte 0x86 # DW_CFA_offset, column 0x6
++ .uleb128 0x2
++ .byte 0x4 # DW_CFA_advance_loc4
++ .long .LCFI11-.LCFI10
++ .byte 0xd # DW_CFA_def_cfa_register
++ .uleb128 0x6
++ .align 8
++.LEFDE3:
++
++#endif /* __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S
+--- gcc-3.2.2.orig/libffi/src/x86/win32.S Tue Mar 27 11:39:16 2001
++++ gcc/libffi/src/x86/win32.S Fri Dec 6 10:16:45 2002
+@@ -1,5 +1,8 @@
+ /* -----------------------------------------------------------------------
+- win32.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions
++ win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc.
++ Copyright (c) 2001 John Beniton
++ Copyright (c) 2002 Ranjit Mathew
++
+
+ X86 Foreign Function Interface
+
+@@ -52,7 +55,10 @@
+ # Return stack to previous state and call the function
+ addl $8,%esp
+
+- call *28(%ebp)
++ # FIXME: Align the stack to a 128-bit boundary to avoid
++ # potential performance hits.
++
++ call *28(%ebp)
+
+ # Remove the space we pushed for the args
+ movl 16(%ebp),%ecx
+@@ -123,3 +129,98 @@
+ ret
+
+ .ffi_call_SYSV_end:
++
++ # This assumes we are using gas.
++ .balign 16
++.globl _ffi_call_STDCALL
++
++_ffi_call_STDCALL:
++ pushl %ebp
++ movl %esp,%ebp
++
++ # Make room for all of the new args.
++ movl 16(%ebp),%ecx
++ subl %ecx,%esp
++
++ movl %esp,%eax
++
++ # Place all of the ffi_prep_args in position
++ pushl 12(%ebp)
++ pushl %eax
++ call *8(%ebp)
++
++ # Return stack to previous state and call the function
++ addl $8,%esp
++
++ # FIXME: Align the stack to a 128-bit boundary to avoid
++ # potential performance hits.
++
++ call *28(%ebp)
++
++ # stdcall functions pop arguments off the stack themselves
++
++ # Load %ecx with the return type code
++ movl 20(%ebp),%ecx
++
++ # If the return value pointer is NULL, assume no return value.
++ cmpl $0,24(%ebp)
++ jne sc_retint
++
++ # Even if there is no space for the return value, we are
++ # obliged to handle floating-point values.
++ cmpl $FFI_TYPE_FLOAT,%ecx
++ jne sc_noretval
++ fstp %st(0)
++
++ jmp sc_epilogue
++
++sc_retint:
++ cmpl $FFI_TYPE_INT,%ecx
++ jne sc_retfloat
++ # Load %ecx with the pointer to storage for the return value
++ movl 24(%ebp),%ecx
++ movl %eax,0(%ecx)
++ jmp sc_epilogue
++
++sc_retfloat:
++ cmpl $FFI_TYPE_FLOAT,%ecx
++ jne sc_retdouble
++ # Load %ecx with the pointer to storage for the return value
++ movl 24(%ebp),%ecx
++ fstps (%ecx)
++ jmp sc_epilogue
++
++sc_retdouble:
++ cmpl $FFI_TYPE_DOUBLE,%ecx
++ jne sc_retlongdouble
++ # Load %ecx with the pointer to storage for the return value
++ movl 24(%ebp),%ecx
++ fstpl (%ecx)
++ jmp sc_epilogue
++
++sc_retlongdouble:
++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx
++ jne sc_retint64
++ # Load %ecx with the pointer to storage for the return value
++ movl 24(%ebp),%ecx
++ fstpt (%ecx)
++ jmp sc_epilogue
++
++sc_retint64:
++ cmpl $FFI_TYPE_SINT64,%ecx
++ jne sc_retstruct
++ # Load %ecx with the pointer to storage for the return value
++ movl 24(%ebp),%ecx
++ movl %eax,0(%ecx)
++ movl %edx,4(%ecx)
++
++sc_retstruct:
++ # Nothing to do!
++
++sc_noretval:
++sc_epilogue:
++ movl %ebp,%esp
++ popl %ebp
++ ret
++
++.ffi_call_STDCALL_end:
+--- gcc-3.2.2.orig/libjava/configure.host Mon Jun 10 13:15:26 2002
++++ gcc-3.2.2/libjava/configure.host Sat Feb 15 19:57:25 2003
+@@ -115,6 +115,12 @@
+ enable_getenv_properties_default=no
+ enable_main_args_default=no
+ ;;
++ sh-* | sh[34]*-*)
++ sysdeps_dir=sh
++ libgcj_flags="${libgcj_flags} -mieee"
++ libgcj_interpreter=yes
++ enable_hash_synchronization_default=yes
++ ;;
+ esac
+
+ # This case statement supports generic port properties and may refine
+@@ -126,7 +132,8 @@
+ powerpc*-linux* | \
+ alpha*-linux* | \
+ sparc*-linux* | \
+- ia64-*)
++ ia64-* | \
++ sh-linux* | sh[34]*-linux*)
+ can_unwind_signal=yes
+ ;;
+ *-*-darwin*)
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch
new file mode 100644
index 0000000..e0ccd9f
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch
@@ -0,0 +1,54 @@
+Based on gcc-3.4.0/gcc-3.3.3h-ppc-asm-spec.patch
+
+Fixes the following errors when building gcc for ppc7450:
+
+/tmp/ccYph3gd.s: Assembler messages:
+/tmp/ccYph3gd.s:3823: Error: Unrecognized opcode: `mfvrsave'
+/tmp/ccYph3gd.s:3857: Error: Unrecognized opcode: `stvx'
+/tmp/ccYph3gd.s:4026: Error: Unrecognized opcode: `lvx'
+/tmp/ccYph3gd.s:4027: Error: Unrecognized opcode: `mtvrsave'
+make[2]: *** [libgcc/./unwind-dw2.o] Error 1
+make[2]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc'
+make[1]: *** [stmp-multilib] Error 2
+make[1]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc'
+make: *** [all-gcc] Error 2
+
+Note that the "-mcpu=7450" option must appear on the "gcc" command line in
+order for "-maltivec" to be passed to the assembler. Or, "-maltivec" itself
+may be passed to the "gcc" command.
+
+Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil>
+
+===================================================================
+--- gcc-3.2.3/gcc/config/rs6000/rs6000.h~ 2003-03-29 07:39:20.000000000 -0500
++++ gcc-3.2.3/gcc/config/rs6000/rs6000.h 2004-08-23 16:33:21.000000000 -0400
+@@ -77,8 +77,8 @@
+ %{mcpu=604e: -D_ARCH_PPC} \
+ %{mcpu=620: -D_ARCH_PPC} \
+ %{mcpu=740: -D_ARCH_PPC} \
+-%{mcpu=7400: -D_ARCH_PPC} \
+-%{mcpu=7450: -D_ARCH_PPC} \
++%{mcpu=7400: -D_ARCH_PPC -D__ALTIVEC__} \
++%{mcpu=7450: -D_ARCH_PPC -D__ALTIVEC__} \
+ %{mcpu=750: -D_ARCH_PPC} \
+ %{mcpu=801: -D_ARCH_PPC} \
+ %{mcpu=821: -D_ARCH_PPC} \
+@@ -117,14 +117,15 @@
+ %{mcpu=604e: -mppc} \
+ %{mcpu=620: -mppc} \
+ %{mcpu=740: -mppc} \
+-%{mcpu=7400: -mppc} \
+-%{mcpu=7450: -mppc} \
++%{mcpu=7400: -mppc -maltivec} \
++%{mcpu=7450: -mppc -maltivec} \
+ %{mcpu=750: -mppc} \
+ %{mcpu=801: -mppc} \
+ %{mcpu=821: -mppc} \
+ %{mcpu=823: -mppc} \
+ %{mcpu=860: -mppc} \
+-%{maltivec: -maltivec}"
++%{maltivec: -maltivec} \
++-many"
+
+ #define CPP_DEFAULT_SPEC ""
+
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch
new file mode 100644
index 0000000..4751e9d
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch
@@ -0,0 +1,45 @@
+#
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+#
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.2.3-orig/configure gcc-3.2.3/configure
+--- gcc-3.2.3-orig/configure 2002-06-24 18:14:28.000000000 +0200
++++ gcc-3.2.3/configure 2005-04-20 18:42:49.000000000 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+- trap 0
++ trap '' 0
+ rm -rf Makefile* ${tmpdir}
+ # Execute the final clean-up actions
+ ${config_shell} skip-this-dir
+@@ -1615,7 +1615,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+
+ exit 0
+
diff --git a/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch
new file mode 100644
index 0000000..aafc130
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch
@@ -0,0 +1,54 @@
+Without this patch, the command
+
+RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3
+
+fails in two ways:
+1. the -L option meant to locate the testsuite directory is incorrect, and
+2. the wrong compiler is invoked, causing all sorts of havoc, not least of which
+is the native compiler is invoked when we really wanted to invoke the cross-compiler
+we just built.
+
+Here's an example log of the problem in action. Every testcase fails, this shows just one:
+-------------
+Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc -g -O2 -DDEBUG_ASSERT -L/testsuite -lv3test -lm -o ./binders.exe
+compiler exited with status 1
+output is:
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83: instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M
+/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43: instantiated from here^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M
+...
+FAIL: 20_util/binders.cc (test for excess errors)
+WARNING: 20_util/binders.cc compilation failed to produce executable
+-------------
+
+And here's the patch. I'm not happy with it, and it probably gets some cases wrong,
+but it seems to work for the common native case and for my cross-compiler case.
+
+--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003
++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003
+@@ -46,8 +46,23 @@
+ global gluefile wrap_flags
+ global ld_library_path
+ global tool_root_dir
++ global target_triplet
+
+ set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++ if { $blddir == "" } {
++ set multilibs [get_multilibs]
++ # FIXME: assume multilib only one level deep
++ set multisub [file tail $multilibs]
++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++ }
++ if { $blddir == "" } {
++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++ }
++ if { $blddir == "" } {
++ error "Can't find libstdc++-v3"
++ }
+
+ # By default, we assume we want to run program images.
+ global dg-do-what-default
diff --git a/patches/gcc/3.2.3/gcc-sh-linux.spec b/patches/gcc/3.2.3/gcc-sh-linux.spec
new file mode 100644
index 0000000..d647bb2
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-sh-linux.spec
@@ -0,0 +1,739 @@
+Summary: The GNU Compiler Collection for SuperH.
+%define GCC_VERSION 3.2.3
+%define arch_list sh3-linux sh3eb-linux sh4-linux sh4eb-linux
+%define TARGET_LIBSTDC 1
+%define TARGET_JAVA 1
+
+Name: gcc
+Version: 3.2.3
+Release: 3
+
+Copyright: GPL
+Group: Development/Languages
+Source0: gcc-%{GCC_VERSION}.tar.bz2
+Patch1: gcc-20030210-sh-linux-1.patch
+Patch2: gcc-3.2.3-libffi-1.patch
+Patch3: gcc-3.2.3-sh-linux-dwarf2-1.patch
+Buildroot: /var/tmp/gcc-%{_target}-root
+ExclusiveArch: i386 sh3 sh3eb sh4 sh4eb
+
+%description
+This package contains the GNU Compiler Collection: gcc and g++.
+You'll need this package in order to compile C/C++ code.
+
+%ifarch i386
+
+# ==================== Cross Compiler ===============================
+
+%package sh-linux
+Summary: The GNU Compiler Collection for sh-linux.
+Group: Development/Languages
+Requires: binutils-sh-linux >= 2.13.2
+Provides: gcc-sh-linux
+Obsoletes: gcc-sh3-linux gcc-sh3eb-linux gcc-sh4-linux gcc-sh4eb-linux
+Obsoletes: gcc-sh3-linux-c++ gcc-sh3eb-linux-c++ gcc-sh4-linux-c++ gcc-sh4eb-linux-c++
+Obsoletes: libstdc++-sh3-linux libstdc++-sh3eb-linux libstdc++-sh4-linux libstdc++-sh4eb-linux
+AutoReqProv: no
+
+%description sh-linux
+The gcc-sh-linux package contains GNU Compiler Collection: gcc g++ and libstdc++-v3.
+
+It includes support for most of the current C++ specification, including templates and
+exception handling. It does also include the standard C++ library and C++ header files.
+You'll need this package in order to cross compile C/C++ code for sh-linux.
+
+%package -n libgcj-sh-linux
+Summary: Header files and libraries for sh-linux Java development.
+Group: Development/Libraries
+Requires: gcc-sh-linux = %{version}-%{release}
+AutoReqProv: no
+
+%description -n libgcj-sh-linux
+The Java static libraries and C header files. You will need this
+package to compile your Java programs for sh-linux using the gcc Java compiler (gcj).
+
+%else
+# =========================== Native Compiler =================================
+%package libgcc
+Summary: runtime libraries for the GNU Compiler Collection.
+Group: System Environment/Libraries
+
+%description libgcc
+This package contains libgcc shared libraries for the GNU C Compiler Collection.
+You'll need this package in order to execute C,C++,JAVA code
+that uses shared libgcc.
+
+%package c++
+Summary: C++ support for gcc
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+
+%description c++
+This package adds C++ support to the GNU Compiler Collection. It includes
+support for most of the current C++ specification, including templates and
+exception handling. It does include the static standard C++
+library and C++ header files; the library for dynamically linking
+programs is available separately.
+
+%package -n libstdc++
+Summary: GNU c++ library.
+Group: System Environment/Libraries
+
+%description -n libstdc++
+The libstdc++ package contains a snapshot of the GCC Standard C++
+Library v3, an ongoing project to implement the ISO 14882 Standard C++
+library.
+
+%package -n libstdc++-devel
+Summary: Header files and libraries for C++ development
+Group: Development/Libraries
+Requires: libstdc++ = %{version}-%{release}, gcc-c++ = %{version}-%{release}
+
+%description -n libstdc++-devel
+This is the GNU implementation of the standard C++ libraries. This
+package includes the header files and libraries needed for C++
+development. This includes SGI's implementation of the STL.
+
+%package java
+Summary: Java support for gcc
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}, libgcj = %{version}-%{release}, libgcj-devel = %{version}-%{release}
+
+%description java
+This package adds experimental support for compiling Java(tm) programs and
+bytecode into native code. To use this you will also need the libgcj and
+libgcj-devel packages.
+
+%package -n libgcj
+Summary: Java runtime library for gcc.
+Group: System Environment/Libraries
+
+%description -n libgcj
+The Java runtime library. You will need this package to run your Java
+programs compiled using the gcc Java compiler (gcj).
+
+%package -n libgcj-devel
+Summary: Header files and libraries for Java development.
+Group: Development/Libraries
+Requires: libgcj = %{version}-%{release}
+
+%description -n libgcj-devel
+The Java static libraries and C header files. You will need this
+package to compile your Java programs using the gcc Java compiler (gcj).
+
+%endif
+
+%prep
+%setup -q -n gcc-%{GCC_VERSION}
+%patch1 -p1
+%patch2 -p1
+##%patch3 -p1
+
+%build
+%ifarch i386
+# build cross compiler for i386-linux host
+for arch in sh-linux; do
+ rm -rf ${arch}
+ mkdir ${arch}
+
+ CONFIG_ARGS="\
+ --prefix=%{_prefix} \
+ --mandir=%{_mandir} \
+ --infodir=%{_infodir} \
+ --target=${arch} \
+ --host=%{_host} \
+ --build=%{_build} \
+ --enable-languages=c,c++,java \
+ --with-system-zlib \
+ --with-gxx-include-dir=%{_prefix}/${arch}/include/g++-v3 \
+ --includedir=%{_prefix}/${arch}/include \
+ --disable-checking \
+ --disable-shared \
+ --enable-__cxa_atexit \
+ --enable-c99 \
+ --enable-threads=posix \
+ --enable-long-long"
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj"
+ fi
+ ( cd $arch
+ ../configure ${CONFIG_ARGS}
+ )
+ if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then
+ sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$
+ mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile
+ fi
+ make all-gcc -C ${arch}
+
+ if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+ CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`"
+ make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host" all-target-libstdc++-v3 -C ${arch}
+ fi
+
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ make all-fastjar -C ${arch}
+ CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--host=%{_host}/--host=${arch}/`"
+ dir=`pwd`
+
+ ac_cv_file__proc_self_exe=yes \
+ ac_cv_prog_GCJ="$dir/$arch/gcc/gcj -B$dir/$arch/$arch/libjava/ -B$dir/$arch/gcc/ -B%{_prefix}/$arch/bin/ -B%{_prefix}/$arch/lib/ -isystem %{_prefix}/$arch/include" \
+ make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host --enable-multilib --with-target-subdir=${arch} --with-x=no" \
+ all-target-libjava -C ${arch}
+ fi
+
+%else
+# Canadian cross (build native compiler)
+for arch in %{_target}; do
+ rm -rf ${arch}
+ mkdir -p ${arch}
+ CONFIG_ARGS="\
+ --prefix=%{_prefix} \
+ --mandir=%{_mandir} \
+ --infodir=%{_infodir} \
+ --target=${arch} \
+ --host=${arch} \
+ --build=%{_build} \
+ --enable-languages=c,c++,java \
+ --with-system-zlib \
+ --with-gxx-include-dir=%{_prefix}/include/g++-v3 \
+ --disable-checking \
+ --disable-shared \
+ --enable-__cxa_atexit \
+ --enable-c99 \
+ --enable-threads=posix \
+ --enable-long-long"
+
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj"
+ fi
+
+ ( cd ${arch}
+ CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ \
+ ../configure $CONFIG_ARGS
+ )
+
+ if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then
+ sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$
+ mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile
+ fi
+
+ make all-build-libiberty all-gcc -C ${arch}
+
+ if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+ CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`"
+ make TARGET_CONFIGARGS="${CONFIG_ARGS}" all-target-libstdc++-v3 -C ${arch}
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ ( mkdir -p ${arch}/fastjar; cd ${arch}/fastjar; rm *; ../../fastjar/configure --with-system-zlib; make )
+ ac_cv_file__proc_self_exe=yes \
+ CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ GCJ=${arch}-gcj \
+ make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-x=no" configure-target-libjava -C ${arch}
+
+ make -C ${arch}/${arch}/libffi
+ make -C ${arch}/${arch}/boehm-gc
+ make -C ${arch}/${arch}/zlib
+ make GCJ=${arch}-gcj GCJH=${arch}-gcjh ZIP=${arch}-jar -C ${arch}/${arch}/libjava
+ (
+ rm -rf ${arch}/${arch}/fastjar
+ mkdir -p ${arch}/${arch}/fastjar
+ cd ${arch}/${arch}/fastjar
+
+ ac_cv_sizeof_char=1 \
+ ac_cv_sizeof_short=2 \
+ ac_cv_sizeof_int=4 \
+ ac_cv_sizeof_long=4 \
+ ac_cv_sizeof_long_long=8 \
+ ac_cv_sizeof_float=4 \
+ ac_cv_sizeof_double=8 \
+ ac_cv_sizeof_long_double=8 \
+ ac_cv_sizeof_void_p=4 \
+ ac_cv_file__proc_self_exe=yes \
+ ac_cv_header_langinfo_h=yes \
+ CC=${arch}-gcc ../../../fastjar/configure $CONFIG_ARGS
+
+ make
+ )
+
+ fi
+ fi
+%endif
+done
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p ${RPM_BUILD_ROOT}/{%{_prefix}/bin,lib}
+
+%ifarch i386
+ ARCH_STRTIP=strip
+ EXESUFFIX=""
+ arch=sh-linux
+ TOOLPREFIX=${arch}-
+ mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/{bin,include,lib,share}
+ mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/lib/{m4,mb/m4}
+ make DESTDIR=${RPM_BUILD_ROOT} \
+ install-gcc \
+ install-fastjar \
+ -C ${arch}
+%if 0
+ ( cd ${RPM_BUILD_ROOT}%{_prefix}/sh-linux/lib
+ rm -f libgcc_s_*.so
+ mv libgcc_s_mb.so.1 mb/libgcc_s.so.1
+ mv libgcc_s_m4.so.1 m4/libgcc_s.so.1
+ mv libgcc_s_mb_m4.so.1 mb/m4/libgcc_s.so.1
+ ln -s libgcc_s.so.1 mb/libgcc_s.so
+ ln -s libgcc_s.so.1 m4/libgcc_s.so
+ ln -s libgcc_s.so.1 mb/m4/libgcc_s.so
+ )
+%endif
+
+ if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+ make DESTDIR=${RPM_BUILD_ROOT} \
+ install-target-libstdc++-v3 \
+ -C ${arch}
+ fi
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ make DESTDIR=${RPM_BUILD_ROOT} \
+ install-target-libjava \
+ install-target-boehm-gc \
+ install-target-zlib \
+ -C ${arch}
+ make DESTDIR=${RPM_BUILD_ROOT} prefix=%{_prefix}/${arch} \
+ install -C ${arch}/${arch}/libffi
+ mv -f $RPM_BUILD_ROOT%{_prefix}/share/java $RPM_BUILD_ROOT%{_prefix}/sh-linux/share/
+ fi
+ rm -f $RPM_BUILD_ROOT%{_prefix}/bin/{gcov,gccbug}
+ rm -f $RPM_BUILD_ROOT%{_prefix}/${arch}/bin/{gij,jv-convert}
+ sed -e 's/@@VERSION@@/%{GCC_VERSION}/g' debian/shCPU-linux-GCC >$RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC
+ chmod 0755 $RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC
+
+ LIBSTDC=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libstdc++.so*`
+ LIBGCJ=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libgcj.so*`
+ LIBFFI=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libffi*.so*`
+ # literally (binary-ly) same
+ PROGS="cpp c++ g++ g77 gcc gcj"
+ DRIVERS="cc1 cc1obj cc1plus collect2 cpp0 f771 jc1 tradcpp0 jvgenmain"
+ OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o"
+ LIBS="libgcc.a libgcc_eh.a libobjc.a"
+ LIBS_1="$LIBSTDC \
+ $LIBGCJ libgcj.spec \
+ $LIBFFI "
+ LIBS_2="libstdc++.a libstdc++.la \
+ libsupc++.a libsupc++.la \
+ libgcj.a libgcj.la \
+ libffi.a libffi.la"
+ INCLUDE="include"
+
+ for CPU in sh3 sh3eb sh4 sh4eb; do
+ mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}
+ mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${CPU}-linux/{lib,share/java}
+ # Make symbolic links for include dir.
+ ln -s ../sh-linux/include $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/include
+
+ # Make symbolic links for libgcj.jar
+ ln -s ../../sh-linux/share/java/libgcj-%{GCC_VERSION}.jar $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/share/java/libgcj-%{GCC_VERSION}.jar
+
+ # Make symbolic links for executables.
+ for p in ${PROGS}; do
+ ln -s shCPU-linux-GCC $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-$p
+ done
+ ln -s sh-linux-gcjh $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-gcjh
+
+ case "${CPU}" in
+ sh3)
+ MULTILIBDIR=
+ MULTIPARENTDIR=
+ AS_ENDIAN_FLAG="-little"
+ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
+ CPP_CPU_DEFS='-D__SH3__ -D__sh3__'
+ CC1_CPU_ENDIAN_FLAGS="-ml -m3"
+ CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m3"
+ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3"
+ LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3-linux/lib"
+ ;;
+ sh3eb)
+ MULTILIBDIR=/mb
+ MULTIPARENTDIR=../
+ AS_ENDIAN_FLAG="-big"
+ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
+ CPP_CPU_DEFS='-D__SH3__ -D__sh3__'
+ CC1_CPU_ENDIAN_FLAGS="-mb -m3"
+ CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m3"
+ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3"
+ LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3eb-linux/lib"
+ ;;
+ sh4)
+ MULTILIBDIR=/m4
+ MULTIPARENTDIR=../
+ AS_ENDIAN_FLAG="-little"
+ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
+ CPP_CPU_DEFS="-D__SH4__"
+ CC1_CPU_ENDIAN_FLAGS="-ml -m4"
+ CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m4"
+ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4"
+ LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4-linux/lib"
+ ;;
+ sh4eb)
+ MULTILIBDIR=/mb/m4
+ MULTIPARENTDIR=../../
+ AS_ENDIAN_FLAG="-big"
+ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
+ CPP_CPU_DEFS="-D__SH4__"
+ CC1_CPU_ENDIAN_FLAGS="-mb -m4"
+ CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m4"
+ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4"
+ LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4eb-linux/lib"
+ ;;
+ esac
+
+ # Make symbolic links for GCC drivers, objects, libraries, and include dir.
+ for f in ${DRIVERS} ${INCLUDE}; do
+ if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/$f ]; then
+ ln -s ../../sh-linux/%{GCC_VERSION}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f
+ fi
+ done
+ for f in ${OBJS} ${LIBS}; do
+ if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f ]; then
+ ln -s ../../sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f
+ fi
+ done
+
+ for f in ${LIBS_1} ${LIBS_2}; do
+ if [ -e $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f ]; then
+ mv -f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/lib
+ ln -s ${MULTIPARENTDIR}../../${CPU}-linux/lib/$f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f
+ fi
+ done
+
+ sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \
+ -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \
+ -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \
+ -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \
+ -e "s+@CC1PLUS_CPU_ENDIAN_FLAGS@+${CC1PLUS_CPU_ENDIAN_FLAGS}+" \
+ -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \
+ -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \
+ debian/edit-specs.in >${arch}/edit-specs-${CPU}.sed
+
+ sed -f ${arch}/edit-specs-${CPU}.sed \
+ $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs \
+ > $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/specs
+
+ done
+
+%else
+ ARCH_STRTIP=%{_target}-strip
+ EXESUFFIX=""
+ TOOLPREFIX=""
+ ln -s ..%{_prefix}/bin/cpp ${RPM_BUILD_ROOT}/lib/cpp
+ ln -s gcc ${RPM_BUILD_ROOT}%{_prefix}/bin/cc
+ arch=%{_target}
+ make DESTDIR=${RPM_BUILD_ROOT} \
+ install -C ${arch}
+ if [ %{TARGET_JAVA} -ne 0 ]; then
+ make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/libffi
+ make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/fastjar
+ mv -f ${RPM_BUILD_ROOT}/%{_prefix}/%{_lib}/libgcj.spec \
+ ${RPM_BUILD_ROOT}/%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/
+ fi
+ $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/gcov$EXESUFFIX || :
+
+cat >${arch}/edit-specs <<EOF
+/^*cross_compile:$/ {
+n
+c\\
+0
+}
+EOF
+ sed -f ${arch}/edit-specs -e 's#-rpath-link.*/usr/%{_target}/lib##' \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs \
+ >${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$
+ mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$ \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs
+
+ sed -e "s/dependency_libs=.*/dependency_libs='-lm -lgcc -lc -lgcc'/" \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la \
+ >${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$
+ mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$ \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la
+
+ sed -e "s/dependency_libs=.*/dependency_libs='-lpthread -ldl -lz -lm -lgcc -lc -lgcc'/" \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la \
+ >${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$
+ mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$ \
+ ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la
+
+cat >$RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h <<EOF
+#define _GCC_NEXT_LIMITS_H /* tell gcc's limits.h to recurse */
+#include_next <limits.h>
+#undef _GCC_NEXT_LIMITS_H
+EOF
+
+%endif
+
+ $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/${TOOLPREFIX}{gcc,cpp,c++,c++filt,gcj,gcjh,gij,jar,grepjar,jcf-dump,jv-convert,jv-scan}$EXESUFFIX || :
+ FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/cc1${EXESUFFIX})
+ $ARCH_STRTIP $FULLPATH/{cc1${EXESUFFIX},cc1plus${EXESUFFIX},cpp0${EXESUFFIX},tradcpp0${EXESUFFIX},collect2${EXESUFFIX},jc1${EXESUFFIX},jvgenmain${EXESUFFIX}} || :
+
+ # Strip static libraries
+ sh-linux-strip -S -R .comment `find $RPM_BUILD_ROOT -type f -name "*.a"` || :
+
+ # Strip ELF shared objects
+ for f in `find $RPM_BUILD_ROOT -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) `; do
+ if file $f | grep -q "shared object.*not stripped"; then
+ sh-linux-strip --strip-unneeded -R .comment $f
+ fi
+ done
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+# ==================== Cross Compiler ===============================
+%ifarch i386
+
+%files sh-linux
+%defattr(-,root,root)
+%{_prefix}/bin/sh*
+%dir %{_prefix}/lib/gcc-lib/sh-linux
+%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include
+%dir %{_prefix}/lib/gcc-lib/sh3-linux
+%dir %{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh3eb-linux
+%dir %{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh4-linux
+%dir %{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh4eb-linux
+%dir %{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION}
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1plus
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/collect2
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cpp0
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/*.o
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/libgcc*.a
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/tradcpp0
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jc1
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jvgenmain
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/m4
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/mb
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stddef.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/varargs.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/float.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/limits.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/iso646.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/syslimits.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/README
+%{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION}/*
+%{_mandir}/man1/sh-linux-*
+%dir %{_prefix}/sh-linux/include
+%{_prefix}/sh3-linux/include
+%{_prefix}/sh3eb-linux/include
+%{_prefix}/sh4-linux/include
+%{_prefix}/sh4eb-linux/include
+%endif
+
+%if %{TARGET_LIBSTDC}
+%ifarch i386
+%{_prefix}/sh-linux/include/g++-v3
+%{_prefix}/sh-linux/lib/libs*
+%{_prefix}/sh-linux/lib/m4/libs*
+%{_prefix}/sh-linux/lib/mb/libs*
+%{_prefix}/sh-linux/lib/mb/m4/libs*
+%{_prefix}/sh3-linux/lib/libs*
+%{_prefix}/sh4-linux/lib/libs*
+%{_prefix}/sh3eb-linux/lib/libs*
+%{_prefix}/sh4eb-linux/lib/libs*
+%endif
+%endif
+
+%if %{TARGET_JAVA}
+%ifarch i386
+%files -n libgcj-sh-linux
+%defattr(-,root,root)
+%{_prefix}/sh-linux/include/*.h
+%{_prefix}/sh-linux/include/gcj
+%{_prefix}/sh-linux/include/gnu/*
+%{_prefix}/sh-linux/include/java
+%{_prefix}/sh-linux/lib/lib*gcj*
+%{_prefix}/sh-linux/lib/m4/lib*gcj*
+%{_prefix}/sh-linux/lib/mb/lib*gcj*
+%{_prefix}/sh-linux/lib/mb/m4/lib*gcj*
+%{_prefix}/sh-linux/lib/libffi*
+%{_prefix}/sh-linux/lib/m4/libffi*
+%{_prefix}/sh-linux/lib/mb/libffi*
+%{_prefix}/sh-linux/lib/mb/m4/libffi*
+%{_prefix}/sh-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh3-linux/lib/lib*gcj*
+%{_prefix}/sh3-linux/lib/libffi*
+%{_prefix}/sh3-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh4-linux/lib/lib*gcj*
+%{_prefix}/sh4-linux/lib/libffi*
+%{_prefix}/sh4-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh3eb-linux/lib/lib*gcj*
+%{_prefix}/sh3eb-linux/lib/libffi*
+%{_prefix}/sh3eb-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh4eb-linux/lib/lib*gcj*
+%{_prefix}/sh4eb-linux/lib/libffi*
+%{_prefix}/sh4eb-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%endif
+%endif
+
+%ifarch sh3 sh3eb sh4 sh4eb
+# =========================== Native Compiler =================================
+%files
+%defattr(-,root,root)
+%dir %{_prefix}/lib/gcc-lib/%{_target}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/collect2
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cpp0
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/crt*.o
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcc*.a
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/specs
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/tradcpp0
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stddef.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/varargs.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/float.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/limits.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/iso646.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/README
+%{_prefix}/bin/gcc
+%{_prefix}/bin/%{_target}-gcc
+%{_prefix}/bin/cpp
+%{_prefix}/bin/gccbug
+%{_prefix}/bin/gcov
+%{_prefix}/bin/cc
+/lib/cpp
+%{_infodir}/cpp*
+%{_infodir}/gcc*
+
+%if 0
+%files libgcc
+%defattr(-,root,root)
+/lib/libgcc_s.so*
+%endif
+
+%files c++
+%defattr(-,root,root)
+%{_prefix}/bin/c++
+%{_prefix}/bin/g++
+%{_prefix}/bin/c++filt
+%{_prefix}/bin/%{_target}-c++
+%{_prefix}/bin/%{_target}-g++
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1plus
+%endif
+
+%if %{TARGET_LIBSTDC}
+%ifarch sh3 sh3eb sh4 sh4eb
+%files -n libstdc++
+%defattr(-,root,root)
+%{_prefix}/lib/libstdc++.so*
+
+%files -n libstdc++-devel
+%defattr(-,root,root)
+%{_prefix}/include/g++-v3
+%{_prefix}/lib/libstdc++.*a
+%endif
+%endif
+
+%if %{TARGET_JAVA}
+%ifarch sh3 sh3eb sh4 sh4eb
+%files java
+%defattr(-,root,root)
+%{_prefix}/bin/addr2name.awk
+%{_prefix}/bin/gcj
+%{_prefix}/bin/gcjh
+%{_prefix}/bin/gij
+%{_prefix}/bin/jar
+%{_prefix}/bin/grepjar
+%{_prefix}/bin/jcf-dump
+%{_prefix}/bin/jv-convert
+%{_prefix}/bin/jv-scan
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jc1
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jvgenmain
+%{_infodir}/gcj*
+
+%files -n libgcj
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libgcj.so*
+%{_prefix}/%{_lib}/libffi*.so*
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcj.spec
+%{_prefix}/share/java/libgcj-%{GCC_VERSION}.jar
+
+%files -n libgcj-devel
+%defattr(-,root,root)
+%{_prefix}/include/*.h
+%{_prefix}/include/gcj
+%{_prefix}/include/gnu/*
+%{_prefix}/include/java
+%{_prefix}/lib/libgcj.*a
+%{_prefix}/lib/libffi.*a
+%endif
+%endif
+
+%changelog
+* Wed Feb 19 2003 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- version 3.2.2.
+
+* Tue Feb 19 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- version 3.0.4.
+
+* Tue Feb 12 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add java support.
+
+* Thu Feb 7 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- follow debian/SH update.
+
+* Tue Feb 5 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- follow debian/SH update.
+
+* Thu Jan 24 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- rebuild with new binutils.
+
+* Tue Jan 22 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- leaf function optimization fixed.
+
+* Thu Dec 06 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add gcc-ice-rml patch.
+
+* Tue Nov 13 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add configure option.
+
+* Thu Nov 01 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- tablejump fix by gniibe.
+
+* Mon Oct 22 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- updated gcc patch.
+
+* Wed Oct 17 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- updated gcc patch.
+
+* Tue Oct 02 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc/config/sh/sh.c bug fix.
+
+* Fri Aug 24 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc version 3.0.1.
+
+* Thu Jun 28 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc version 3.0.
+- Add libstdc++ package.
+
+* Mon Apr 23 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- Add cygwin host.
+
+* Sat Dec 23 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- fix file attribute.
+- add asmspecs patch.
+
+* Sat Nov 11 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- initial version.