RFC: --enable-link-serialization support

Richard Biener rguenther@suse.de
Thu Sep 3 13:53:35 GMT 2020


On Thu, 3 Sep 2020, Jakub Jelinek wrote:

> 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 is that an issue in practice?  I usually do not do make -j32 cc1plus
in a tree that was configured for bootstrap, nor do I use
--enable-link-serialization in that case.

Btw, do you plan to keep --enable-link-mutex the way it is?  What it
provides ontop of --enable-link-serialization is that progress
metering for very long running LTO link stages.  Not sure if that
works for the last LTO link or only when there's some other link
waiting.

No review on the actual patch - it looks like what I'd have tried
but I'm no make expert ;)

There's a bug about the bad --enable-link-mutex behavior btw (but
you don't fix that, just provide an alternate implementation).

Thanks,
Richard.

> 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  <jakub@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
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)


More information about the Gcc-patches mailing list