summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-19 18:11:42 +0000
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-19 18:11:42 +0000
commitc75e49900f44eab87509cf465539ea48dab31def (patch)
tree9cd489829df0a7b71a7ba27da9b9f1ec45d2f759
parent2a0c73f2467c12226f584db5fc85592011a37155 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/collect2.c30
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/gcc.c43
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);