Message ID | CADob98T6+EFan_M=+vv0gii5SXjYrkfLH9Zd_pfm34-1AHceAQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
+ 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
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
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
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
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
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?)
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
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.
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.
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
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
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: ************************************************************************
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
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(-)