On Tue, Dec 28, 2021 at 2:10 PM Martin Liška <mli...@suse.cz> wrote: > > Hello. > > The mold linker is getting quite popular and I think we should support it: > https://github.com/rui314/mold
Does it support the gold plugin API/ABI and thus proper LTO? If not I'm not sure we should encourage use. For example using -flto -fuse-ld=lld will report strange ld.lld: error: undefined symbol: main >>> referenced by start.S:104 (../sysdeps/x86_64/start.S:104) >>> /usr/lib/../lib64/crt1.o:(_start) collect2: error: ld returned 1 exit status on a simple test with a main() unless I manually add -fno-use-linker-plugin. Richard. > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > --- > gcc/collect2.c | 10 +++++++--- > gcc/common.opt | 4 ++++ > gcc/gcc.c | 4 ++++ > gcc/opts.c | 1 + > 4 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/gcc/collect2.c b/gcc/collect2.c > index d47fe3f9195..b322527847c 100644 > --- a/gcc/collect2.c > +++ b/gcc/collect2.c > @@ -776,6 +776,7 @@ main (int argc, char **argv) > USE_GOLD_LD, > USE_BFD_LD, > USE_LLD_LD, > + USE_MOLD_LD, > USE_LD_MAX > } selected_linker = USE_DEFAULT_LD; > static const char *const ld_suffixes[USE_LD_MAX] = > @@ -784,7 +785,8 @@ main (int argc, char **argv) > PLUGIN_LD_SUFFIX, > "ld.gold", > "ld.bfd", > - "ld.lld" > + "ld.lld", > + "ld.mold" > }; > static const char *const real_ld_suffix = "real-ld"; > static const char *const collect_ld_suffix = "collect-ld"; > @@ -957,6 +959,8 @@ main (int argc, char **argv) > selected_linker = USE_GOLD_LD; > else if (strcmp (argv[i], "-fuse-ld=lld") == 0) > selected_linker = USE_LLD_LD; > + else if (strcmp (argv[i], "-fuse-ld=mold") == 0) > + selected_linker = USE_MOLD_LD; > else if (startswith (argv[i], "-o")) > { > /* Parse the output filename if it's given so that we can make > @@ -1048,7 +1052,7 @@ main (int argc, char **argv) > ld_file_name = 0; > #ifdef DEFAULT_LINKER > if (selected_linker == USE_BFD_LD || selected_linker == USE_GOLD_LD || > - selected_linker == USE_LLD_LD) > + selected_linker == USE_LLD_LD || selected_linker == USE_MOLD_LD) > { > char *linker_name; > # ifdef HOST_EXECUTABLE_SUFFIX > @@ -1283,7 +1287,7 @@ main (int argc, char **argv) > else if (!use_collect_ld > && startswith (arg, "-fuse-ld=")) > { > - /* Do not pass -fuse-ld={bfd|gold|lld} to the linker. */ > + /* Do not pass -fuse-ld={bfd|gold|lld|mold} to the linker. > */ > ld1--; > ld2--; > } > diff --git a/gcc/common.opt b/gcc/common.opt > index 2ed818d6057..dba3fa886f9 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -3046,6 +3046,10 @@ fuse-ld=lld > Common Driver Negative(fuse-ld=lld) > Use the lld LLVM linker instead of the default linker. > > +fuse-ld=mold > +Common Driver Negative(fuse-ld=mold) > +Use the Modern linker (MOLD) linker instead of the default linker. > + > fuse-linker-plugin > Common Undocumented Var(flag_use_linker_plugin) > > diff --git a/gcc/gcc.c b/gcc/gcc.c > index b75b50b87b2..06e18a75b52 100644 > --- a/gcc/gcc.c > +++ b/gcc/gcc.c > @@ -4282,6 +4282,10 @@ driver_handle_option (struct gcc_options *opts, > use_ld = ".gold"; > break; > > + case OPT_fuse_ld_mold: > + use_ld = ".mold"; > + break; > + > case OPT_fcompare_debug_second: > compare_debug_second = 1; > break; > diff --git a/gcc/opts.c b/gcc/opts.c > index cdd6463e49b..60f1cf045c9 100644 > --- a/gcc/opts.c > +++ b/gcc/opts.c > @@ -3094,6 +3094,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_ld_mold: > case OPT_fuse_linker_plugin: > /* No-op. Used by the driver and passed to us because it starts with > f.*/ > break; > -- > 2.34.1 >