[Driver] Add support for -fuse-ld=lld
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.), 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 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 From 323c23d79c91d7dcee2f29b9ced8c1c00703d346 Mon Sep 17 00:00:00 2001 From: Davide Italiano 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 } s
Re: [Driver] Add support for -fuse-ld=lld
+ HJ who wrote the code for the option originally. On Thu, Jun 23, 2016 at 9:01 PM, 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.), 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 > 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
Re: [Driver] Add support for -fuse-ld=lld
On Thu, Jun 23, 2016 at 9:11 PM, Davide Italiano wrote: > + HJ who wrote the code for the option originally. > > On Thu, Jun 23, 2016 at 9:01 PM, 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.), 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 >> 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
Re: [Driver] Add support for -fuse-ld=lld
On Mon, Jul 4, 2016 at 12:36 PM, 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 >> wrote: >> > On Thu, Jun 23, 2016 at 9:11 PM, Davide Italiano >> > wrote: >> >> + HJ who wrote the code for the option originally. >> >> >> >> On Thu, Jun 23, 2016 at 9:01 PM, 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.), 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
Re: [Driver] Add support for -fuse-ld=lld
On Mon, Jul 4, 2016 at 9:12 AM, H.J. Lu wrote: > On Sun, Jul 3, 2016 at 9:38 PM, Davide Italiano wrote: >> On Thu, Jun 23, 2016 at 9:11 PM, Davide Italiano >> wrote: >>> + HJ who wrote the code for the option originally. >>> >>> On Thu, Jun 23, 2016 at 9:01 PM, 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.), 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::addSymbols(std::vector 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 unsigned int>*, std::vector 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 >>>> 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 || >>>>