diff mbox

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

Message ID CADob98T6+EFan_M=+vv0gii5SXjYrkfLH9Zd_pfm34-1AHceAQ@mail.gmail.com
State New
Headers show

Commit Message

Davide Italiano June 24, 2016, 4:01 a.m. UTC
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,

--
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(-)

Comments

Davide Italiano June 24, 2016, 4:11 a.m. UTC | #1
+ 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,
>
> --
> 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
Davide Italiano July 4, 2016, 4:38 a.m. UTC | #2
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
H.J. Lu July 4, 2016, 4:12 p.m. UTC | #3
On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
> 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,

lld won't build on Fedora 24/x86-64 with GCC 6:

[ 39%] Building CXX object
tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o
/export/gnu/import/git/llvm/tools/lld/ELF/OutputSections.cpp: In
member function ‘void
lld::elf::GnuHashTableSection<ELFT>::addSymbols(std::vector<std::pair<lld::elf::SymbolBody*,
long unsigned int> >&)’:
/export/gnu/import/git/llvm/tools/lld/ELF/OutputSections.cpp:585:8:
error: inconsistent deduction for ‘auto’: ‘auto’ and then
‘__gnu_cxx::__normal_iterator<std::pair<lld::elf::SymbolBody*, long
unsigned int>*, std::vector<std::pair<lld::elf::SymbolBody*, long
unsigned int> > >’
tools/lld/ELF/CMakeFiles/lldELF.dir/build.make:302: recipe for target
'tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o' failed
gmake[4]: *** [tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o] Error 1

Can you fix it?

H.J.
> --
> 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
H.J. Lu July 4, 2016, 5:08 p.m. UTC | #4
On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
> 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?

lld isn't compatible with GCC:

https://llvm.org/bugs/show_bug.cgi?id=28414


> 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
H.J. Lu July 4, 2016, 5:13 p.m. UTC | #5
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,
>
> --
> 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

Remove blank line between them.

> ---
>  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)

Please make each condition on a separate line starting with ||.

>      {
>        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.
> +

This is wrong.  It should be

fuse-ld=bfd
Common Driver Negative(fuse-ld=gold)
Use the bfd linker instead of the default linker.

fuse-ld=gold
Common Driver Negative(fuse-ld=lld)
Use the gold linker instead of the default linker.

fuse-ld=lld
Common Driver Negative(fuse-ld=bfd)
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
Markus Trippelsdorf July 4, 2016, 7:36 p.m. UTC | #6
On 2016.07.04 at 10:08 -0700, H.J. Lu wrote:
> On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
> > 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.
> >
> > Hi, can anybody take a look?
> 
> lld isn't compatible with GCC:
> 
> https://llvm.org/bugs/show_bug.cgi?id=28414

Besides the technical issues, this also raises the question if it is
right to support lld at all. Because this project was obviously started
to replace the GNU linkers (ld.bfd and gold) in the long run.
So I see no reason why it should be supported in GCC.

(And who needs a buggy new ELF linker anyway?)
Davide Italiano July 4, 2016, 7:43 p.m. UTC | #7
On Mon, Jul 4, 2016 at 12:36 PM, Markus Trippelsdorf
<markus@trippelsdorf.de> wrote:
> On 2016.07.04 at 10:08 -0700, H.J. Lu wrote:
>> On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
>> > 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.
>> >
>> > Hi, can anybody take a look?
>>
>> lld isn't compatible with GCC:
>>
>> https://llvm.org/bugs/show_bug.cgi?id=28414
>
> Besides the technical issues, this also raises the question if it is
> right to support lld at all. Because this project was obviously started
> to replace the GNU linkers (ld.bfd and gold) in the long run.
> So I see no reason why it should be supported in GCC.
>
> (And who needs a buggy new ELF linker anyway?)


Fair enough. Consider this patch withdrawn, sorry for the noise.

--
Davide
Davide Italiano July 4, 2016, 7:57 p.m. UTC | #8
On Mon, Jul 4, 2016 at 9:12 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
>> 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,
>
> lld won't build on Fedora 24/x86-64 with GCC 6:
>
> [ 39%] Building CXX object
> tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o
> /export/gnu/import/git/llvm/tools/lld/ELF/OutputSections.cpp: In
> member function ‘void
> lld::elf::GnuHashTableSection<ELFT>::addSymbols(std::vector<std::pair<lld::elf::SymbolBody*,
> long unsigned int> >&)’:
> /export/gnu/import/git/llvm/tools/lld/ELF/OutputSections.cpp:585:8:
> error: inconsistent deduction for ‘auto’: ‘auto’ and then
> ‘__gnu_cxx::__normal_iterator<std::pair<lld::elf::SymbolBody*, long
> unsigned int>*, std::vector<std::pair<lld::elf::SymbolBody*, long
> unsigned int> > >’
> tools/lld/ELF/CMakeFiles/lldELF.dir/build.make:302: recipe for target
> 'tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o' failed
> gmake[4]: *** [tools/lld/ELF/CMakeFiles/lldELF.dir/OutputSections.cpp.o] Error 1
>
> Can you fix it?



>> --
>> 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
>
>
>
> --
> H.J.


FWIW, this should be fixed upstream.
Mike Stump July 4, 2016, 7:57 p.m. UTC | #9
On Jul 4, 2016, at 12:36 PM, Markus Trippelsdorf <markus@trippelsdorf.de> wrote:
> 
> On 2016.07.04 at 10:08 -0700, H.J. Lu wrote:
>> On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
>>> 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.
>>> 
>>> Hi, can anybody take a look?
>> 
>> lld isn't compatible with GCC:
>> 
>> https://llvm.org/bugs/show_bug.cgi?id=28414
> 
> Besides the technical issues, this also raises the question if it is
> right to support lld at all. Because this project was obviously started
> to replace the GNU linkers (ld.bfd and gold) in the long run.
> So I see no reason why it should be supported in GCC.
> 
> (And who needs a buggy new ELF linker anyway?)

So, this is off-topic for the list, gnu.misc.discuss is a better forum for such things, if you want.  The GNU tools have no prohibition with working with system libraries that are non-free, nor non-free tools, such as ar, nm, ld and as or even simulators.  Contributions for interoperability with other tools will be considered.  gcc has always been widely compatible and interoperable with more than just Linux systems.
Trevor Saunders July 7, 2016, 12:59 a.m. UTC | #10
On Mon, Jul 04, 2016 at 09:36:52PM +0200, Markus Trippelsdorf wrote:
> On 2016.07.04 at 10:08 -0700, H.J. Lu wrote:
> > On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitaliano@gmail.com> wrote:
> > > 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.
> > >
> > > Hi, can anybody take a look?
> > 
> > lld isn't compatible with GCC:
> > 
> > https://llvm.org/bugs/show_bug.cgi?id=28414
> 
> Besides the technical issues, this also raises the question if it is
> right to support lld at all. Because this project was obviously started
> to replace the GNU linkers (ld.bfd and gold) in the long run.

Technically it seems like it would be useful to support
-fuse-ld=<something that can be execed> so you can say easily test gcc
with a ld.bfd you just built.

> So I see no reason why it should be supported in GCC.
> 
> (And who needs a buggy new ELF linker anyway?)

I'm not particularly thrilled by a new linker, but presumably the bugs
will get fixed, and it does link libxul.so and presumably other things
but I don't have data, and that is certainly useful.

Trev
Segher Boessenkool Jan. 26, 2019, 10:34 p.m. UTC | #11
On Thu, Jun 23, 2016 at 09:01:30PM -0700, Davide Italiano 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.

This can never work correctly.

The many HAVE_LD_* flags are set for the linker you are configured
against.  Now normally GNU ld and Gold will be built from the same tree,
so they will be at least mostly compatible.  But for some other linker
that cannot ever work.  If you can choose a random linker at runtime then
the linker features the compiler is built for will almost certainly not
match those that linker has.

You can built with --with-ld=/some/path/to/your/lld, and *that* should
work fine.  But -fuse-ld=/smth/random will result in randomness.


Segher
Alan Modra Jan. 29, 2019, 1:11 a.m. UTC | #12
On Sat, Jan 26, 2019 at 04:34:59PM -0600, Segher Boessenkool wrote:
> On Thu, Jun 23, 2016 at 09:01:30PM -0700, Davide Italiano 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.
> 
> This can never work correctly.
> 
> The many HAVE_LD_* flags are set for the linker you are configured
> against.  Now normally GNU ld and Gold will be built from the same tree,
> so they will be at least mostly compatible.  But for some other linker
> that cannot ever work.  If you can choose a random linker at runtime then
> the linker features the compiler is built for will almost certainly not
> match those that linker has.
> 
> You can built with --with-ld=/some/path/to/your/lld, and *that* should
> work fine.  But -fuse-ld=/smth/random will result in randomness.

Yes, and please do note (distros!!) that --with-ld will result in -B
also not being able to specify a linker.  That's a pain if you want to
run the binutils ld testsuite.  You'll get something like:

ERROR: ************************************************************************
ERROR: Your compiler driver ignores -B when choosing ld.
ERROR: You will not be testing the new ld in many of the following tests.
ERROR: It seems you will be testing /usr/bin/x86_64-w64-mingw32-ld instead.
ERROR: ************************************************************************
diff mbox

Patch

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