]> TLD Linux GIT Repositories - packages/gcc.git/commitdiff
- merged GCC 4.6.x from PLD
authorMarcin Krol <hawk@tld-linux.org>
Tue, 18 Sep 2012 07:11:11 +0000 (07:11 +0000)
committerMarcin Krol <hawk@tld-linux.org>
Tue, 18 Sep 2012 07:11:11 +0000 (07:11 +0000)
gcc-build-id.patch [deleted file]
gcc-extern-template-sed.patch [new file with mode: 0644]
gcc-hash-style-gnu.patch [deleted file]
gcc-nolocalefiles.patch [deleted file]
issue4664051.patch [new file with mode: 0644]
libffi.pc.in [new file with mode: 0644]

diff --git a/gcc-build-id.patch b/gcc-build-id.patch
deleted file mode 100644 (file)
index f76f939..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-2007-07-22  Roland McGrath  <roland@redhat.com>
-
-       * config/rs6000/sysv4.h (LINK_EH_SPEC): Add --build-id for
-       non-relocatable link.
-       * config/linux.h (LINK_EH_SPEC): Likewise.
-       * config/alpha/elf.h (LINK_EH_SPEC): Likewise.
-       * config/ia64/linux.h (LINK_EH_SPEC): Likewise.
-
---- gcc/config/rs6000/sysv4.h.~1~
-+++ gcc/config/rs6000/sysv4.h
-@@ -906,7 +906,7 @@ extern int fixuplabelno;
-   %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}"
- #if defined(HAVE_LD_EH_FRAME_HDR)
--# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
-+# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} %{!r:--build-id} "
- #endif
- #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
---- gcc/config/linux.h.~1~
-+++ gcc/config/linux.h
-@@ -85,7 +85,7 @@ Boston, MA 02110-1301, USA.  */
-     } while (0)
- #if defined(HAVE_LD_EH_FRAME_HDR)
--#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
-+#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} %{!r:--build-id} "
- #endif
- /* Define this so we can compile MS code for use with WINE.  */
---- gcc/config/alpha/elf.h.~1~
-+++ gcc/config/alpha/elf.h
-@@ -421,7 +421,7 @@ extern int alpha_this_gpdisp_sequence_nu
-    I imagine that other systems will catch up.  In the meantime, it
-    doesn't harm to make sure that the data exists to be used later.  */
- #if defined(HAVE_LD_EH_FRAME_HDR)
--#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
-+#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} %{!r:--build-id} "
- #endif
- /* A C statement (sans semicolon) to output to the stdio stream STREAM
---- gcc/config/ia64/linux.h.~1~
-+++ gcc/config/ia64/linux.h
-@@ -56,7 +56,7 @@ do {                                         \
-    Signalize that because we have fde-glibc, we don't need all C shared libs
-    linked against -lgcc_s.  */
- #undef LINK_EH_SPEC
--#define LINK_EH_SPEC ""
-+#define LINK_EH_SPEC "%{!r:--build-id} "
- #define MD_UNWIND_SUPPORT "config/ia64/linux-unwind.h"
diff --git a/gcc-extern-template-sed.patch b/gcc-extern-template-sed.patch
new file mode 100644 (file)
index 0000000..a3dee4b
--- /dev/null
@@ -0,0 +1,26 @@
+diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
+index 1e9b144..b099580 100644
+--- a/libstdc++-v3/include/Makefile.am
++++ b/libstdc++-v3/include/Makefile.am
+@@ -1105,7 +1105,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \
+       sed -e "s,define __GLIBCXX__,define __GLIBCXX__ $$date," \
+       -e "s,define _GLIBCXX_INLINE_VERSION, define _GLIBCXX_INLINE_VERSION $$ns_version," \
+       -e "s,define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY, define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY $$visibility," \
+-      -e "s,define _GLIBCXX_EXTERN_TEMPLATE, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \
++      -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \
+       -e "$$ldbl_compat" \
+           < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\
+       sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \
+diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
+index 19a7c0e..9344d46 100644
+--- a/libstdc++-v3/include/Makefile.in
++++ b/libstdc++-v3/include/Makefile.in
+@@ -1497,7 +1497,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \
+       sed -e "s,define __GLIBCXX__,define __GLIBCXX__ $$date," \
+       -e "s,define _GLIBCXX_INLINE_VERSION, define _GLIBCXX_INLINE_VERSION $$ns_version," \
+       -e "s,define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY, define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY $$visibility," \
+-      -e "s,define _GLIBCXX_EXTERN_TEMPLATE, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \
++      -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \
+       -e "$$ldbl_compat" \
+           < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\
+       sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \
diff --git a/gcc-hash-style-gnu.patch b/gcc-hash-style-gnu.patch
deleted file mode 100644 (file)
index 3c19b2b..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
---- gcc-4.2.0-20070316/gcc/config/alpha/linux-elf.h.orig       2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/alpha/linux-elf.h    2007-04-18 07:14:56.875631582 -0400
-@@ -40,7 +40,7 @@
- #define ELF_DYNAMIC_LINKER    LINUX_DYNAMIC_LINKER
--#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}                \
-+#define LINK_SPEC "-m elf64alpha --hash-style=gnu %{G*} %{relax:-relax}       \
-   %{O*:-O3} %{!O*:-O1}                                                \
-   %{shared:-shared}                                           \
-   %{!shared:                                                  \
---- gcc-4.2.0-20070316/gcc/config/s390/linux.h.orig    2006-12-12 10:21:53.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/s390/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -78,7 +78,7 @@
- #undef  LINK_SPEC
- #define LINK_SPEC \
--  "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
-+  "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu \
-    %{shared:-shared} \
-    %{!shared: \
-       %{static:-static} \
---- gcc-4.2.0-20070316/gcc/config/sparc/linux.h.orig   2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/sparc/linux.h        2007-04-18 07:14:56.875631582 -0400
-@@ -133,7 +133,7 @@
- #undef  LINK_SPEC
--#define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
-+#define LINK_SPEC "-m elf32_sparc --hash-style=gnu -Y P,/usr/lib %{shared:-shared} \
-   %{!mno-relax:%{!r:-relax}} \
-   %{!shared: \
-     %{!ibcs: \
---- gcc-4.2.0-20070316/gcc/config/sparc/linux64.h.orig 2006-03-02 17:47:02.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/sparc/linux64.h      2007-04-18 07:16:49.644880415 -0400
-@@ -121,7 +121,7 @@
-   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },      \
-   { "link_arch",       LINK_ARCH_SPEC },
--#define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,%R/usr/lib %{shared:-shared} \
-+#define LINK_ARCH32_SPEC "-m elf32_sparc --hash-style=gnu -Y P,%R/usr/lib %{shared:-shared} \
-   %{!shared: \
-     %{!ibcs: \
-       %{!static: \
-@@ -130,7 +130,7 @@
-         %{static:-static}}} \
- "
--#define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \
-+#define LINK_ARCH64_SPEC "-m elf64_sparc --hash-style=gnu -Y P,%R/usr/lib64 %{shared:-shared} \
-   %{!shared: \
-     %{!ibcs: \
-       %{!static: \
-@@ -211,7 +211,7 @@
- #else /* !SPARC_BI_ARCH */
- #undef LINK_SPEC
--#define LINK_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \
-+#define LINK_SPEC "-m elf64_sparc --hash-style=gnu -Y P,%R/usr/lib64 %{shared:-shared} \
-   %{!shared: \
-     %{!ibcs: \
-       %{!static: \
---- gcc-4.2.0-20070316/gcc/config/i386/linux.h.orig    2006-04-06 18:16:11.000000000 -0400
-+++ gcc-4.2.0-20070316/gcc/config/i386/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -109,7 +109,7 @@
-   { "dynamic_linker", LINUX_DYNAMIC_LINKER }
- #undef        LINK_SPEC
--#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
-+#define LINK_SPEC "-m %(link_emulation) --hash-style=gnu %{shared:-shared} \
-   %{!shared: \
-     %{!ibcs: \
-       %{!static: \
---- gcc-4.2.0-20070316/gcc/config/i386/linux64.h.orig  2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/i386/linux64.h       2007-04-18 07:14:56.875631582 -0400
-@@ -65,7 +65,7 @@
- #endif
- #undef        LINK_SPEC
--#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} \
-+#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} --hash-style=gnu \
-   %{shared:-shared} \
-   %{!shared: \
-     %{!static: \
---- gcc-4.2.0-20070316/gcc/config/ia64/linux.h.orig    2006-12-12 10:21:53.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/ia64/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -40,7 +40,7 @@
- #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
- #undef LINK_SPEC
--#define LINK_SPEC "\
-+#define LINK_SPEC "--hash-style=gnu \
-   %{shared:-shared} \
-   %{!shared: \
-     %{!static: \
---- gcc-4.2.0-20070316/gcc/config/rs6000/sysv4.h.orig  2007-03-09 19:59:15.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/rs6000/sysv4.h       2007-04-18 07:14:56.872300144 -0400
-@@ -902,7 +902,7 @@
- #define LINUX_DYNAMIC_LINKER \
-   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
--#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \
-   %{rdynamic:-export-dynamic} \
-   %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}"
---- gcc-4.2.0-20070316/gcc/config/rs6000/linux64.h.orig        2006-07-14 11:54:23.000000000 -0400
-+++ gcc-4.2.0-20070316/gcc/config/rs6000/linux64.h     2007-04-18 07:18:14.042413298 -0400
-@@ -351,11 +351,11 @@
-   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
--#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \
-   %{rdynamic:-export-dynamic} \
-   %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}"
--#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC64 "-m elf64ppc --hash-style=gnu %{!shared: %{!static: \
-   %{rdynamic:-export-dynamic} \
-   %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}"
diff --git a/gcc-nolocalefiles.patch b/gcc-nolocalefiles.patch
deleted file mode 100644 (file)
index a799c54..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- gcc-4.2.0/libstdc++-v3/configure.orig      2007-06-03 03:02:48.949324693 -0400
-+++ gcc-4.2.0/libstdc++-v3/configure   2007-06-03 03:11:31.035566610 -0400
-@@ -5865,7 +5865,7 @@
-         int j;
-         __locale_t        loc;
-         __locale_t        loc_dup;
--        loc = __newlocale(1 << LC_ALL, "de_DE", 0);
-+        loc = __newlocale(1 << LC_ALL, "C", 0);
-         loc_dup = __duplocale(loc);
-         i = __strcoll_l(__one, __two, loc);
-         j = __strcoll_l(__one, __two, loc_dup);
diff --git a/issue4664051.patch b/issue4664051.patch
new file mode 100644 (file)
index 0000000..9258f63
--- /dev/null
@@ -0,0 +1,542 @@
+http://patchwork.ozlabs.org/patch/102292/
+http://codereview.appspot.com/4664051/
+http://sourceware.org/ml/binutils/2011-01/msg00178.html
+http://anonscm.debian.org/viewvc/gcccvs/branches/sid/gcc-4.6/debian/patches/gold-and-ld.diff
+
+Index: gcc/doc/invoke.texi
+===================================================================
+--- gcc/doc/invoke.texi        (revision 175346)
++++ gcc/doc/invoke.texi        (working copy)
+@@ -418,7 +418,7 @@
+ -funit-at-a-time -funroll-all-loops -funroll-loops @gol
+ -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops @gol
+ -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol
+--fwhole-program -fwpa -fuse-linker-plugin @gol
++-fwhole-program -fwpa -fuse-ld -fuse-linker-plugin @gol
+ --param @var{name}=@var{value}
+ -O  -O0  -O1  -O2  -O3  -Os -Ofast}
+@@ -8017,6 +8017,16 @@
+ Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
++@item -fuse-ld=gold
++Use the @command{gold} linker instead of the default linker.
++This option is only necessary if GCC has been configured with
++@option{--enable-gold} and @option{--enable-ld=default}.
++
++@item -fuse-ld=bfd
++Use the @command{ld.bfd} linker instead of the default linker.
++This option is only necessary if GCC has been configured with
++@option{--enable-gold} and @option{--enable-ld}.
++
+ @item -fcprop-registers
+ @opindex fcprop-registers
+ After register allocation and post-register allocation instruction splitting,
+Index: gcc/configure
+===================================================================
+--- gcc/configure      (revision 175346)
++++ gcc/configure      (working copy)
+@@ -681,6 +681,7 @@
+ gcc_cv_objdump
+ ORIGINAL_NM_FOR_TARGET
+ gcc_cv_nm
++ORIGINAL_GOLD_FOR_TARGET
+ ORIGINAL_LD_FOR_TARGET
+ ORIGINAL_PLUGIN_LD_FOR_TARGET
+ gcc_cv_ld
+@@ -21131,6 +21132,21 @@
+ fi
+ fi
++gcc_cv_ld_gold_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gold
++
++if test "${gcc_cv_gold+set}" = set; then :
++
++else
++
++if test -f $gcc_cv_ld_gold_srcdir/configure.ac \
++     && test -f ../gold/Makefile \
++     && test x$build = x$host; then
++      gcc_cv_gold=../gold/ld-new$build_exeext
++else
++        gcc_cv_gold=''
++fi
++fi
++
+ ORIGINAL_PLUGIN_LD_FOR_TARGET=$gcc_cv_ld
+ PLUGIN_LD=`basename $gcc_cv_ld`
+@@ -21170,6 +21186,9 @@
+  ;;
+ esac
++ORIGINAL_GOLD_FOR_TARGET=$gcc_cv_gold
++
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking what linker to use" >&5
+ $as_echo_n "checking what linker to use... " >&6; }
+ if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then
+Index: gcc/gcc.c
+===================================================================
+--- gcc/gcc.c  (revision 175346)
++++ gcc/gcc.c  (working copy)
+@@ -657,6 +657,9 @@
+     }"PLUGIN_COND_CLOSE" \
+     %{flto|flto=*:%<fcompare-debug*} \
+     %{flto} %{flto=*} %l " LINK_PIE_SPEC \
++   "%{fuse-ld=gold:%{fuse-ld=bfd:%e-fuse-ld=gold and -fuse-ld=bfd may not be used together}} \
++    %{fuse-ld=gold:-use-gold} \
++    %{fuse-ld=bfd:-use-ld}" \
+    "%X %{o*} %{e*} %{N} %{n} %{r}\
+     %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\
+     %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
+Index: gcc/opts.c
+===================================================================
+--- gcc/opts.c (revision 175346)
++++ gcc/opts.c (working copy)
+@@ -1729,8 +1729,9 @@
+       dc->max_errors = value;
+       break;
++    case OPT_fuse_ld_:
+     case OPT_fuse_linker_plugin:
+-      /* No-op. Used by the driver and passed to us because it starts with f.*/
++      /* No-op. Used by the driver and passed to us because it starts with f.  */
+       break;
+     case OPT_Wuninitialized:
+Index: gcc/configure.ac
+===================================================================
+--- gcc/configure.ac   (revision 175346)
++++ gcc/configure.ac   (working copy)
+@@ -1974,6 +1974,17 @@
+         AC_PATH_PROG(gcc_cv_ld, $LD_FOR_TARGET)
+ fi])
++gcc_cv_ld_gold_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gold
++
++AS_VAR_SET_IF(gcc_cv_gold,, [
++if test -f $gcc_cv_ld_gold_srcdir/configure.ac \
++     && test -f ../gold/Makefile \
++     && test x$build = x$host; then
++      gcc_cv_gold=../gold/ld-new$build_exeext
++else
++        gcc_cv_gold=''
++fi])
++
+ ORIGINAL_PLUGIN_LD_FOR_TARGET=$gcc_cv_ld
+ PLUGIN_LD=`basename $gcc_cv_ld`
+ AC_ARG_WITH(plugin-ld,
+@@ -2003,6 +2014,9 @@
+   *) AC_CONFIG_FILES(collect-ld:exec-tool.in, [chmod +x collect-ld]) ;;
+ esac 
++ORIGINAL_GOLD_FOR_TARGET=$gcc_cv_gold
++AC_SUBST(ORIGINAL_GOLD_FOR_TARGET)
++
+ AC_MSG_CHECKING(what linker to use)
+ if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then
+       # Single tree build which includes ld.  We want to prefer it
+Index: gcc/exec-tool.in
+===================================================================
+--- gcc/exec-tool.in   (revision 175346)
++++ gcc/exec-tool.in   (working copy)
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+-# Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc.
++# Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
+ # This file is part of GCC.
+ # GCC is free software; you can redistribute it and/or modify
+@@ -21,11 +21,13 @@
+ ORIGINAL_AS_FOR_TARGET="@ORIGINAL_AS_FOR_TARGET@"
+ ORIGINAL_LD_FOR_TARGET="@ORIGINAL_LD_FOR_TARGET@"
++ORIGINAL_GOLD_FOR_TARGET="@ORIGINAL_GOLD_FOR_TARGET@"
+ ORIGINAL_PLUGIN_LD_FOR_TARGET="@ORIGINAL_PLUGIN_LD_FOR_TARGET@"
+ ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@"
+ exeext=@host_exeext@
+ fast_install=@enable_fast_install@
+ objdir=@objdir@
++version="1.1"
+ invoked=`basename "$0"`
+ id=$invoked
+@@ -36,15 +38,44 @@
+     dir=gas
+     ;;
+   collect-ld)
+-    # when using a linker plugin, gcc will always pass '-plugin' as the
+-    # first or second option to the linker.
+-    if test x"$1" = "x-plugin" || test x"$2" = "x-plugin"; then
+-      original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
+-    else
+-      original=$ORIGINAL_LD_FOR_TARGET
++    prog=ld-new$exeext
++    # Look for the a command line option
++    # specifying the linker to be used.
++    case " $* " in
++      *\ -use-gold\ *)
++        original=$ORIGINAL_GOLD_FOR_TARGET
++      dir=gold
++        ;;
++      *\ -use-ld\ * | *\ -use-ld.bfd\ *)
++        original=$ORIGINAL_LD_FOR_TARGET
++        dir=ld
++        ;;
++      *\ -plugin\ *)
++        original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
++        dir=ld
++      ;;
++      *)
++        original=$ORIGINAL_LD_FOR_TARGET
++        dir=ld
++      ;;
++    esac
++
++    # If the selected linker has not been configured then
++    # try using the others, in the order PLUGIN-LD, LD, GOLD.
++    if test x"$original" = x; then
++      if test x"$ORIGINAL_PLUGIN_LD_FOR_TARGET" != x; then
++        original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
++        dir=ld
++      elif test x"$ORIGINAL_LD_FOR_TARGET" != x; then
++        original=$ORIGINAL_LD_FOR_TARGET
++        dir=ld
++      elif test x"$ORIGINAL_GOLD_FOR_TARGET" != x; then
++        original=$ORIGINAL_GOLD_FOR_TARGET
++        dir=gold
++      # Otherwise do nothing - the case statement below
++      # will issue an error message for us.
++      fi
+     fi
+-    prog=ld-new$exeext
+-    dir=ld
+     id=ld
+     ;;
+   nm)
+@@ -61,29 +92,58 @@
+     scriptdir=`cd "$tdir" && pwd`
+     if test -x $scriptdir/../$dir/$prog; then
+-      test "$fast_install" = yes || exec $scriptdir/../$dir/$prog ${1+"$@"}
++      if test "$fast_install" = yes; then
++        # If libtool did everything it needs to do, there's a fast path.
++        lt_prog=$scriptdir/../$dir/$objdir/lt-$prog 
+-      # if libtool did everything it needs to do, there's a fast path
+-      lt_prog=$scriptdir/../$dir/$objdir/lt-$prog 
+-      test -x $lt_prog && exec $lt_prog ${1+"$@"}
+-
+-      # libtool has not relinked ld-new yet, but we cannot just use the
+-      # previous stage (because then the relinking would just never happen!).
+-      # So we take extra care to use prev-ld/ld-new *on recursive calls*.
+-      eval LT_RCU="\${LT_RCU_$id}"
+-      test x"$LT_RCU" = x"1" && exec $scriptdir/../prev-$dir/$prog ${1+"$@"}
+-
+-      eval LT_RCU_$id=1
+-      export LT_RCU_$id
+-      $scriptdir/../$dir/$prog ${1+"$@"}
+-      result=$?
+-      exit $result
+-
++      if test -x $lt_prog; then
++        original=$lt_prog
++        else
++          # Libtool has not relinked ld-new yet, but we cannot just use the
++          # previous stage (because then the relinking would just never happen!).
++          # So we take extra care to use prev-ld/ld-new *on recursive calls*.
++          eval LT_RCU="\${LT_RCU_$id}"
++          if test x"$LT_RCU" = x"1"; then
++          original=$scriptdir/../prev-$dir/$prog
++          else
++            eval LT_RCU_$id=1
++            export LT_RCU_$id
++            case " $* " in
++              *\ -v\ *)
++               echo "$invoked $version"
++               echo $scriptdir/../$dir/$prog $*
++               ;;
++            esac
++            $scriptdir/../$dir/$prog ${1+"$@"}
++            result=$?
++            exit $result
++          fi
++        fi
++      else
++      original=$scriptdir/../$dir/$prog
++      fi
+     else
+-      exec $scriptdir/../prev-$dir/$prog ${1+"$@"}
++      original=$scriptdir/../prev-$dir/$prog
+     fi
+     ;;
+-  *)
+-    exec $original ${1+"$@"}
++  "")
++    echo "$invoked: executable not configured"
++    exit 1
+     ;;
+ esac
++
++# If -v has been used then display our version number
++# and then echo the command we are about to invoke.
++case " $* " in
++  *\ -v\ *)
++    echo "$invoked $version"
++    echo $original $*
++    ;;
++esac
++
++if test -x $original; then
++  exec "$original" ${1+"$@"}
++else
++  echo "$invoked: unable to locate executable: $original"
++  exit 1
++fi
+Index: gcc/common.opt
+===================================================================
+--- gcc/common.opt     (revision 175346)
++++ gcc/common.opt     (working copy)
+@@ -2138,6 +2138,9 @@
+ Common Report Var(flag_unwind_tables) Optimization
+ Just generate unwind tables for exception handling
++fuse-ld=
++Common Joined Undocumented
++
+ fuse-linker-plugin
+ Common Undocumented
+Index: gcc/collect2.c
+===================================================================
+--- gcc/collect2.c     (revision 175346)
++++ gcc/collect2.c     (working copy)
+@@ -1075,17 +1075,19 @@
+ int
+ main (int argc, char **argv)
+ {
+-  static const char *const ld_suffix  = "ld";
+-  static const char *const plugin_ld_suffix = PLUGIN_LD;
+-  static const char *const real_ld_suffix = "real-ld";
++  static const char *const ld_suffix       = "ld";
++  static const char *const gold_suffix       = "ld.gold";
++  static const char *const bfd_ld_suffix     = "ld.bfd";
++  static const char *const plugin_ld_suffix  = PLUGIN_LD;
++  static const char *const real_ld_suffix    = "real-ld";
+   static const char *const collect_ld_suffix = "collect-ld";
+-  static const char *const nm_suffix  = "nm";
+-  static const char *const gnm_suffix = "gnm";
++  static const char *const nm_suffix       = "nm";
++  static const char *const gnm_suffix      = "gnm";
+ #ifdef LDD_SUFFIX
+-  static const char *const ldd_suffix = LDD_SUFFIX;
++  static const char *const ldd_suffix      = LDD_SUFFIX;
+ #endif
+-  static const char *const strip_suffix = "strip";
+-  static const char *const gstrip_suffix = "gstrip";
++  static const char *const strip_suffix      = "strip";
++  static const char *const gstrip_suffix     = "gstrip";
+ #ifdef CROSS_DIRECTORY_STRUCTURE
+   /* If we look for a program in the compiler directories, we just use
+@@ -1095,6 +1097,10 @@
+   const char *const full_ld_suffix =
+     concat(target_machine, "-", ld_suffix, NULL);
++  const char *const full_gold_suffix =
++    concat (target_machine, "-", gold_suffix, NULL);
++  const char *const full_bfd_ld_suffix =
++    concat (target_machine, "-", bfd_ld_suffix, NULL);
+   const char *const full_plugin_ld_suffix =
+     concat(target_machine, "-", plugin_ld_suffix, NULL);
+   const char *const full_nm_suffix =
+@@ -1110,15 +1116,17 @@
+   const char *const full_gstrip_suffix =
+     concat (target_machine, "-", gstrip_suffix, NULL);
+ #else
+-  const char *const full_ld_suffix    = ld_suffix;
++  const char *const full_ld_suffix      = ld_suffix;
++  const char *const full_gold_suffix    = gold_suffix;
++  const char *const full_bfd_ld_suffix          = bfd_ld_suffix;
+   const char *const full_plugin_ld_suffix = plugin_ld_suffix;
+-  const char *const full_nm_suffix    = nm_suffix;
+-  const char *const full_gnm_suffix   = gnm_suffix;
++  const char *const full_nm_suffix      = nm_suffix;
++  const char *const full_gnm_suffix     = gnm_suffix;
+ #ifdef LDD_SUFFIX
+-  const char *const full_ldd_suffix   = ldd_suffix;
++  const char *const full_ldd_suffix     = ldd_suffix;
+ #endif
+-  const char *const full_strip_suffix = strip_suffix;
+-  const char *const full_gstrip_suffix        = gstrip_suffix;
++  const char *const full_strip_suffix   = strip_suffix;
++  const char *const full_gstrip_suffix          = gstrip_suffix;
+ #endif /* CROSS_DIRECTORY_STRUCTURE */
+   const char *arg;
+@@ -1132,7 +1140,13 @@
+   const char **c_ptr;
+   char **ld1_argv;
+   const char **ld1;
+-  bool use_plugin = false;
++  enum linker_select
++  {
++    DFLT_LINKER,
++    PLUGIN_LINKER,
++    GOLD_LINKER,
++    BFD_LINKER
++  } selected_linker = DFLT_LINKER;
+   /* The kinds of symbols we will have to consider when scanning the
+      outcome of a first pass link.  This is ALL to start with, then might
+@@ -1209,15 +1223,21 @@
+         else if (! strcmp (argv[i], "-flto-partition=none"))
+         no_partition = true;
+         else if ((! strncmp (argv[i], "-flto=", 6)
+-                || ! strcmp (argv[i], "-flto")) && ! use_plugin)
++                || ! strcmp (argv[i], "-flto"))
++               && selected_linker != PLUGIN_LINKER)
+         lto_mode = LTO_MODE_WHOPR;
+       else if (!strncmp (argv[i], "-fno-lto", 8))
+         lto_mode = LTO_MODE_NONE;
+         else if (! strcmp (argv[i], "-plugin"))
+         {
+-          use_plugin = true;
++          selected_linker =  PLUGIN_LINKER;
+           lto_mode = LTO_MODE_NONE;
+         }
++      else if (! strcmp (argv[i], "-use-gold"))
++        selected_linker = GOLD_LINKER;
++      else if (! strcmp (argv[i], "-use-ld"))
++        selected_linker = BFD_LINKER;
++
+ #ifdef COLLECT_EXPORT_LIST
+       /* since -brtl, -bexport, -b64 are not position dependent
+          also check for them here */
+@@ -1299,36 +1319,109 @@
+   /* Try to discover a valid linker/nm/strip to use.  */
+   /* Maybe we know the right file to use (if not cross).  */
+-  ld_file_name = 0;
++  ld_file_name = NULL;
+ #ifdef DEFAULT_LINKER
+   if (access (DEFAULT_LINKER, X_OK) == 0)
+     ld_file_name = DEFAULT_LINKER;
+-  if (ld_file_name == 0)
++  if (ld_file_name == NULL)
+ #endif
+ #ifdef REAL_LD_FILE_NAME
+   ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
+-  if (ld_file_name == 0)
++  if (ld_file_name == NULL)
+ #endif
+   /* Search the (target-specific) compiler dirs for ld'.  */
+   ld_file_name = find_a_file (&cpath, real_ld_suffix);
+   /* Likewise for `collect-ld'.  */
+-  if (ld_file_name == 0)
++  if (ld_file_name == NULL)
+     ld_file_name = find_a_file (&cpath, collect_ld_suffix);
+   /* Search the compiler directories for `ld'.  We have protection against
+      recursive calls in find_a_file.  */
+-  if (ld_file_name == 0)
+-    ld_file_name = find_a_file (&cpath,
+-                              use_plugin
+-                              ? plugin_ld_suffix
+-                              : ld_suffix);
++  if (ld_file_name == NULL)
++    switch (selected_linker)
++      {
++      default:
++      case DFLT_LINKER:
++      ld_file_name = find_a_file (&cpath, ld_suffix);
++      break;
++      case PLUGIN_LINKER:
++      ld_file_name = find_a_file (&cpath, plugin_ld_suffix);
++      break;
++      case GOLD_LINKER:
++      ld_file_name = find_a_file (&cpath, gold_suffix);
++      break;
++      case BFD_LINKER:
++      ld_file_name = find_a_file (&cpath, bfd_ld_suffix);
++      break;
++      }
+   /* Search the ordinary system bin directories
+      for `ld' (if native linking) or `TARGET-ld' (if cross).  */
+-  if (ld_file_name == 0)
+-    ld_file_name = find_a_file (&path,
+-                              use_plugin
+-                              ? full_plugin_ld_suffix
+-                              : full_ld_suffix);
++  if (ld_file_name == NULL)
++    switch (selected_linker)
++      {
++      default:
++      case DFLT_LINKER:
++      ld_file_name = find_a_file (&path, full_ld_suffix);
++      break;
++      case PLUGIN_LINKER:
++      ld_file_name = find_a_file (&path, full_plugin_ld_suffix);
++      break;
++      case GOLD_LINKER:
++      ld_file_name = find_a_file (&path, full_gold_suffix);
++      break;
++      case BFD_LINKER:
++      ld_file_name = find_a_file (&path, full_bfd_ld_suffix);
++      break;
++      }
++  /* If we failed to find a plugin-capable linker, try the ordinary one.  */
++  if (ld_file_name == NULL && selected_linker == PLUGIN_LINKER)
++    ld_file_name = find_a_file (&cpath, ld_suffix);
++  if ((vflag || debug) && ld_file_name == NULL)
++    {
++      struct prefix_list * p;
++      const char * s;
++
++      notice ("collect2: warning: unable to find linker.\n");
++
++#ifdef DEFAULT_LINKER
++      notice (" Searched for this absolute executable:\n");
++      notice (" %s\n", DEFAULT_LINKER);
++#endif
++
++      notice (" Searched in these paths:\n");
++      for (p = cpath.plist; p != NULL; p = p->next)
++      notice ("  %s\n", p->prefix);
++      notice (" For these executables:\n");
++      notice ("  %s\n", real_ld_suffix);
++      notice ("  %s\n", collect_ld_suffix);
++      switch (selected_linker)
++      {
++      default:
++      case DFLT_LINKER:    s = ld_suffix; break;
++      case PLUGIN_LINKER:  s = plugin_ld_suffix; break;
++      case GOLD_LINKER:    s = gold_suffix; break;
++      case BFD_LINKER:     s = bfd_ld_suffix; break;
++      }
++      notice ("  %s\n", s);
++
++      notice (" And searched in these paths:\n");
++      for (p = path.plist; p != NULL; p = p->next)
++      notice ("  %s\n", p->prefix);
++      notice (" For these executables:\n");
++#ifdef REAL_LD_FILE_NAME
++      notice (" %s\n", REAL_LD_FILE_NAME);
++#endif
++      switch (selected_linker)
++      {
++      default:
++      case DFLT_LINKER:    s = full_ld_suffix; break;
++      case PLUGIN_LINKER:  s = full_plugin_ld_suffix; break;
++      case GOLD_LINKER:    s = full_gold_suffix; break;
++      case BFD_LINKER:     s = full_bfd_ld_suffix; break;
++      }
++      notice ("  %s\n", s);
++    }
++
+ #ifdef REAL_NM_FILE_NAME
+   nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
+   if (nm_file_name == 0)
diff --git a/libffi.pc.in b/libffi.pc.in
new file mode 100644 (file)
index 0000000..fec9786
--- /dev/null
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@gcclibdir@/include
+
+Name: libffi
+Description: Library supporting Foreign Function Interfaces
+Version: 3.0.9
+Libs: -L${libdir} -lffi
+Cflags: -I${includedir}