This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Driver] Add support for -fuse-ld=lld
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Davide Italiano <dccitaliano at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 4 Jul 2016 10:08:35 -0700
- Subject: Re: [Driver] Add support for -fuse-ld=lld
- Authentication-results: sourceware.org; auth=none
- References: <CADob98T6+EFan_M=+vv0gii5SXjYrkfLH9Zd_pfm34-1AHceAQ@mail.gmail.com> <CADob98S_7is0wB0ZnQMVYXZmgLu5Q=DEYsNGTvg4AZy06Ln8Yg@mail.gmail.com> <CADob98SRd9XdCWgMDAPMxav55RfYSdpLsJm9=11V4ghgmo+CMQ@mail.gmail.com>
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.