Hi!

As discussed earlier on IRC, --enable-link-mutex has a big problem that it
decreases number of available jobs by the number of link commands waiting
for the lock, so e.g. when doing make -j32 build with 11 different
big programs linked with $(LLINKER) we end up with just 22 effective jobs,
and with e.g. make -j8 with those 11 different big programs we actually most
likely serialize everything during linking onto a single job.

The following patch is an attempt to handle it using Make dependencies
instead, let configure create a chain, e.g.
c++.prev: c.serial
fortran.prev: c++.serial
lto.prev: fortran.serial
in Make-hooks, which says that cc1plus can be only linked after cc1 is
linked, then f951, then lto1 and then lto-dump.

One thing I don't like very much on this implementation is that it uses
recursive make, something we apparently don't use in gcc/ right now.

One reason for that is that I wanted to make the case when I do:
make -j32 cc1plus
by hand to avoid uselessly building cc1, gnat1 etc. (whatever is in
the CONFIG_LANGUAGES before), i.e. only serialize if done from a bootstrap.

But perhaps there could be a way out of that, by moving the
--enable-link-serialization to toplevel configure and arrange for it to just
pass some variable to the gcc make in that case.  Then the Make-hooks could
look like:
ifeq (DO_LINK_SERIALIZATION,true)
ada.prev: c.serial
brig.prev: ada.serial
c++.prev: brig.serial
d.prev: c++.serial
fortran.prev: d.serial
go.prev: fortran.serial
lto.prev: go.serial
objc.prev: lto.serial
obj-c++.prev: objc.serial
else
ada.prev:
brig.prev:
c++.prev:
d.prev:
fortran.prev:
go.prev:
lto.prev:
objc.prev:
obj-c++.prev:
endif
and then just add c++.prev dependency to cc1obj$(exeext) dependencies
unconditionally.
Thoughts on that?

2020-09-03  Jakub Jelinek  <ja...@redhat.com>

gcc/
        * configure.ac: Add --enable-link-serialization support, add into
        Make-hooks rules on which language is previous in the list of
        all selected languages.
        * Makefile.in (LANGUAGES): Add *.serial instead of * if
        --enable-link-serialization is on.
        * configure: Regenerated.
gcc/c/
        * Make-lang.in (c.serial): Depend on c.
        (.PHONY): Add c.serial.
gcc/cp/
        * Make-lang.in (.PHONY): Add c++.serial c++.prev.
        (CC1PLUS_DEPS): New variable.
        (cc1plus$(exeext)): Use it.
        (c++.serial): New goal.
gcc/ada/
        * Make-lang.in (.PHONY): Add ada.serial ada.prev.
        (GNAT1_DEPS): New variable.
        (gnat1$(exeext)): Use it.
        (ada.serial): New goal.
gcc/brig/
        * Make-lang.in (.PHONY): Add brig.serial brig.prev.
        (BRIG1_DEPS): New variable.
        (brig1$(exeext)): Use it.
        (brig.serial): New goal.
gcc/go/
        * Make-lang.in (.PHONY): Add go.serial go.prev.
        (GO1_DEPS): New variable.
        (go1$(exeext)): Use it.
        (go.serial): New goal.
gcc/jit/
        * Make-lang.in (.PHONY): Add jit.serial jit.prev jit.extra.
        (jit.extra): New goal.
        (jit): Use it.
        (LIBGCCJIT_FILENAME_DEPS): New variable.
        ($(LIBGCCJIT_FILENAME)): Use it.
        (jit.serial): New goal.
gcc/objc/
        * Make-lang.in (.PHONY): Add objc.serial objc.prev.
        (CC1OBJ_DEPS): New variable.
        (cc1obj$(exeext)): Use it.
        (objc.serial): New goal.
gcc/objcp/
        * Make-lang.in (.PHONY): Add obj-c++.serial obj-c++.prev.
        (CC1OBJPLUS_DEPS): New variable.
        (cc1objplus$(exeext)): Use it.
        (obj-c++.serial): New goal.
gcc/fortran/
        * Make-lang.in (.PHONY): Add fortran.serial fortran.prev.
        (F951_DEPS): New variable.
        (f951$(exeext)): Use it.
        (fortran.serial): New goal.
gcc/lto/
        * Make-lang.in (.PHONY): Add lto lto.serial lto.prev.
        (lto): Depend on $(LTO_EXE) $(LTO_DUMP_EXE).
        (lto.all-cross, lto.start.encap): Don't depend on anything.
        (LTO_EXE_DEPS): New variable.
        ($(LTO_EXE)): Use it.
        (LTO_DUMP_EXE_DEPS): New variable.
        ($(LTO_DUMP_EXE)): Use it.
        (lto.serial): New goal.

--- gcc/configure.ac.jj 2020-08-26 17:09:45.829254709 +0200
+++ gcc/configure.ac    2020-09-03 14:41:02.884746491 +0200
@@ -6380,6 +6380,24 @@ else
 fi
 AC_SUBST(DO_LINK_MUTEX)
 
+dnl Another way of doing that, purely using make dependencies
+
+AC_MSG_CHECKING([whether to serialize linking of multiple front-ends])
+  AC_ARG_ENABLE(link-serialization,
+[AS_HELP_STRING([--enable-link-serialization],
+               [avoid linking multiple front-ends at once to avoid thrashing
+                on the build machine through make dependencies])],
+      do_link_serialization=$enableval,
+      do_link_serialization=no)
+AC_MSG_RESULT($do_link_serialization)
+
+if test "$do_link_serialization" = "yes"; then
+   DO_LINK_SERIALIZATION=true
+else
+   DO_LINK_SERIALIZATION=false
+fi
+AC_SUBST(DO_LINK_SERIALIZATION)
+
 # --------------
 # Language hooks
 # --------------
@@ -6540,6 +6558,14 @@ do
        echo "lang.$t: $x" >> Make-hooks
 done
 
+prev=c
+for lang in $all_selected_languages
+do
+       test $lang = c && continue
+       echo "$lang.prev: $prev.serial" >> Make-hooks
+       prev=$lang
+done
+
 # --------
 # Option include files
 # --------
--- gcc/Makefile.in.jj  2020-08-18 07:50:18.440924074 +0200
+++ gcc/Makefile.in     2020-09-03 13:53:10.041872344 +0200
@@ -137,7 +137,11 @@ SUBDIRS =@subdirs@ build
 
 # Selection of languages to be made.
 CONFIG_LANGUAGES = @all_selected_languages@
+ifeq (@DO_LINK_SERIALIZATION@,true)
+LANGUAGES = $(addsuffix .serial,c $(CONFIG_LANGUAGES))
+else
 LANGUAGES = c $(CONFIG_LANGUAGES)
+endif
 ifeq (@enable_gcov@,yes)
 LANGUAGES += gcov$(exeext) gcov-dump$(exeext) gcov-tool$(exeext)
 endif
--- gcc/c/Make-lang.in.jj       2020-07-28 15:39:09.669760889 +0200
+++ gcc/c/Make-lang.in  2020-09-03 14:24:41.861122758 +0200
@@ -37,9 +37,10 @@
 #
 # Define the names for selecting c in LANGUAGES.
 c: cc1$(exeext)
+c.serial: c
 
 # Tell GNU make to ignore these if they exist.
-.PHONY: c gcc
+.PHONY: c gcc c.serial
 
 # The C front end driver.  This is different from the drivers for other
 # front ends, because there is no C language specific driver (i.e. nothing
--- gcc/cp/Make-lang.in.jj      2020-07-28 15:39:09.770759500 +0200
+++ gcc/cp/Make-lang.in 2020-09-03 14:44:21.099842403 +0200
@@ -49,7 +49,7 @@ CP_PLUGIN_HEADERS := cp-tree.h cxx-prett
 c++: cc1plus$(exeext)
 
 # Tell GNU make to ignore these if they exist.
-.PHONY: c++
+.PHONY: c++ c++.serial c++.prev
 
 CFLAGS-cp/g++spec.o += $(DRIVER_DEFINES)
 
@@ -116,10 +116,14 @@ cc1plus-checksum.c : build/genchecksum$(
          $(srcdir)/../move-if-change cc1plus-checksum.c.tmp 
cc1plus-checksum.c; \
        fi
 
-cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS)
+CC1PLUS_DEPS = $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS)
+cc1plus$(exeext): $(CC1PLUS_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
              $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
 
+c++.serial: c++.prev $(CC1PLUS_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) c++
+
 ifeq ($(ENABLE_MAINTAINER_RULES), true)
 # Special build rule.  This is a maintainer rule, that is only
 # available when GCC is configured with --enable-maintainer-mode.  In
--- gcc/ada/gcc-interface/Make-lang.in.jj       2020-07-28 15:39:09.470763625 
+0200
+++ gcc/ada/gcc-interface/Make-lang.in  2020-09-03 14:54:45.672695769 +0200
@@ -148,7 +148,7 @@ endif
 ada: gnat1$(exeext) gnatbind$(exeext)
 
 # Tell GNU Make to ignore these, if they exist.
-.PHONY: ada
+.PHONY: ada ada.serial ada.prev
 
 # Compute the FLAGS to pass for gnattools, now linked with a C++ driver as
 # we're linking against at least libcommon which contains C++ compiled code.
@@ -666,11 +666,15 @@ ada/libgnat/s-excmac.adb: $(srcdir)/ada/
 # Needs to be built with CC=gcc
 # Since the RTL should be built with the latest compiler, remove the
 #  stamp target in the parent directory whenever gnat1 is rebuilt
-gnat1$(exeext): $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) 
libcommon-target.a $(LIBDEPS)
+GNAT1_DEPS = $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) 
libcommon-target.a $(LIBDEPS)
+gnat1$(exeext): $(GNAT1_DEPS)
        +$(GCC_LLINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) \
          libcommon-target.a $(LIBS) $(SYSLIBS) $(BACKENDLIBS) $(CFLAGS)
        $(RM) stamp-gnatlib2-rts stamp-tools
 
+ada.serial: gnatbind$(exeext) ada.prev $(GNAT1_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) ada
+
 gnatbind$(exeext): ada/b_gnatb.o $(CONFIG_H) $(GNATBIND_OBJS) ggc-none.o 
libcommon-target.a $(LIBDEPS)
        +$(GCC_LINK) -o $@ ada/b_gnatb.o $(GNATBIND_OBJS) ggc-none.o 
libcommon-target.a $(LIBS) $(SYSLIBS) $(CFLAGS)
 
--- gcc/brig/Make-lang.in.jj    2020-01-12 11:54:36.193416728 +0100
+++ gcc/brig/Make-lang.in       2020-09-03 14:56:26.067225541 +0200
@@ -30,7 +30,7 @@ GCCBRIG_TARGET_INSTALL_NAME := $(target_
 # The name for selecting brig in LANGUAGES.
 brig: brig1$(exeext)
 
-.PHONY: brig
+.PHONY: brig brig.serial brig.prev
 
 CFLAGS-brig/brigspec.o += $(DRIVER_DEFINES)
 
@@ -81,16 +81,15 @@ BRIG_OBJS = \
 
 brig_OBJS = $(BRIG_OBJS) brig/brigspec.o
 
-# brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
-#      +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
-#            $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
-
-
-brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+BRIG1_DEPS = $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+brig1$(exeext): $(BRIG1_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
              $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) \
                  $(BACKENDLIBS)
 
+brig.serial: brig.prev $(BRIG1_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) brig
+
 # Documentation.
 
 BRIG_TEXI_FILES = \
--- gcc/go/Make-lang.in.jj      2020-01-12 11:54:36.630410135 +0100
+++ gcc/go/Make-lang.in 2020-09-03 14:57:04.455663361 +0200
@@ -28,7 +28,7 @@ GCCGO_TARGET_INSTALL_NAME := $(target_no
 # The name for selecting go in LANGUAGES.
 go: go1$(exeext)
 
-.PHONY: go
+.PHONY: go go.serial go.prev
 
 CFLAGS-go/gospec.o += $(DRIVER_DEFINES)
 
@@ -78,10 +78,14 @@ GO_OBJS = \
 
 go_OBJS = $(GO_OBJS) go/gospec.o
 
-go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+GO1_DEPS = $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+go1$(exeext): $(GO1_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
              $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
 
+go.serial: go.prev $(GO1_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) go
+
 # Documentation.
 
 GO_TEXI_FILES = \
--- gcc/jit/Make-lang.in.jj     2020-07-28 15:39:09.956756942 +0200
+++ gcc/jit/Make-lang.in        2020-09-03 14:51:31.109545079 +0200
@@ -48,8 +48,7 @@ ifneq (,$(findstring mingw,$(target)))
 LIBGCCJIT_FILENAME = libgccjit-$(LIBGCCJIT_VERSION_NUM).dll
 LIBGCCJIT_IMPORT_LIB = libgccjit.dll.a
 
-jit: $(LIBGCCJIT_FILENAME) \
-       $(FULL_DRIVER_NAME)
+jit.extra: $(FULL_DRIVER_NAME)
 
 else
 
@@ -75,14 +74,16 @@ LIBGCCJIT_SONAME_OPTION = \
        $(if $(LD_SONAME_OPTION), \
             -Wl$(COMMA)$(LD_SONAME_OPTION)$(COMMA)$(LIBGCCJIT_SONAME))
 
-jit: $(LIBGCCJIT_FILENAME) \
-       $(LIBGCCJIT_SYMLINK) \
+jit.extra: $(LIBGCCJIT_SYMLINK) \
        $(LIBGCCJIT_LINKER_NAME_SYMLINK) \
        $(FULL_DRIVER_NAME)
+
 endif
 
+jit: $(LIBGCCJIT_FILENAME) jit.extra
+
 # Tell GNU make to ignore these if they exist.
-.PHONY: jit
+.PHONY: jit jit.serial jit.prev jit.extra
 
 jit_OBJS = attribs.o \
        jit/dummy-frontend.o \
@@ -113,17 +114,21 @@ endif
 
 # We avoid using $(BACKEND) from Makefile.in in order to avoid pulling
 # in main.o
-$(LIBGCCJIT_FILENAME): $(jit_OBJS) \
+LIBGCCJIT_FILENAME_DEPS = $(jit_OBJS) \
        libbackend.a libcommon-target.a libcommon.a \
        $(CPPLIB) $(LIBDECNUMBER) \
        $(LIBDEPS) $(srcdir)/jit/libgccjit.map \
        $(EXTRA_GCC_OBJS)
+$(LIBGCCJIT_FILENAME): $(LIBGCCJIT_FILENAME_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ -shared \
             $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \
             $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS) $(BACKENDLIBS) 
\
             $(EXTRA_GCC_OBJS) \
             $(LIBGCCJIT_EXTRA_OPTS)
 
+jit.serial: jit.prev $(LIBGCCJIT_FILENAME_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) jit
+
 # Create symlinks when not building for Windows
 ifeq (,$(findstring mingw,$(target)))
 $(LIBGCCJIT_SONAME_SYMLINK): $(LIBGCCJIT_FILENAME)
--- gcc/d/Make-lang.in.jj       2020-08-26 10:27:10.690552343 +0200
+++ gcc/d/Make-lang.in  2020-09-03 14:52:31.675658110 +0200
@@ -29,7 +29,7 @@ D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\"
 d: d21$(exeext)
 
 # Tell GNU make to ignore these if they exist.
-.PHONY: d
+.PHONY: d d.serial d.prev
 
 # Create the compiler driver for D.
 CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS)
@@ -162,10 +162,14 @@ D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_GENE
 
 d_OBJS = $(D_ALL_OBJS) d/d-spec.o
 
-d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+D21_DEPS = $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+d21$(exeext): $(D21_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
                $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
 
+d.serial: d.prev $(D21_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) d
+
 # Documentation.
 
 D_TEXI_FILES = \
--- gcc/objc/Make-lang.in.jj    2020-01-12 11:54:36.681409365 +0100
+++ gcc/objc/Make-lang.in       2020-09-03 14:57:54.789926228 +0200
@@ -40,7 +40,7 @@
 objc: cc1obj$(exeext)
 
 # Tell GNU make to ignore these if they exist.
-.PHONY: objc
+.PHONY: objc objc.serial objc.prev
 
 # Use maximal warnings for this front end.
 objc-warn = $(STRICT_WARN)
@@ -62,11 +62,15 @@ cc1obj-checksum.c : build/genchecksum$(b
         $(BACKEND) $(LIBDEPS) checksum-options > cc1obj-checksum.c.tmp && \
        $(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c
 
-cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) 
$(LIBDEPS)
+CC1OBJ_DEPS = $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) 
$(LIBDEPS)
+cc1obj$(exeext): $(CC1OBJ_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
              $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \
              $(BACKEND) $(LIBS) $(BACKENDLIBS)
 
+objc.serial: objc.prev $(CC1OBJ_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) objc
+
 objc.srcextra:
 
 #
--- gcc/objcp/Make-lang.in.jj   2020-01-12 11:54:36.685409305 +0100
+++ gcc/objcp/Make-lang.in      2020-09-03 14:58:44.181202905 +0200
@@ -41,7 +41,7 @@
 obj-c++: cc1objplus$(exeext)
 
 # Tell GNU make to ignore these if they exist.
-.PHONY: obj-c++
+.PHONY: obj-c++ obj-c++.serial obj-c++.prev
 
 # Use maximal warnings for this front end.  Also, make ObjC and C++
 # headers accessible.
@@ -66,10 +66,14 @@ cc1objplus-checksum.c : build/genchecksu
        $(srcdir)/../move-if-change cc1objplus-checksum.c.tmp \
        cc1objplus-checksum.c
 
-cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS)
+CC1OBJPLUS_DEPS = $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS)
+cc1objplus$(exeext): $(CC1OBJPLUS_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
                $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBS) 
$(BACKENDLIBS)
 
+obj-c++.serial: obj-c++.prev $(CC1OBJPLUS_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) obj-c++
+
 # Objective C++ language specific files.
 
 objcp/objc-runtime-shared-support.o: objc/objc-runtime-shared-support.c
--- gcc/fortran/Make-lang.in.jj 2020-01-12 11:54:36.582410859 +0100
+++ gcc/fortran/Make-lang.in    2020-09-03 14:53:48.550532310 +0200
@@ -74,7 +74,7 @@ fortran_OBJS = $(F95_OBJS) fortran/gfort
 fortran: f951$(exeext)
 
 # Tell GNU make to ignore files by these names if they exist.
-.PHONY: fortran
+.PHONY: fortran fortran.serial fortran.prev
 
 CFLAGS-fortran/gfortranspec.o += $(DRIVER_DEFINES)
 
@@ -92,12 +92,15 @@ gfortran-cross$(exeext): gfortran$(exeex
        cp gfortran$(exeext) gfortran-cross$(exeext)
 
 # The compiler itself is called f951.
-f951$(exeext): $(F95_OBJS) \
-               $(BACKEND) $(LIBDEPS) attribs.o
+F951_DEPS = $(F95_OBJS) $(BACKEND) $(LIBDEPS) attribs.o
+f951$(exeext): $(F951_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
                $(F95_OBJS) $(BACKEND) $(ZLIB) $(LIBS) attribs.o \
                $(BACKENDLIBS)
 
+fortran.serial: fortran.prev $(F951_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) fortran
+
 gt-fortran-trans.h    : s-gtype; @true
 #
 # Build hooks:
--- gcc/lto/Make-lang.in.jj     2020-01-12 11:54:36.677409426 +0100
+++ gcc/lto/Make-lang.in        2020-09-03 14:45:51.957511831 +0200
@@ -41,10 +41,14 @@ lto_dump_OBJS = $(LTO_DUMP_OBJS)
 
 # Rules
 
+lto: $(LTO_EXE) $(LTO_DUMP_EXE)
+
+.PHONY: lto lto.serial lto.prev
+
 # These hooks are used by the main GCC Makefile.  Consult that
 # Makefile for documentation.
-lto.all.cross: $(LTO_EXE) $(LTO_DUMP_EXE)
-lto.start.encap: $(LTO_EXE) $(LTO_DUMP_EXE)
+lto.all.cross:
+lto.start.encap:
 lto.rest.encap:
 lto.tags:
 lto.install-common: installdirs
@@ -84,14 +88,20 @@ lto.stagefeedback:
 # Use strict warnings for this front end.
 lto-warn = $(STRICT_WARN)
 
-$(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIBDEPS)
+LTO_EXE_DEPS = $(LTO_OBJS) $(BACKEND) $(LIBDEPS)
+$(LTO_EXE): $(LTO_EXE_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
                $(LTO_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS)
 
-$(LTO_DUMP_EXE): $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS)
+LTO_DUMP_EXE_DEPS = $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS)
+$(LTO_DUMP_EXE): $(LTO_DUMP_EXE_DEPS)
        +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
                $(LTO_DUMP_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS)
 
+lto.serial: lto.prev $(LTO_EXE_DEPS) $(LTO_DUMP_EXE_DEPS)
+       $(MAKE) $(FLAGS_TO_PASS) $(LTO_EXE)
+       $(MAKE) $(FLAGS_TO_PASS) $(LTO_DUMP_EXE)
+
 lto/lto-dump.o: $(LTO_OBJS)
 
 lto1.fda: ../prev-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA)
--- gcc/configure.jj    2020-08-26 17:09:45.828254723 +0200
+++ gcc/configure       2020-09-03 14:41:09.632647617 +0200
@@ -710,6 +710,7 @@ subdirs
 dollar
 gcc_tooldir
 enable_lto
+DO_LINK_SERIALIZATION
 DO_LINK_MUTEX
 MAINT
 zlibinc
@@ -1012,6 +1013,7 @@ with_gc
 with_system_zlib
 enable_maintainer_mode
 enable_link_mutex
+enable_link_serialization
 enable_version_specific_runtime_libs
 enable_plugin
 enable_host_shared
@@ -1767,6 +1769,10 @@ Optional Features:
                           sometimes confusing) to the casual installer
   --enable-link-mutex     avoid linking multiple front-ends at once to avoid
                           thrashing on the build machine
+  --enable-link-serialization
+                          avoid linking multiple front-ends at once to avoid
+                          thrashing on the build machine through make
+                          dependencies
   --enable-version-specific-runtime-libs
                           specify that runtime libraries should be installed
                           in a compiler-specific directory
@@ -19013,7 +19019,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19016 "configure"
+#line 19022 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19119,7 +19125,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19122 "configure"
+#line 19128 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -30049,6 +30055,26 @@ else
 fi
 
 
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to serialize linking 
of multiple front-ends" >&5
+$as_echo_n "checking whether to serialize linking of multiple front-ends... " 
>&6; }
+  # Check whether --enable-link-serialization was given.
+if test "${enable_link_serialization+set}" = set; then :
+  enableval=$enable_link_serialization; do_link_serialization=$enableval
+else
+  do_link_serialization=no
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $do_link_serialization" >&5
+$as_echo "$do_link_serialization" >&6; }
+
+if test "$do_link_serialization" = "yes"; then
+   DO_LINK_SERIALIZATION=true
+else
+   DO_LINK_SERIALIZATION=false
+fi
+
+
 # --------------
 # Language hooks
 # --------------
@@ -30209,6 +30235,14 @@ do
        echo "lang.$t: $x" >> Make-hooks
 done
 
+prev=c
+for lang in $all_selected_languages
+do
+       test $lang = c && continue
+       echo "$lang.prev: $prev.serial" >> Make-hooks
+       prev=$lang
+done
+
 # --------
 # Option include files
 # --------

        Jakub

Reply via email to