diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-19 18:11:42 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-19 18:11:42 +0000 |
commit | c75e49900f44eab87509cf465539ea48dab31def (patch) | |
tree | 9cd489829df0a7b71a7ba27da9b9f1ec45d2f759 | |
parent | 2a0c73f2467c12226f584db5fc85592011a37155 (diff) | |
download | gcc-c75e49900f44eab87509cf465539ea48dab31def.tar.gz |
Improve -fuse-ld=[bfd|gold] check
PR driver/59321
* collect2.c (main): Check -fuse-ld=[bfd|gold] when
DEFAULT_LINKER is defined.
* common.opt (fuse-ld=bfd): Add Driver.
(fuse-ld=gold): Likewise.
* gcc.c (use_ld): New variable.
(driver_handle_option): Set use_ld for OPT_fuse_ld_bfd and
OPT_fuse_ld_gold.
(main): Check -fuse-ld=[bfd|gold] for -print-prog-name=ld.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206129 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/collect2.c | 30 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/gcc.c | 43 |
4 files changed, 86 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5729893a655..0b02dd59a56 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2013-12-19 H.J. Lu <hongjiu.lu@intel.com> + + PR driver/59321 + * collect2.c (main): Check -fuse-ld=[bfd|gold] when + DEFAULT_LINKER is defined. + * common.opt (fuse-ld=bfd): Add Driver. + (fuse-ld=gold): Likewise. + * gcc.c (use_ld): New variable. + (driver_handle_option): Set use_ld for OPT_fuse_ld_bfd and + OPT_fuse_ld_gold. + (main): Check -fuse-ld=[bfd|gold] for -print-prog-name=ld. + 2013-12-19 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * Makefile.in (TEXI_GCC_FILES): Add arm-acle-intrinsics.texi. diff --git a/gcc/collect2.c b/gcc/collect2.c index 95f817d307a..1d8ea4f9173 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1121,7 +1121,35 @@ main (int argc, char **argv) /* Maybe we know the right file to use (if not cross). */ ld_file_name = 0; #ifdef DEFAULT_LINKER - if (access (DEFAULT_LINKER, X_OK) == 0) + if (selected_linker == USE_BFD_LD || selected_linker == USE_GOLD_LD) + { + char *linker_name; +# ifdef HOST_EXECUTABLE_SUFFIX + int len = (sizeof (DEFAULT_LINKER) + - sizeof (HOST_EXECUTABLE_SUFFIX)); + linker_name = NULL; + if (len > 0) + { + char *default_linker = xstrdup (DEFAULT_LINKER); + /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains + HOST_EXECUTABLE_SUFFIX. */ + if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX)) + { + default_linker[len] = '\0'; + linker_name = concat (default_linker, + &ld_suffixes[selected_linker][2], + HOST_EXECUTABLE_SUFFIX, NULL); + } + } + if (linker_name == NULL) +# endif + linker_name = concat (DEFAULT_LINKER, + &ld_suffixes[selected_linker][2], + NULL); + if (access (linker_name, X_OK) == 0) + ld_file_name = linker_name; + } + if (ld_file_name == 0 && access (DEFAULT_LINKER, X_OK) == 0) ld_file_name = DEFAULT_LINKER; if (ld_file_name == 0) #endif diff --git a/gcc/common.opt b/gcc/common.opt index ea323fdc9c3..76e4447217d 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2250,11 +2250,11 @@ Common Report Var(flag_unwind_tables) Optimization Just generate unwind tables for exception handling fuse-ld=bfd -Common Negative(fuse-ld=gold) +Common Driver Negative(fuse-ld=gold) Use the bfd linker instead of the default linker fuse-ld=gold -Common Negative(fuse-ld=bfd) +Common Driver Negative(fuse-ld=bfd) Use the gold linker instead of the default linker fuse-linker-plugin diff --git a/gcc/gcc.c b/gcc/gcc.c index b895f226ad0..0866e748cc6 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -105,6 +105,9 @@ static int verbose_only_flag; static int print_subprocess_help; +/* Linker suffix passed to -fuse-ld=... */ +static const char *use_ld; + /* Whether we should report subprocess execution times to a file. */ FILE *report_times_to_file = NULL; @@ -3380,6 +3383,14 @@ driver_handle_option (struct gcc_options *opts, do_save = false; break; + case OPT_fuse_ld_bfd: + use_ld = ".bfd"; + break; + + case OPT_fuse_ld_gold: + use_ld = ".gold"; + break; + case OPT_fcompare_debug_second: compare_debug_second = 1; break; @@ -6708,6 +6719,38 @@ main (int argc, char **argv) if (print_prog_name) { + if (use_ld != NULL && ! strcmp (print_prog_name, "ld")) + { + /* Append USE_LD to to the default linker. */ +#ifdef DEFAULT_LINKER + char *ld; +# ifdef HAVE_HOST_EXECUTABLE_SUFFIX + int len = (sizeof (DEFAULT_LINKER) + - sizeof (HOST_EXECUTABLE_SUFFIX)); + ld = NULL; + if (len > 0) + { + char *default_linker = xstrdup (DEFAULT_LINKER); + /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains + HOST_EXECUTABLE_SUFFIX. */ + if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX)) + { + default_linker[len] = '\0'; + ld = concat (default_linker, use_ld, + HOST_EXECUTABLE_SUFFIX, NULL); + } + } + if (ld == NULL) +# endif + ld = concat (DEFAULT_LINKER, use_ld, NULL); + if (access (ld, X_OK) == 0) + { + printf ("%s\n", ld); + return (0); + } +#endif + print_prog_name = concat (print_prog_name, use_ld, NULL); + } char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0); printf ("%s\n", (newname ? newname : print_prog_name)); return (0); |