On Thu, Nov 19, 2020 at 01:10:18PM +0100, Eric Botcazou wrote: > > Does it? > > Only with --enable-link-serialization, or without that too? > > It's the default, i.e. without --enable-link-serialization. > > > Will have a look. > > Thanks.
So, I think the problem is that for make .PHONY targets are just "rebuilt" always, so it is very much undesirable for the cc1plus$(exeext) etc. dependencies to include .PHONY targets, but I was using them - cc1plus.prev which would depend on some *.serial and e.g. cc1.serial depending on c and c depending on cc1$(exeext). The following so far only very lightly tested patch rewrites this so that *.serial and *.prev aren't .PHONY targets, but instead just make variables. I was worried that the order in which the language makefile fragments are included (which is quite random, what order we get from the filesystem matching */config-lang.in) would be a problem but it seems to work fine. 2020-11-19 Jakub Jelinek <ja...@redhat.com> gcc/ * configure.ac: In SERIAL_LIST use lang words without .serial suffix. Change $lang.prev from a target to variable and instead of depending on *.serial expand to the *.serial variable if the word is in the SERIAL_LIST at all, otherwise to nothing. * configure: Regenerated. gcc/c/ * Make-lang.in (c.serial): Change from goal to a variable. (.PHONY): Drop c.serial. gcc/ada/ * gcc-interface/Make-lang.in (ada.serial): Change from goal to a variable. (.PHONY): Drop ada.serial and ada.prev. (gnat1$(exeext)): Depend on $(ada.serial) rather than ada.serial. gcc/brig/ * Make-lang.in (brig.serial): Change from goal to a variable. (.PHONY): Drop brig.serial and brig.prev. (brig1$(exeext)): Depend on $(brig.serial) rather than brig.serial. gcc/cp/ * Make-lang.in (c++.serial): Change from goal to a variable. (.PHONY): Drop c++.serial and c++.prev. (cc1plus$(exeext)): Depend on $(c++.serial) rather than c++.serial. gcc/d/ * Make-lang.in (d.serial): Change from goal to a variable. (.PHONY): Drop d.serial and d.prev. (d21$(exeext)): Depend on $(d.serial) rather than d.serial. gcc/fortran/ * Make-lang.in (fortran.serial): Change from goal to a variable. (.PHONY): Drop fortran.serial and fortran.prev. (f951$(exeext)): Depend on $(fortran.serial) rather than fortran.serial. gcc/go/ * Make-lang.in (go.serial): Change from goal to a variable. (.PHONY): Drop go.serial and go.prev. (go1$(exeext)): Depend on $(go.serial) rather than go.serial. gcc/jit/ * Make-lang.in (jit.serial): Change from goal to a variable. (.PHONY): Drop jit.serial and jit.prev. ($(LIBGCCJIT_FILENAME)): Depend on $(jit.serial) rather than jit.serial. gcc/lto/ * Make-lang.in (lto1.serial, lto2.serial): Change from goals to variables. (.PHONY): Drop lto1.serial, lto2.serial, lto1.prev and lto2.prev. ($(LTO_EXE)): Depend on $(lto1.serial) rather than lto1.serial. ($(LTO_DUMP_EXE)): Depend on $(lto2.serial) rather than lto2.serial. gcc/objc/ * Make-lang.in (objc.serial): Change from goal to a variable. (.PHONY): Drop objc.serial and objc.prev. (cc1obj$(exeext)): Depend on $(objc.serial) rather than objc.serial. gcc/objcp/ * Make-lang.in (obj-c++.serial): Change from goal to a variable. (.PHONY): Drop obj-c++.serial and obj-c++.prev. (cc1objplus$(exeext)): Depend on $(obj-c++.serial) rather than obj-c++.serial. --- gcc/configure.ac.jj 2020-11-19 12:34:10.763514118 +0100 +++ gcc/configure.ac 2020-11-19 15:23:24.121386881 +0100 @@ -6864,7 +6864,7 @@ echo "SERIAL_LIST =" >> Make-hooks echo else >> Make-hooks lang_cnt=0 lang_list= -prev=c.serial +prev=c serialization_languages=c for lang in $all_selected_languages do @@ -6880,7 +6880,7 @@ do test $lang = c && continue lang_cnt=`expr $lang_cnt + 1` lang_list=" $prev$lang_list" - prev=${lang}.serial + prev=${lang} done echo "SERIAL_LIST = \$(wordlist \$(DO_LINK_SERIALIZATION),$lang_cnt,$lang_list)" >> Make-hooks echo endif >> Make-hooks @@ -6890,7 +6890,7 @@ lang_idx=1 for lang in $serialization_languages do test $lang = c && continue - echo "$lang.prev: \$(word $lang_cnt,\$(SERIAL_LIST))" >> Make-hooks + echo "$lang.prev = \$(if \$(word $lang_cnt,\$(SERIAL_LIST)),\$(\$(word $lang_cnt,\$(SERIAL_LIST)).serial))" >> Make-hooks echo "INDEX.$lang = $lang_idx" >> Make-hooks lang_cnt=`expr $lang_cnt - 1` lang_idx=`expr $lang_idx + 1` --- gcc/c/Make-lang.in.jj 2020-11-19 12:34:10.752514244 +0100 +++ gcc/c/Make-lang.in 2020-11-19 14:24:32.367043794 +0100 @@ -37,10 +37,10 @@ # # Define the names for selecting c in LANGUAGES. c: cc1$(exeext) -c.serial: c +c.serial = cc1$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: c gcc c.serial +.PHONY: c gcc # 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/ada/gcc-interface/Make-lang.in.jj 2020-11-19 12:34:10.738514404 +0100 +++ gcc/ada/gcc-interface/Make-lang.in 2020-11-19 14:23:02.475060181 +0100 @@ -146,10 +146,10 @@ endif # Define the names for selecting Ada in LANGUAGES. ada: gnat1$(exeext) gnatbind$(exeext) -ada.serial: gnat1$(exeext) +ada.serial = gnat1$(exeext) # Tell GNU Make to ignore these, if they exist. -.PHONY: ada ada.serial ada.prev +.PHONY: ada # 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. @@ -669,7 +669,7 @@ ada/libgnat/s-excmac.adb: $(srcdir)/ada/ # 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) ada.prev + $(LIBDEPS) $(ada.prev) @$(call LINK_PROGRESS,$(INDEX.ada),start) +$(GCC_LLINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) \ libcommon-target.a $(LIBS) $(SYSLIBS) $(BACKENDLIBS) $(CFLAGS) --- gcc/brig/Make-lang.in.jj 2020-11-19 12:34:10.746514312 +0100 +++ gcc/brig/Make-lang.in 2020-11-19 14:23:32.440721366 +0100 @@ -29,9 +29,9 @@ GCCBRIG_TARGET_INSTALL_NAME := $(target_ # The name for selecting brig in LANGUAGES. brig: brig1$(exeext) -brig.serial: brig +brig.serial = brig1$(exeext) -.PHONY: brig brig.serial brig.prev +.PHONY: brig CFLAGS-brig/brigspec.o += $(DRIVER_DEFINES) @@ -82,7 +82,7 @@ BRIG_OBJS = \ brig_OBJS = $(BRIG_OBJS) brig/brigspec.o -brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS) brig.prev +brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS) $(brig.prev) @$(call LINK_PROGRESS,$(INDEX.brig),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) \ --- gcc/cp/Make-lang.in.jj 2020-11-19 12:34:10.764514107 +0100 +++ gcc/cp/Make-lang.in 2020-11-19 14:22:31.322412416 +0100 @@ -47,10 +47,10 @@ CP_PLUGIN_HEADERS := cp-tree.h cxx-prett # into the C++ rule, but that needs a little bit of work # to do the right thing within all.cross. c++: cc1plus$(exeext) -c++.serial: c++ +c++.serial = cc1plus$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: c++ c++.serial c++.prev +.PHONY: c++ CFLAGS-cp/g++spec.o += $(DRIVER_DEFINES) @@ -117,7 +117,7 @@ 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) c++.prev +cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) $(c++.prev) @$(call LINK_PROGRESS,$(INDEX.c++),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) --- gcc/d/Make-lang.in.jj 2020-11-19 12:34:10.773514004 +0100 +++ gcc/d/Make-lang.in 2020-11-19 14:26:31.676694789 +0100 @@ -27,10 +27,10 @@ D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\" # The name for selecting d in LANGUAGES. d: d21$(exeext) -d.serial: d +d.serial = d21$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: d d.serial d.prev +.PHONY: d # Create the compiler driver for D. CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS) @@ -163,7 +163,7 @@ 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) d.prev +d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) $(d.prev) @$(call LINK_PROGRESS,$(INDEX.d),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) --- gcc/fortran/Make-lang.in.jj 2020-11-19 12:34:10.833513317 +0100 +++ gcc/fortran/Make-lang.in 2020-11-19 14:28:15.684518799 +0100 @@ -72,10 +72,10 @@ fortran_OBJS = $(F95_OBJS) fortran/gfort # # Define the names for selecting gfortran in LANGUAGES. fortran: f951$(exeext) -fortran.serial: fortran +fortran.serial = f951$(exeext) # Tell GNU make to ignore files by these names if they exist. -.PHONY: fortran fortran.serial fortran.prev +.PHONY: fortran CFLAGS-fortran/gfortranspec.o += $(DRIVER_DEFINES) @@ -93,7 +93,7 @@ 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 fortran.prev +f951$(exeext): $(F95_OBJS) $(BACKEND) $(LIBDEPS) attribs.o $(fortran.prev) @$(call LINK_PROGRESS,$(INDEX.fortran),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(F95_OBJS) $(BACKEND) $(ZLIB) $(LIBS) attribs.o \ --- gcc/go/Make-lang.in.jj 2020-11-19 12:34:10.833513317 +0100 +++ gcc/go/Make-lang.in 2020-11-19 14:23:57.018443472 +0100 @@ -27,9 +27,9 @@ GCCGO_TARGET_INSTALL_NAME := $(target_no # The name for selecting go in LANGUAGES. go: go1$(exeext) -go.serial: go +go.serial = go1$(exeext) -.PHONY: go go.serial go.prev +.PHONY: go CFLAGS-go/gospec.o += $(DRIVER_DEFINES) @@ -79,7 +79,7 @@ GO_OBJS = \ go_OBJS = $(GO_OBJS) go/gospec.o -go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS) go.prev +go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS) $(go.prev) @$(call LINK_PROGRESS,$(INDEX.go),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) --- gcc/jit/Make-lang.in.jj 2020-11-19 12:34:10.848513146 +0100 +++ gcc/jit/Make-lang.in 2020-11-19 14:24:55.565781492 +0100 @@ -81,10 +81,10 @@ jit: $(LIBGCCJIT_FILENAME) \ $(FULL_DRIVER_NAME) endif -jit.serial: $(LIBGCCJIT_FILENAME) +jit.serial = $(LIBGCCJIT_FILENAME) # Tell GNU make to ignore these if they exist. -.PHONY: jit jit.serial jit.prev +.PHONY: jit jit_OBJS = attribs.o \ jit/dummy-frontend.o \ @@ -119,7 +119,7 @@ $(LIBGCCJIT_FILENAME): $(jit_OBJS) \ libbackend.a libcommon-target.a libcommon.a \ $(CPPLIB) $(LIBDECNUMBER) \ $(LIBDEPS) $(srcdir)/jit/libgccjit.map \ - $(EXTRA_GCC_OBJS) jit.prev + $(EXTRA_GCC_OBJS) $(jit.prev) @$(call LINK_PROGRESS,$(INDEX.jit),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ -shared \ $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \ --- gcc/lto/Make-lang.in.jj 2020-11-19 12:34:10.850513123 +0100 +++ gcc/lto/Make-lang.in 2020-11-19 14:28:55.894064159 +0100 @@ -42,10 +42,10 @@ lto_dump_OBJS = $(LTO_DUMP_OBJS) # Rules lto: $(LTO_EXE) $(LTO_DUMP_EXE) -lto1.serial: $(LTO_EXE) -lto2.serial: $(LTO_DUMP_EXE) +lto1.serial = $(LTO_EXE) +lto2.serial = $(LTO_DUMP_EXE) -.PHONY: lto lto1.serial lto1.prev lto2.serial lto2.prev +.PHONY: lto # These hooks are used by the main GCC Makefile. Consult that # Makefile for documentation. @@ -90,13 +90,13 @@ lto.stagefeedback: # Use strict warnings for this front end. lto-warn = $(STRICT_WARN) -$(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIBDEPS) lto1.prev +$(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIBDEPS) $(lto1.prev) @$(call LINK_PROGRESS,$(INDEX.lto1),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(LTO_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) @$(call LINK_PROGRESS,$(INDEX.lto1),end) -$(LTO_DUMP_EXE): $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS) lto2.prev +$(LTO_DUMP_EXE): $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS) $(lto2.prev) @$(call LINK_PROGRESS,$(INDEX.lto2),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(LTO_DUMP_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) --- gcc/objc/Make-lang.in.jj 2020-11-19 12:34:10.852513100 +0100 +++ gcc/objc/Make-lang.in 2020-11-19 14:26:53.544447536 +0100 @@ -38,10 +38,10 @@ # # Define the names for selecting Objective-C in LANGUAGES. objc: cc1obj$(exeext) -objc.serial: objc +objc.serial = cc1obj$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: objc objc.serial objc.prev +.PHONY: objc # Use maximal warnings for this front end. objc-warn = $(STRICT_WARN) @@ -64,7 +64,7 @@ cc1obj-checksum.c : build/genchecksum$(b $(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) \ - $(LIBDEPS) objc.prev + $(LIBDEPS) $(objc.prev) @$(call LINK_PROGRESS,$(INDEX.objc),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \ --- gcc/objcp/Make-lang.in.jj 2020-11-19 12:34:10.852513100 +0100 +++ gcc/objcp/Make-lang.in 2020-11-19 14:27:49.570814060 +0100 @@ -39,10 +39,10 @@ # # Define the names for selecting Objective-C++ in LANGUAGES. obj-c++: cc1objplus$(exeext) -obj-c++.serial: obj-c++ +obj-c++.serial = cc1objplus$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: obj-c++ obj-c++.serial obj-c++.prev +.PHONY: obj-c++ # Use maximal warnings for this front end. Also, make ObjC and C++ # headers accessible. @@ -68,7 +68,7 @@ cc1objplus-checksum.c : build/genchecksu cc1objplus-checksum.c cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) \ - $(LIBDEPS) obj-c++.prev + $(LIBDEPS) $(obj-c++.prev) @$(call LINK_PROGRESS,$(INDEX.obj-c++),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) --- gcc/configure.jj 2020-11-19 12:34:10.762514130 +0100 +++ gcc/configure 2020-11-19 15:23:37.063244235 +0100 @@ -30769,7 +30769,7 @@ echo "SERIAL_LIST =" >> Make-hooks echo else >> Make-hooks lang_cnt=0 lang_list= -prev=c.serial +prev=c serialization_languages=c for lang in $all_selected_languages do @@ -30785,7 +30785,7 @@ do test $lang = c && continue lang_cnt=`expr $lang_cnt + 1` lang_list=" $prev$lang_list" - prev=${lang}.serial + prev=${lang} done echo "SERIAL_LIST = \$(wordlist \$(DO_LINK_SERIALIZATION),$lang_cnt,$lang_list)" >> Make-hooks echo endif >> Make-hooks @@ -30795,7 +30795,7 @@ lang_idx=1 for lang in $serialization_languages do test $lang = c && continue - echo "$lang.prev: \$(word $lang_cnt,\$(SERIAL_LIST))" >> Make-hooks + echo "$lang.prev = \$(if \$(word $lang_cnt,\$(SERIAL_LIST)),\$(\$(word $lang_cnt,\$(SERIAL_LIST)).serial))" >> Make-hooks echo "INDEX.$lang = $lang_idx" >> Make-hooks lang_cnt=`expr $lang_cnt - 1` lang_idx=`expr $lang_idx + 1` Jakub