From 42a673211621b28d968d3556076a8881278ec5f1 Mon Sep 17 00:00:00 2001 From: "P. Jung" Date: Fri, 21 Jan 2022 16:40:01 +0000 Subject: [PATCH] mold-gcc11 --- gcc/collect2.c | 10 +++++++--- gcc/common.opt | 4 ++++ gcc/configure | 18 ++++++++++++++++++ gcc/configure.ac | 16 ++++++++++++++++ gcc/doc/invoke.texi | 4 ++++ gcc/gcc.c | 4 ++++ gcc/opts.c | 1 + 7 files changed, 54 insertions(+), 3 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index 0c8af29879d..f0e1bcfaeb4 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -785,6 +785,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] = @@ -793,7 +794,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"; @@ -970,6 +972,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 (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1082,7 +1086,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 @@ -1317,7 +1321,7 @@ main (int argc, char **argv) else if (!use_collect_ld && strncmp (arg, "-fuse-ld=", 9) == 0) { - /* 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 a75b44ee47e..c24e135e2ee 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2967,6 +2967,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/configure b/gcc/configure index 708328e1670..5982dc3ddd3 100755 --- a/gcc/configure +++ b/gcc/configure @@ -23017,6 +23017,20 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_is_gold" >&5 $as_echo "$ld_is_gold" >&6; } +# Check to see if we are using mold instead of ld +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using mold" >&5 +$as_echo_n "checking whether we are using mold... " >&6; } +ld_is_mold=no +if test x$gcc_cv_ld != x; then + if $gcc_cv_ld --version 2>/dev/null | sed 1q \ + | grep "mold" > /dev/null; then + ld_is_mold=yes + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_is_mold" >&5 +$as_echo "$ld_is_mold" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking gold linker with split stack support as non default" >&5 $as_echo_n "checking gold linker with split stack support as non default... " >&6; } # Check to see if default ld is not gold, but gold is @@ -23868,6 +23882,8 @@ else gcc_cv_ld_hidden=yes if test x"$ld_is_gold" = xyes; then : + elif test x"$ld_is_mold" = xyes; then + : elif echo "$ld_ver" | grep GNU > /dev/null; then if test 0"$ld_date" -lt 20020404; then if test -n "$ld_date"; then @@ -24980,6 +24996,8 @@ $as_echo "$gcc_cv_as_comdat_group_group" >&6; } fi if test x"$ld_is_gold" = xyes; then comdat_group=yes +elif test x"$ld_is_mold" = xyes; then + comdat_group=yes elif test $in_tree_ld = yes ; then comdat_group=no if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \ diff --git a/gcc/configure.ac b/gcc/configure.ac index df1c9cc3200..3146d90d4e3 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -2645,6 +2645,18 @@ if test x$gcc_cv_ld != x; then fi AC_MSG_RESULT($ld_is_gold) +# Check to see if we are using mold instead of ld +AC_MSG_CHECKING(whether we are using mold) +ld_is_mold=no +if test x$gcc_cv_ld != x; then + if $gcc_cv_ld --version 2>/dev/null | sed 1q \ + | grep "mold" > /dev/null; then + ld_is_mold=yes + fi +fi +AC_MSG_RESULT($ld_is_mold) + + AC_MSG_CHECKING(gold linker with split stack support as non default) # Check to see if default ld is not gold, but gold is # available and has support for split stack. If gcc was configured @@ -3030,6 +3042,8 @@ else gcc_cv_ld_hidden=yes if test x"$ld_is_gold" = xyes; then : + elif test x"$ld_is_mold" = xyes; then + : elif echo "$ld_ver" | grep GNU > /dev/null; then if test 0"$ld_date" -lt 20020404; then if test -n "$ld_date"; then @@ -3503,6 +3517,8 @@ else fi if test x"$ld_is_gold" = xyes; then comdat_group=yes +elif test x"$ld_is_mold" = xyes; then + comdat_group=yes elif test $in_tree_ld = yes ; then comdat_group=no if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 5a4b3c6c234..c5887c589b3 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -15605,6 +15605,10 @@ Use the @command{gold} linker instead of the default linker. @opindex fuse-ld=lld Use the LLVM @command{lld} linker instead of the default linker. +@item -fuse-ld=mold +@opindex fuse-ld=mold +Use the Modern Linker (@command{mold}) instead of the default linker. + @cindex Libraries @item -l@var{library} @itemx -l @var{library} diff --git a/gcc/gcc.c b/gcc/gcc.c index 8ba410c9e17..08fb827340a 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -4189,6 +4189,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 24bb64198c8..9192ca75743 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2875,6 +2875,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