[Driver] Add support for -fuse-ld=lld

Davide Italiano dccitaliano@gmail.com
Mon Jul 4 04:39:00 GMT 2016


On Thu, Jun 23, 2016 at 9:11 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
> + HJ who wrote the code for the option originally.
>
> On Thu, Jun 23, 2016 at 9:01 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
>> LLVM currently ships with a new ELF linker http://lld.llvm.org/.
>> I experiment a lot with gcc and lld so it would be nice if
>> -fuse-ld=lld is supported (considering the linker is now mature enough
>> to link large C/C++ applications).
>>
>> Also, IMHO, -fuse-ld should be a generic facility which accept other
>> linkers (as long as they follow the convention ld.<arg>), and should
>> also support absolute path, e.g. -fuse-ld=/usr/local/bin/ld.mylinker.
>> Probably outside of the scope of this patch, but I thought worth
>> mentioning.
>>
>> Thanks,
>>

Hi, can anybody take a look?

Thanks,

--
Davide

>> --
>> Davide
>>
>> From 323c23d79c91d7dcee2f29b9ced8c1c00703d346 Mon Sep 17 00:00:00 2001
>> From: Davide Italiano <dccitaliano@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;
>> --
>> 2.5.5



More information about the Gcc-patches mailing list