This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]