Hi, I would like to raise again the question of supporting -fuse-ld=ldd. A patch implementing it was already submitted in https://gcc.gnu.org/ml/gcc-patches/2016-06/msg01722.html by Davide Italiano. This patch still applies correctly to current trunk. I am CC-ing the original author and re-posting it here unchanged for reference.
I think we can consider this patch as relevant despite the goals and licence difference of LLVM vs GNU, based on what was written by Mike Stump in https://gcc.gnu.org/ml/gcc-patches/2016-07/msg00157.html Back then, the technical problem raised by lld was reported as https://bugs.llvm.org/show_bug.cgi?id=28414 now closed. In this bug, every reported problems have been fixed except the last one. H.J. Lu mentions this last problem (lld does not produces symbol versions predecessor relationship while ld.bfd and ld.gold do, which seems to be a decision taken on purpose and advertised as a harmless change) as being one reason against supporting in -fuse-ld=ldd in gcc. Is it still the case today, and if yes, why ? Is there any other reason why -fuse-ld=ldd shall not be supported by gcc ? Cheers, Romain >From 323c23d79c91d7dcee2f29b9ced8c1c00703d346 Mon Sep 17 00:00:00 2001 From: Davide Italiano <dccitali...@gmail.com> Date: Thu, 23 Jun 2016 20:51:53 -0700 Subject: [PATCH] Driver: Add support for -fuse-ld=lld. * collect2.c (main): Support -fuse-ld=lld. * common.opt: Add fuse-ld=lld * doc/invoke.texi: Document -fuse-ld=lld * opts.c: Ignore -fuse-ld=lld --- gcc/collect2.c | 11 ++++++++--- gcc/common.opt | 4 ++++ gcc/doc/invoke.texi | 4 ++++ gcc/opts.c | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index bffac80..6a8387c 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -831,6 +831,7 @@ main (int argc, char **argv) USE_PLUGIN_LD, USE_GOLD_LD, USE_BFD_LD, + USE_LLD_LD, USE_LD_MAX } selected_linker = USE_DEFAULT_LD; static const char *const ld_suffixes[USE_LD_MAX] = @@ -838,7 +839,8 @@ main (int argc, char **argv) "ld", PLUGIN_LD_SUFFIX, "ld.gold", - "ld.bfd" + "ld.bfd", + "ld.lld" }; static const char *const real_ld_suffix = "real-ld"; static const char *const collect_ld_suffix = "collect-ld"; @@ -1004,6 +1006,8 @@ main (int argc, char **argv) selected_linker = USE_BFD_LD; else if (strcmp (argv[i], "-fuse-ld=gold") == 0) selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i], "-fuse-ld=lld") == 0) + selected_linker = USE_LLD_LD; #ifdef COLLECT_EXPORT_LIST /* These flags are position independent, although their order @@ -1093,7 +1097,8 @@ main (int argc, char **argv) /* Maybe we know the right file to use (if not cross). */ ld_file_name = 0; #ifdef DEFAULT_LINKER - if (selected_linker == USE_BFD_LD || selected_linker == USE_GOLD_LD) + if (selected_linker == USE_BFD_LD || selected_linker == USE_GOLD_LD || + selected_linker == USE_LLD_LD) { char *linker_name; # ifdef HOST_EXECUTABLE_SUFFIX @@ -1307,7 +1312,7 @@ main (int argc, char **argv) else if (!use_collect_ld && strncmp (arg, "-fuse-ld=", 9) == 0) { - /* Do not pass -fuse-ld={bfd|gold} to the linker. */ + /* Do not pass -fuse-ld={bfd|gold|lld} to the linker. */ ld1--; ld2--; } diff --git a/gcc/common.opt b/gcc/common.opt index 5d90385..2a95a1f 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2536,6 +2536,10 @@ fuse-ld=gold Common Driver Negative(fuse-ld=bfd) Use the gold linker instead of the default linker. +fuse-ld=lld +Common Driver Negative(fuse-ld=lld) +Use the lld LLVM linker instead of the default linker. + fuse-linker-plugin Common Undocumented Var(flag_use_linker_plugin) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 2c87c53..4b8acff 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -10651,6 +10651,10 @@ Use the @command{bfd} linker instead of the default linker. @opindex fuse-ld=gold Use the @command{gold} linker instead of the default linker. +@item -fuse-ld=lld +@opindex fuse-ld=lld +Use the LLVM @command{lld} linker instead of the default linker. + @cindex Libraries @item -l@var{library} @itemx -l @var{library} diff --git a/gcc/opts.c b/gcc/opts.c index 7406210..f2c86f7 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2178,6 +2178,7 @@ common_handle_option (struct gcc_options *opts, case OPT_fuse_ld_bfd: case OPT_fuse_ld_gold: + case OPT_fuse_ld_lld: case OPT_fuse_linker_plugin: /* No-op. Used by the driver and passed to us because it starts with f.*/ break;