diff options
author | Yann E. MORIN" <yann.morin.1998@anciens.enib.fr> | 2007-02-24 11:00:05 (GMT) |
---|---|---|
committer | Yann E. MORIN" <yann.morin.1998@anciens.enib.fr> | 2007-02-24 11:00:05 (GMT) |
commit | 1906cf93f86d8d66f45f90380a8d3da25c087ee5 (patch) | |
tree | 90916c99abe1f1ec26709ee420e6c349eda4670a /patches/gcc/3.2.3 | |
parent | 2609573aede4ce198b3462976725b25eb1637d2e (diff) |
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
Diffstat (limited to 'patches/gcc/3.2.3')
-rw-r--r-- | patches/gcc/3.2.3/README-mips | 1648 | ||||
-rw-r--r-- | patches/gcc/3.2.3/README-sh | 16 | ||||
-rw-r--r-- | patches/gcc/3.2.3/config.sub.patch | 72 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch | 105 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch | 1761 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch | 98 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch | 6864 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch | 54 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch | 45 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch | 54 | ||||
-rw-r--r-- | patches/gcc/3.2.3/gcc-sh-linux.spec | 739 |
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. |