On Mon, Jul 4, 2016 at 9:12 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano <dccitali...@gmail.com> wrote: >> On Thu, Jun 23, 2016 at 9:11 PM, Davide Italiano <dccitali...@gmail.com> >> wrote: >>> + HJ who wrote the code for the option originally. >>> >>> On Thu, Jun 23, 2016 at 9:01 PM, Davide Italiano <dccitali...@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 <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; >>>> -- >>>> 2.5.5 > > > > -- > H.J. FWIW, this should be fixed upstream.