From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14781 invoked by alias); 1 Nov 2012 22:54:49 -0000 Received: (qmail 14562 invoked by uid 22791); 1 Nov 2012 22:54:48 -0000 X-SWARE-Spam-Status: No, hits=-3.8 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,TW_CP,TW_GX X-Spam-Check-By: sourceware.org Received: from e3.ny.us.ibm.com (HELO e3.ny.us.ibm.com) (32.97.182.143) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 01 Nov 2012 22:54:39 +0000 Received: from /spool/local by e3.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 1 Nov 2012 18:15:01 -0400 Received: from d01dlp02.pok.ibm.com (9.56.250.167) by e3.ny.us.ibm.com (192.168.1.103) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 1 Nov 2012 18:14:53 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 365DDD102AC for ; Thu, 1 Nov 2012 17:17:32 -0400 (EDT) Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id qA1LHVdl319020 for ; Thu, 1 Nov 2012 17:17:31 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id qA1LHV0w018905 for ; Thu, 1 Nov 2012 17:17:31 -0400 Received: from ibm-tiger.the-meissners.org ([9.33.48.180]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id qA1LHUZb018756; Thu, 1 Nov 2012 17:17:30 -0400 Received: by ibm-tiger.the-meissners.org (Postfix, from userid 500) id DF0CD41D35; Thu, 1 Nov 2012 17:17:27 -0400 (EDT) Date: Thu, 01 Nov 2012 22:54:00 -0000 From: Michael Meissner To: gcc-patches@gcc.gnu.org, dje.gcc@gmail.com Subject: [PATCH] New configuration options to enable additional executable/startfile/shared library prefixes Message-ID: <20121101211727.GA7077@ibm-tiger.the-meissners.org> Mail-Followup-To: Michael Meissner , gcc-patches@gcc.gnu.org, dje.gcc@gmail.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="8t9RHnE3ZwKMSgU+" Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-12-10) X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12110122-8974-0000-0000-000010746164 X-IBM-ISS-SpamDetectors: X-IBM-ISS-DetailInfo: BY=3.00000294; HX=3.00000198; KW=3.00000007; PH=3.00000001; SC=3.00000008; SDB=6.00187590; UDB=6.00042496; UTC=2012-11-01 22:15:00 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-11/txt/msg00144.txt.bz2 --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 5681 I may have submitted this shortly before the Caudren, and it got lost. This patch adds 4 additional configuration switches, that allow the person building the compiler to add additional prefixes to search for additional executables and startfiles. If the backend has the appropriate tweaks installed, it will also add additional prefixes to search for the dynamic linker. At the moment, only the PowerPC Linux port has the modifications. It is fairly easy to modify other targets if desired. The motivation for this comes from the IBM Advance Toolchain (AT), which runs on PowerPC Linux 64-bit system running on IBM server class machines (power4 through power7). AT provides its own version of the standard libraries and its own dynamic linker. Unlike a cross compiler environment where you want to use --sysroot to not reference any of the host libraries, a release compiler like this wants to be able to use the system libraries and include files if it doesn't provide for them in the release. The released version of the AT has the sources modified so that it uses the pathnames for the release instead of the standard library and executable pathnames. When we are doing development, it would be convenient to have the compilers that we build target the AT directly without having to use the appropriate linker/include options to use the AT executables, libraries, and dynamic linker. I have built compilers without these patches, with the patches but not adding the configuration options, and with these patches using the configuration options. The compilers all bootstrapped. In running the regression suite there are two differences when the option is used: gcc.dg/cproj-fails-with-broken-glibc.c fails on SLES 11SP1, but works fine when linked with the AT 6.0 libraries, which is expected, since the AT library is based on a newer baseline thatn Sles 11SP1. gfortran.dg/bessel_6.f90 fails when using the Advance Toolchain 6.0 libraries, due to the bessel jn function returning slightly differenct values, which causes the test to fail. If I use the Advance Toolchain 5.0 library, it works fine. I have entered the bug into AT bugzilla. Both of these errors show that when the options are used, it does in fact use the alternative library instead of the system libraries. I have broken these patches into 2 attachments. The first attachment (gcc-power7.patch369c) are the machine independent changes. The second attachment (gcc-power7.patch369d) are just the powerpc specific changes. Are these patches ok to install? 2012-11-01 Michael Meissner * configure.ac (--with-extra-prefix=): Add configure time switches to add addition prefix directories for the compiler to search for extra executables, startfiles, and directories to add to the list of shared library locations. (--with-extra-exec-prefix=): Likewise. (--with-extra-startfile-prefix=): Likewise. (--with-extra-rpath-prefix=): Likewise. * configure: Regenerate. * doc/install.texi (--with-extra-prefix=): Document new configure switches. (--with-extra-exec-prefix=): Likewise. (--with-extra-startfile-prefix=): Likewise. (--with-extra-rpath-prefix=): Likewise. * gcc.c (LINK_RPATH_DIRS_SPEC): Add support for configuration time additional executable, startfile, and shared library location prefixes. Add %find-dynamic-linker(), %extra-rpath-dirs(), %extra-cpu-dirs() as spec functions. (LINK_COMMAND_SPEC): Likewise. (CONFIGURE_STARTFILE_PREFIX): Likewise. (configure_startfile_prefix): Likewise. (configure_exec_prefix): Likewise. (static_spec_functions): Likewise. (IS_STD_DIR): Likewise. (config_rpath): Likewise. (build_rpath_or_cpu_dirs): Likewise. (extra_rpath_dirs_spec_function): Likewsie. (extra_cpu_dirs_spec_function): Likewise. (find_dynamic_linker_spec_function): Likewise. (add_multiple_prefix): New function that is like add_prefix, but splits the prefix at PATH_SEPARATOR. (process_command): Simplify processing COMPILER_PATH, LPATH, and LIBRARY_PATH_ENV environment variables by using the function add_multiple_prefix to do the splitting of the separate prefixes. Add support for the configuration switch to add new executable, startfile, and shared library prefixes. * gcc.h (extra_cpu_dirs_spec_function): Add declaration. * config.in (CONFIGURE_EXEC_PREFIX): Add defines for the configure switches to add executable, startfile, and shared library configuration directories. (CONFIGURE_STARTFILE_PREFIX): Likewise. (CONFIGURE_RPATH_PREFIX): Likewise. * config/rs6000/x-rs6000 (driver-rs6000.o): Add $(GCC_H) dependency. * config/rs6000/linux64.h (GLIBC_DYNAMIC_LINKER32): If --with-extra-startfile-prefix or --with-extra-prefix was used, use %find-dynamic-linker() to find the dynamic linker in the startfile prefixes. (GLIBC_DYNAMIC_LINKER64): Likewise. (LINUX_EXTRA_STATIC_LIBDIRS64): Likewise. (LINK_OS_LINUX_SPEC32): Likewise. (LINK_OS_LINUX_SPEC64): Likewise. * config/rs6000/rs6000.h (EXTRA_SPEC_FUNCTIONS): Likewise. (LOCAL_CPU_EXTR_SPEC_FUNCTIONS): Likewise. * config/rs6000/sysv4.h (GLIBC_DYNAMIC_LINKER): Likewise. (LINUX_EXTRA_STATIC_LIBDIRS32): Likewise. (LINK_OS_LINUX_SPEC): Likewise. (rs6000_extra_static_libdirs): Likewise. (SUBTARGET_EXTRA_SPEC_FUNCTIONS): Likewise. * config/rs6000/driver-rs6000.c (toplevel): Include gcc.h. (rs6000_extra_static_libdirs): If we have extra configure startfile prefixes, look for a machine specific file as a subdirectory in the startfile prefixes if the user used -mcpu=. -- Michael Meissner, IBM 5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA meissner@linux.vnet.ibm.com fax +1 (978) 399-6899 --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="gcc-power7.patch369c" Content-length: 23682 Index: gcc/doc/install.texi =================================================================== --- gcc/doc/install.texi (revision 193063) +++ gcc/doc/install.texi (working copy) @@ -762,6 +762,44 @@ from the full GCC manuals, which are pro are derived by an automatic conversion process from parts of the full manual.) +@item --with-extra-prefix=@var{prefix} +Specify an additional prefix for finding executables, libraries, and +startfiles when the compiler is run. By default no extra +prefixes are used. This option sets the options +@option{--with-extra-exec-prefix=}, +@option{--with-extra-startfiles-prefix=}, +and @option{--with-extra-rpath-prefix=} if they are not specified. + +@item --with-extra-exec-prefix=@var{prefixes} +Specify additional prefixes for finding executables when the compiler +is run. Each prefix is separated by the standard path sepator +(usually colon, @option{:}). By default no extra prefixes are used. + +@item --with-extra-startfile-prefix=@var{prefixes} +Specify additional prefixes for finding libraries, and startfiles when +the compiler is run. Each prefix is separated by the standard path +sepator (usually colon, @option{:}). By default no extra prefixes are +used. + +On powerpc64-linux systems, the dynamic linker will be searched for in +the directories specified by the prefixed, that is used instead of the +standard system dynamic linker. + +In addition on powerpc64-linux systems, if the user used static +linking, as well as the @option{-mcpu=} option, the linker will be +told to search in appropriate directories for libraries that are built +for that particular machine. If dynamic linking is used, these cpu +tuned libraries will not be searched, since the dynamic linker will +load the appropriate cpu tuned library, based on the system that is +executing the code. + +@item --with-extra-rpath-prefix=@var{prefixes} +Specify additional directories for finding shared libraries when +the compiler is run. Each prefix is separated by the standard path +sepator (usually colon, @option{:}). By default no extra prefixes are +used. If this option is used, each of the directories if they exist +will be specified to the linker via the @option{-rpath=} option. + @item --with-gxx-include-dir=@var{dirname} Specify the installation directory for G++ header files. The default depends Index: gcc/configure =================================================================== --- gcc/configure (revision 193063) +++ gcc/configure (working copy) @@ -893,6 +893,10 @@ with_multilib_list enable_rpath with_libiconv_prefix enable_sjlj_exceptions +with_extra_prefix +with_extra_exec_prefix +with_extra_startfile_prefix +with_extra_rpath_prefix enable_secureplt enable_leading_mingw64_underscores enable_cld @@ -1659,6 +1663,18 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-extra-prefix={prefixes} + Add extra prefixes to the list of locations to + search for all files + --with-extra-exec-prefix={prefixes} + Add extra prefixes to the list of locations to + search for executables + --with-extra-startfile-prefix={prefix} + Add extra prefixes to the list of locations to + search for startfiles + --with-extra-rpath-prefix={prefixes} + Specify prefixes to pass to the linker via + -rpath=dir to locate shared libraries --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] @@ -11322,6 +11338,78 @@ case "$LIBINTL" in *$LIBICONV*) LIBICONV= ;; esac + +# Check whether --with-extra-prefix was given. +if test "${with_extra_prefix+set}" = set; then : + withval=$with_extra_prefix; EXTRA_PREFIX="$withval" +else + EXTRA_PREFIX='' +fi + + + +# Check whether --with-extra-exec-prefix was given. +if test "${with_extra_exec_prefix+set}" = set; then : + withval=$with_extra_exec_prefix; EXTRA_EXEC_PREFIX="$withval" +else + if test x"${EXTRA_PREFIX}" != x; then + EXTRA_EXEC_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/bin:/g'`/bin" + else + EXTRA_EXEC_PREFIX="" + fi +fi + + +if test x"${EXTRA_EXEC_PREFIX}" != x; then + +cat >>confdefs.h <<_ACEOF +#define CONFIGURE_EXEC_PREFIX "$EXTRA_EXEC_PREFIX" +_ACEOF + +fi + + +# Check whether --with-extra-startfile-prefix was given. +if test "${with_extra_startfile_prefix+set}" = set; then : + withval=$with_extra_startfile_prefix; EXTRA_STARTFILE_PREFIX="$withval" +else + if test x"${EXTRA_PREFIX}" != x; then + EXTRA_STARTFILE_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib" + else + EXTRA_STARTFILE_PREFIX="" + fi +fi + + +if test x"${EXTRA_STARTFILE_PREFIX}" != x; then + +cat >>confdefs.h <<_ACEOF +#define CONFIGURE_STARTFILE_PREFIX "$EXTRA_STARTFILE_PREFIX" +_ACEOF + +fi + + +# Check whether --with-extra-rpath-prefix was given. +if test "${with_extra_rpath_prefix+set}" = set; then : + withval=$with_extra_rpath_prefix; EXTRA_RPATH_PREFIX="$withval" +else + if test x"${EXTRA_PREFIX}" != x; then + EXTRA_RPATH_PREFIX="${prefix}/lib:`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib" + else + EXTRA_RPATH_PREFIX="" + fi +fi + + +if test x"${EXTRA_RPATH_PREFIX}" != x; then + +cat >>confdefs.h <<_ACEOF +#define CONFIGURE_RPATH_PREFIX "$EXTRA_RPATH_PREFIX" +_ACEOF + +fi + # Check whether --enable-secureplt was given. if test "${enable_secureplt+set}" = set; then : enableval=$enable_secureplt; Index: gcc/gcc.c =================================================================== --- gcc/gcc.c (revision 193063) +++ gcc/gcc.c (working copy) @@ -202,6 +202,8 @@ static int access_check (const char *, i static char *find_a_file (const struct path_prefix *, const char *, int, bool); static void add_prefix (struct path_prefix *, const char *, const char *, int, int, int); +static void add_multiple_prefix (struct path_prefix *, const char *, + const char *, int, int, int); static void add_sysrooted_prefix (struct path_prefix *, const char *, const char *, int, int, int); static char *skip_whitespace (char *); @@ -261,12 +263,15 @@ static const char *remove_outfile_spec_f static const char *version_compare_spec_function (int, const char **); static const char *include_spec_function (int, const char **); static const char *find_file_spec_function (int, const char **); +static const char *find_dynamic_linker_spec_function (int, const char **); static const char *find_plugindir_spec_function (int, const char **); static const char *print_asm_header_spec_function (int, const char **); static const char *compare_debug_dump_opt_spec_function (int, const char **); static const char *compare_debug_self_opt_spec_function (int, const char **); static const char *compare_debug_auxbase_opt_spec_function (int, const char **); static const char *pass_through_libs_spec_func (int, const char **); +static const char *extra_rpath_dirs_spec_function (int, const char **); +const char *extra_cpu_dirs_spec_function (int, const char **); /* The Specs Language @@ -656,6 +661,16 @@ proper position among the other output f #endif +#ifndef LINK_RPATH_DIRS_SPEC +#ifdef CONFIGURE_RPATH_PREFIX +/* Add extra -rpath= options if configured. */ +#define LINK_RPATH_DIRS_SPEC \ + "%{!nostdlib:%{!nodefaultlibs:%{!static: %:extra-rpath-dirs()}}}" +#else +#define LINK_RPATH_DIRS_SPEC +#endif +#endif + /* -u* was put back because both BSD and SysV seem to support it. */ /* %{static:} simply prevents an error message if the target machine doesn't handle -static. */ @@ -669,6 +684,7 @@ proper position among the other output f #define LINK_COMMAND_SPEC "\ %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker) " \ + LINK_RPATH_DIRS_SPEC \ LINK_PLUGIN_SPEC \ "%{flto|flto=*:% option. `dir' is found through find_file, that is the -print-file-name gcc program option. */ @@ -8380,3 +8379,208 @@ pass_through_libs_spec_func (int argc, c } return prepended; } + +#define IS_STD_DIR(PATH,STD) (strncmp (PATH, STD, sizeof (STD)-1) == 0) + +#ifdef CONFIGURE_RPATH_PREFIX + +static const char config_rpath[] = CONFIGURE_RPATH_PREFIX; + +/* Common code for extra_rpath_dirs_spec_function and + extra_cpu_dirs_spec_function to build up a list of -rpath= or -L + options, based on the extra rpath directories that were configured in. */ + +static char * +build_rpath_or_cpu_dirs (const char *rpath_dirs, + const char *prefix, + const char *subdir) +{ + char *ret = NULL; + char *tmpstr, *endp, *prev_dir; + size_t rpath_len = strlen (rpath_dirs); + size_t subdir_len = (subdir) ? strlen (subdir) : 0; + size_t mlib_len = (multilib_os_dir) ? strlen (multilib_os_dir) : 0; + bool mlib_updir; + size_t i; + + mlib_updir = (DIR_SEPARATOR == '/' + && mlib_len > sizeof ("../") - 1 + && multilib_os_dir[0] == '.' + && multilib_os_dir[1] == '.' + && multilib_os_dir[2] == '/'); + + endp = tmpstr = XALLOCAVEC (char, rpath_len + subdir_len + mlib_len + 4); + prev_dir = NULL; + for (i = 0; i <= rpath_len; i++) + { + int ch = rpath_dirs[i]; + if (ch != PATH_SEPARATOR && ch != '\0') + { + *endp++ = ch; + if (ch == DIR_SEPARATOR) + prev_dir = endp; + } + else if (endp > tmpstr) + { + /* Add current multlib directory. Convert /lib/../lib64 into + /lib64. */ + if (mlib_len > 0) + { + if (mlib_updir && prev_dir) + { + memcpy (prev_dir, multilib_os_dir + 3, mlib_len - 3); + endp = prev_dir + mlib_len - 3; + } + else + { + *endp = DIR_SEPARATOR; + memcpy (endp+1, multilib_os_dir, mlib_len); + endp += mlib_len + 1; + } + } + + /* Look for machine specific subdir? */ + if (subdir) + { + *endp = DIR_SEPARATOR; + memcpy (endp+1, subdir, subdir_len); + endp += subdir_len + 1; + } + + endp[0] = DIR_SEPARATOR; + endp[1] = '.'; + endp[2] = '\0'; + + if (is_directory (tmpstr, false)) + { + *endp = '\0'; + if (ret) + ret = reconcat (ret, ret, " ", prefix, tmpstr, NULL); + else + ret = concat (prefix, tmpstr, NULL); + } + + endp = tmpstr; + } + } + + return ret; +} + +/* %:extra-rpath-dirs spec function. If we have alternate rpath directories + (install lib directory + alternate startfile prefix directories), build a + string with all of the directories that are found with appropriate -rpath + options for the linker. If the LD_RUN_PATH environment variable is + specified, include this into the -rpath arguments, since LD_RUN_PATH is + only used if -rpath is not specified. */ + +static const char * +extra_rpath_dirs_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED) +{ + static const char path_sep[2] = { PATH_SEPARATOR, '\0' }; + const char *ld_run_path = getenv ("LD_RUN_PATH"); + const char *ret; + + if (argc != 0) + abort (); + + if (ld_run_path) + { + char *new_rpath = concat (config_rpath, path_sep, ld_run_path, NULL); + ret = build_rpath_or_cpu_dirs (new_rpath, "-rpath=", NULL); + free (new_rpath); + } + else + ret = build_rpath_or_cpu_dirs (config_rpath, "-rpath=", NULL); + + return ret; +} + +/* %:extra-cpu-dirs spec function. If we have alternate rpath directories, + search them to see if there are subdirectories that hold the static + libraries built for a particular machines, and return appropriate -L + to those directories. */ + +const char * +extra_cpu_dirs_spec_function (int argc, const char **argv) +{ + if (argc != 1) + abort (); + + return build_rpath_or_cpu_dirs (config_rpath, "-L", argv[0]); +} + +/* %:find-dynamic-linker spec function. Find the dynamic linker if we have + extra search paths configured. */ + +static const char * +find_dynamic_linker_spec_function (int argc, const char **argv) +{ + const char *file; + char *tmpstr; + char *endp; + char *prev_dir; + size_t len; + size_t i; + int ch; + + if (argc < 1) + abort (); + + file = argv[0]; + len = strlen (file); + gcc_assert (file[0] == DIR_SEPARATOR); + + endp = tmpstr = XALLOCAVEC (char, ARRAY_SIZE (config_rpath) + len + 1); + prev_dir = NULL; + for (i = 0; i <= ARRAY_SIZE (config_rpath); i++) + { + ch = config_rpath[i]; + if (ch != PATH_SEPARATOR && ch != '\0') + { + if (ch == DIR_SEPARATOR) + prev_dir = endp; + + *endp++ = ch; + } + else if (endp > tmpstr) + { + *endp = '\0'; + if (prev_dir && strncmp (prev_dir, "/lib", sizeof ("/lib")-1) == 0) + endp = prev_dir; + memcpy (endp, file, len); + endp[len] = '\0'; + if (access (tmpstr, X_OK) == 0) + return xstrdup (tmpstr); + + endp = tmpstr; + } + } + + return xstrdup (file); +} + +#else +const char * +extra_rpath_dirs_spec_function (int argc ATTRIBUTE_UNUSED, + const char **argv ATTRIBUTE_UNUSED) +{ + return NULL; +} + +const char * +extra_cpu_dirs_spec_function (int argc ATTRIBUTE_UNUSED, + const char **argv ATTRIBUTE_UNUSED) +{ + return NULL; +} + +static const char * +find_dynamic_linker_spec_function (int argc, const char **argv) +{ + if (argc != 1) + abort (); + + return xstrdup (argv[0]); +} +#endif Index: gcc/gcc.h =================================================================== --- gcc/gcc.h (revision 193063) +++ gcc/gcc.h (working copy) @@ -37,6 +37,7 @@ extern int do_spec (const char *); extern void record_temp_file (const char *, int, int); extern void pfatal_with_name (const char *) ATTRIBUTE_NORETURN; extern void set_input (const char *); +extern const char *extra_cpu_dirs_spec_function (int, const char **); /* Spec files linked with gcc.c must provide definitions for these. */ Index: gcc/config.in =================================================================== --- gcc/config.in (revision 193063) +++ gcc/config.in (working copy) @@ -2035,3 +2035,20 @@ #undef vfork #endif + +/* Define extra executable prefixes at configure time. */ +#ifndef USED_FOR_TARGET +#undef CONFIGURE_EXEC_PREFIX +#endif + + +/* Define extra startfile prefixes at configure time. */ +#ifndef USED_FOR_TARGET +#undef CONFIGURE_STARTFILE_PREFIX +#endif + + +/* Define extra rpath prefixes at configure time. */ +#ifndef USED_FOR_TARGET +#undef CONFIGURE_RPATH_PREFIX +#endif Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 193063) +++ gcc/configure.ac (working copy) @@ -1584,6 +1584,57 @@ case "$LIBINTL" in *$LIBICONV*) LIBICONV= ;; esac +AC_ARG_WITH([extra-prefix], +[AC_HELP_STRING([--with-extra-prefix={prefixes}], + [Add extra prefixes to the list of locations to search for all files])], + [EXTRA_PREFIX="$withval"], + [EXTRA_PREFIX='']) + +AC_ARG_WITH([extra-exec-prefix], +[AC_HELP_STRING([--with-extra-exec-prefix={prefixes}], + [Add extra prefixes to the list of locations to search for executables])], + [EXTRA_EXEC_PREFIX="$withval"], + [if test x"${EXTRA_PREFIX}" != x; then + EXTRA_EXEC_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/bin:/g'`/bin" + else + EXTRA_EXEC_PREFIX="" + fi]) + +if test x"${EXTRA_EXEC_PREFIX}" != x; then + AC_DEFINE_UNQUOTED(CONFIGURE_EXEC_PREFIX, "$EXTRA_EXEC_PREFIX", + [Extra executable prefixes]) +fi + +AC_ARG_WITH([extra-startfile-prefix], +[AC_HELP_STRING([--with-extra-startfile-prefix={prefix}], + [Add extra prefixes to the list of locations to search for startfiles])], + [EXTRA_STARTFILE_PREFIX="$withval"], + [if test x"${EXTRA_PREFIX}" != x; then + EXTRA_STARTFILE_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib" + else + EXTRA_STARTFILE_PREFIX="" + fi]) + +if test x"${EXTRA_STARTFILE_PREFIX}" != x; then + AC_DEFINE_UNQUOTED(CONFIGURE_STARTFILE_PREFIX, "$EXTRA_STARTFILE_PREFIX", + [Extra startfile prefix]) +fi + +AC_ARG_WITH([extra-rpath-prefix], +[AC_HELP_STRING([--with-extra-rpath-prefix={prefixes}], + [Specify prefixes to pass to the linker via -rpath=dir to locate shared libraries])], + [EXTRA_RPATH_PREFIX="$withval"], + [if test x"${EXTRA_PREFIX}" != x; then + EXTRA_RPATH_PREFIX="${prefix}/lib:`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib" + else + EXTRA_RPATH_PREFIX="" + fi]) + +if test x"${EXTRA_RPATH_PREFIX}" != x; then + AC_DEFINE_UNQUOTED(CONFIGURE_RPATH_PREFIX, "$EXTRA_RPATH_PREFIX", + [Extra rpath prefix]) +fi + AC_ARG_ENABLE(secureplt, [AS_HELP_STRING([--enable-secureplt], [enable -msecure-plt by default for PowerPC])], --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="gcc-power7.patch369d" Content-length: 7599 Index: gcc/config/rs6000/x-rs6000 =================================================================== --- gcc/config/rs6000/x-rs6000 (revision 193063) +++ gcc/config/rs6000/x-rs6000 (working copy) @@ -1,3 +1,3 @@ driver-rs6000.o : $(srcdir)/config/rs6000/driver-rs6000.c \ - $(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h + $(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h $(GCC_H) $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 193063) +++ gcc/config/rs6000/linux64.h (working copy) @@ -1,7 +1,7 @@ /* Definitions of target machine for GNU compiler, for 64 bit PowerPC linux. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011 Free Software Foundation, Inc. + 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -361,8 +361,14 @@ extern int dot_symbols; #undef LINK_OS_DEFAULT_SPEC #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" +#ifdef CONFIGURE_STARTFILE_PREFIX +#define GLIBC_DYNAMIC_LINKER32 "%:find-dynamic-linker(/lib/ld.so.1)" +#define GLIBC_DYNAMIC_LINKER64 "%:find-dynamic-linker(/lib64/ld64.so.1)" +#else #define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1" +#endif + #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0" #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0" #if DEFAULT_LIBC == LIBC_UCLIBC @@ -372,17 +378,39 @@ extern int dot_symbols; #else #error "Unsupported DEFAULT_LIBC" #endif + #define GNU_USER_DYNAMIC_LINKER32 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32) #define GNU_USER_DYNAMIC_LINKER64 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) +#ifdef CONFIGURE_STARTFILE_PREFIX +#ifdef HAVE_LOCAL_CPU_DETECT +#define LINUX_EXTRA_STATIC_LIBDIRS64 \ +"%{static: \ +%{mcpu=native: %:linux_extra_static_libdirs(%:local_cpu_detect(cpu))} \ +%{!mcpu=native: %{mcpu=*: %:linux_extra_static_libdirs(%{mcpu=*}) }}} " + +#else +#define LINUX_EXTRA_STATIC_LIBDIRS64 \ +"%{static: \ +%{mcpu=: %:linux_extra_static_libdirs(%{mcpu=*}) }} " +#endif + +#else +#define LINUX_EXTRA_STATIC_LIBDIRS64 +#endif + -#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \ +#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux " \ +LINUX_EXTRA_STATIC_LIBDIRS32 \ +"%{!shared: %{!static: \ %{rdynamic:-export-dynamic} \ -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}}" -#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \ +#define LINK_OS_LINUX_SPEC64 "-m elf64ppc " \ +LINUX_EXTRA_STATIC_LIBDIRS64 \ +"%{!shared: %{!static: \ %{rdynamic:-export-dynamic} \ -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}}" Index: gcc/config/rs6000/rs6000.h =================================================================== --- gcc/config/rs6000/rs6000.h (revision 193063) +++ gcc/config/rs6000/rs6000.h (working copy) @@ -193,15 +193,21 @@ #if defined(__powerpc__) || defined(__POWERPC__) || defined(_AIX) /* In driver-rs6000.c. */ extern const char *host_detect_local_cpu (int argc, const char **argv); -#define EXTRA_SPEC_FUNCTIONS \ +#define LOCAL_CPU_EXTRA_SPEC_FUNCTIONS \ { "local_cpu_detect", host_detect_local_cpu }, #define HAVE_LOCAL_CPU_DETECT #define ASM_CPU_NATIVE_SPEC "%:local_cpu_detect(asm)" #else #define ASM_CPU_NATIVE_SPEC "%(asm_default)" +#define LOCAL_CPU_EXTR_SPEC_FUNCTIONS #endif +#define SUBTARGET_EXTRA_SPEC_FUNCTIONS +#define EXTRA_SPEC_FUNCTIONS \ + SUBTARGET_EXTRA_SPEC_FUNCTIONS \ + LOCAL_CPU_EXTRA_SPEC_FUNCTIONS + #ifndef CC1_CPU_SPEC #ifdef HAVE_LOCAL_CPU_DETECT #define CC1_CPU_SPEC \ Index: gcc/config/rs6000/driver-rs6000.c =================================================================== --- gcc/config/rs6000/driver-rs6000.c (revision 193063) +++ gcc/config/rs6000/driver-rs6000.c (working copy) @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. #include "coretypes.h" #include "tm.h" #include +#include "gcc.h" #ifdef _AIX # include @@ -524,3 +525,32 @@ host_detect_local_cpu (int argc, const c #endif /* GCC_VERSION */ + +#ifdef CONFIGURE_STARTFILE_PREFIX +/* Add -L for all of the machine dependent directories found in the extra rpath + directories. We don't need to do this for dynamic links, since the dynamic + linker will pick up the right library based on the machine that is currently + running. */ + +const char * +rs6000_extra_static_libdirs (int argc, const char **argv) +{ + const char *new_argv[2]; + const char *cpu; + + if (argc == 1 && strncmp (argv[0], "mcpu=", sizeof ("-mcpu=")-1) == 0) + cpu = argv[0] + sizeof ("-mcpu=") - 1; + + else if (argc == 2 && strcmp (argv[0], "-") == 0 + && strncmp (argv[1], "mcpu=", sizeof ("mcpu=")-1) == 0) + cpu = argv[1] + sizeof ("mcpu=") - 1; + + else + abort (); + + new_argv[0] = cpu; + new_argv[1] = NULL; + return extra_cpu_dirs_spec_function (1, new_argv); +} + +#endif /* !CONFIGURE_STARTFILE_PREFIX */ Index: gcc/config/rs6000/sysv4.h =================================================================== --- gcc/config/rs6000/sysv4.h (revision 193063) +++ gcc/config/rs6000/sysv4.h (working copy) @@ -787,7 +787,12 @@ extern int fixuplabelno; #define LINK_START_LINUX_SPEC "" +#ifdef CONFIGURE_STARTFILE_PREFIX +#define GLIBC_DYNAMIC_LINKER "%:find-dynamic-linker(/lib/ld.so.1)" +#else #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" +#endif + #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" #if DEFAULT_LIBC == LIBC_UCLIBC #define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}" @@ -796,10 +801,30 @@ extern int fixuplabelno; #else #error "Unsupported DEFAULT_LIBC" #endif + #define GNU_USER_DYNAMIC_LINKER \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) -#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \ +#ifdef CONFIGURE_STARTFILE_PREFIX +#ifdef HAVE_LOCAL_CPU_DETECT +#define LINUX_EXTRA_STATIC_LIBDIRS32 \ +"%{static: \ +%{mcpu=native: %:linux_extra_static_libdirs(%:local_cpu_detect(cpu))} \ +%{!mcpu=native: %{mcpu=*: %:linux_extra_static_libdirs(%{mcpu=*}) }}} " + +#else +#define LINUX_EXTRA_STATIC_LIBDIRS32 \ +"%{static: \ +%{mcpu=: %:linux_extra_static_libdirs(%{mcpu=*}) }} " +#endif + +#else +#define LINUX_EXTRA_STATIC_LIBDIRS32 "" +#endif + +#define LINK_OS_LINUX_SPEC "-m elf32ppclinux " \ +LINUX_EXTRA_STATIC_LIBDIRS32 \ +"%{!shared: %{!static: \ %{rdynamic:-export-dynamic} \ -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" @@ -865,6 +890,22 @@ ncrtn.o%s" #define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}" #endif +/* If we have additional startfiles, we want to use the dynamic linker from the + directories those startfiles are in. We also want to set the -rpath for + those directories. + + Also if this is a static link, see if we have any processor specific + directories in the extra startfiles directories. We don't have to worry + about dynamic libraries, since the dynamic linker will include them + automatically. */ +#ifdef CONFIGURE_STARTFILE_PREFIX +extern const char *rs6000_extra_static_libdirs (int argc, const char **argv); + +#undef SUBTARGET_EXTRA_SPEC_FUNCTIONS +#define SUBTARGET_EXTRA_SPEC_FUNCTIONS \ + { "linux_extra_static_libdirs", rs6000_extra_static_libdirs }, +#endif + /* Define any extra SPECS that the compiler needs to generate. */ /* Override rs6000.h definition. */ #undef SUBTARGET_EXTRA_SPECS --8t9RHnE3ZwKMSgU+--