PATCH: PR bootstrap/18532: libgcc.mk isn't parallel build safe for multilib

H. J. Lu hjl@lucon.org
Thu Dec 2 17:36:00 GMT 2004


On Wed, Dec 01, 2004 at 10:50:28PM -0800, Zack Weinberg wrote:
> "H. J. Lu" <hjl@lucon.org> writes:
> 
> > On Wed, Dec 01, 2004 at 05:16:30PM -0800, Zack Weinberg wrote:
> >> "H. J. Lu" <hjl@lucon.org> writes:
> >> 
> >> > I updated my patch for PR bootstrap/18532 since mklibgcc.in has been
> >> > modified.
> >> 
> >> I'm not terribly confident in this patch.  Could you please show
> >> before-and-after diffs of the generated libgcc.mk for a target that
> >> uses EXTRA_MULTILIB_PARTS?  That will make it easier to evaluate.
> >> 
> >
> > I fixed some typos. Here is the updated patch and old/new libgcc.mks.
> 
> Thanks (but I asked for diffs, not complete copies of old and new
> files).
> 
> I don't see the need for the dependency on $prev_extra, could you
> explain why that is there?  I'd think it would be preferable either
> to invoke recursive make just once with *all* the EXTRA_MULTILIB_PARTS
> targets (across all the multilibs) or else to allow the recursive
> makes for each multilib to run in parallel.

We need it since each multilib is built with

$(MAKE) T=$dir ...

"$dir" is different in each build. We may not do it in parallel safely,
which is PR bootstrap/18532. We may only do it safely one multilib at a
time.

> 
> Also, some nitpicks: You should hoist the definition of $suffix
> from where you have it (and from the other place it appears, in the
> SHLIB_LINK logic at the beginning of the loop over all multilibs) to
> next to the definition of $dir and $flags, and add it to the set of
> variables printed out in comments for each multilib.

I removed my suffix.

> 
> The \$(filter-out $foobar_so_extra,\$(objects)) nonsense in the shared
> library link, and therefore the need to keep $foobar_so_extra around,
> should now be unnecessary; please take that out and retest.

Done.

> 
> zw

Here are the updated patch and diff against the old libgcc.mk


H.J.
----
2004-12-02  H.J. Lu  <hongjiu.lu@intel.com>

	PR bootstrap/18532
	* mklibgcc.in: Only run make one at a time for multilib.

--- gcc/mklibgcc.in.multilib	2004-12-01 10:11:00.000000000 -0800
+++ gcc/mklibgcc.in	2004-12-02 09:08:47.153513885 -0800
@@ -147,6 +147,7 @@ done
 # Rules to generate object files.
 #
 
+prev_extra=
 for ml in $MULTILIBS; do
 
   # Work out relevant parameters that depend only on the multilib.
@@ -655,37 +656,37 @@ for ml in $MULTILIBS; do
   done
 
   # EXTRA_MULTILIB_PARTS.
-  echo
-  for f in $EXTRA_MULTILIB_PARTS; do
-    case $dir in
-    .) out=$f ; t= ;;
-    *) out=$dir/$f ; t=$dir/ ;;
-    esac
-    case $out in
-    # Prevent `make' from interpreting $out as a macro assignment
-    *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
-    *) targ=$out ;;
-    esac
+  if [ -n "$EXTRA_MULTILIB_PARTS" ]; then
+    # We can't have individual element in EXTRA_MULTILIB_PARTS as a
+    # target since it won't be parallel build safe.  We bundle them
+    # together and pass them to Makefile. libgcc.mk has no knowledge
+    # of if and how EXTRA_MULTILIB_PARTS are built.
+    
+    extra=
+    extra_out=
+    echo
+    for f in $EXTRA_MULTILIB_PARTS; do
+      case $dir in
+      .) out=$f ; t= ;;
+      *) out=$dir/$f ; t=$dir/ ;;
+      esac
+      case $out in
+      # Prevent `make' from interpreting $out as a macro assignment
+      *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
+      *) targ=$out ;;
+      esac
+      extra_out="$extra_out $out"
+      extra="$extra $targ"
+    done
 
-    echo $out: stmp-dirs
+    echo extra$suffix: stmp-dirs $prev_extra
     echo "	$make_compile" \\
     echo '	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
-    echo '	  MULTILIB_CFLAGS="'$flags'"' T=$t $targ
-    echo "all: $out"
+    echo '	  MULTILIB_CFLAGS="'$flags'"' T=$t $extra
+    echo "all: extra$suffix"
 
-    # Make libunwind.so and libgcc_s.so depend on these, since they are
-    # likely to be implicitly used by the link process.  However, we must
-    # then arrange to remove them from the explicit object list generated
-    # from $^ - see below.
-    if [ "$libgcc_s_so" ]; then
-      libgcc_s_so_extra="$libgcc_s_so_extra $out"
-      echo "$libgcc_s_so: $out"
-    fi
-    if [ "$libunwind_so" ]; then
-      libunwind_so_extra="$libunwind_so_extra $out"
-      echo "$libunwind_so: $out"
-    fi
-  done
+    prev_extra=extra$suffix
+  fi
 
   # Library build rules.
   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
@@ -760,7 +761,7 @@ EOF
     echo "	$SHLIB_LINK" \
 	 | sed -e "s%@multilib_flags@%$flags%g" \
 	       -e "s%@multilib_dir@%$dir%g" \
-	       -e "s%@shlib_objs@%\$(filter-out $libgcc_s_so_extra,\$(objects))%g" \
+	       -e "s%@shlib_objs@%\$(objects)%g" \
 	       -e "s%@shlib_base_name@%$libgcc_s_so_base%g" \
 	       -e "s%@shlib_so_name@%$libgcc_s_soname%g" \
 	       -e "s%@shlib_map_file@%$mapfile%g" \
@@ -775,7 +776,7 @@ EOF
     echo "	$SHLIBUNWIND_LINK" \
 	   | sed -e "s%@multilib_flags@%$flags%g" \
 		 -e "s%@multilib_dir@%$dir%g" \
-		 -e "s%@shlib_objs@%\$(filter-out $libunwind_so_extra,\$(objects))%g" \
+		 -e "s%@shlib_objs@%\$(objects)%g" \
 		 -e "s%@shlib_base_name@%$libunwind_so_base%g" \
 		 -e "s%@shlib_so_name@%$libunwind_soname%g" \
 		 -e "s%@shlib_dir@%$shlib_dir%g" \
-------------- next part --------------
--- /tmp/libgcc.mk.old	2004-12-01 21:15:48.000000000 -0800
+++ libgcc.mk	2004-12-02 09:09:56.000000000 -0800
@@ -510,7 +510,7 @@ libgcc/./_gcov_execve.o: stmp-dirs $(src
 	$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)  -DL_gcov_execve -c $(srcdir)/libgcov.c -o libgcc/./_gcov_execve.o
 ./libgcov.a: libgcc/./_gcov_execve.o
 
-crtbegin.o: stmp-dirs
+extra: stmp-dirs
 	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
 	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
 	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
@@ -521,65 +521,8 @@ crtbegin.o: stmp-dirs
 	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
 	  LANGUAGES="$(LANGUAGES)" \
 	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) "  \
-	  MULTILIB_CFLAGS="" T= crtbegin.o
-all: crtbegin.o
-./libgcc_s.so: crtbegin.o
-crtend.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) "  \
-	  MULTILIB_CFLAGS="" T= crtend.o
-all: crtend.o
-./libgcc_s.so: crtend.o
-crtbeginS.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) "  \
-	  MULTILIB_CFLAGS="" T= crtbeginS.o
-all: crtbeginS.o
-./libgcc_s.so: crtbeginS.o
-crtendS.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) "  \
-	  MULTILIB_CFLAGS="" T= crtendS.o
-all: crtendS.o
-./libgcc_s.so: crtendS.o
-crtbeginT.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) "  \
-	  MULTILIB_CFLAGS="" T= crtbeginT.o
-all: crtbeginT.o
-./libgcc_s.so: crtbeginT.o
+	  MULTILIB_CFLAGS="" T= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+all: extra
 
 libgcc/./libgcc.map: /net/gnu/export/gnu/src/gcc/gcc/gcc/mkmap-symver.awk /net/gnu/export/gnu/src/gcc/gcc/gcc/libgcc-std.ver /net/gnu/export/gnu/src/gcc/gcc/gcc/config/i386/libgcc-x86_64-glibc.ver
 	{ $(NM_FOR_TARGET) -pg $(objects); echo %%; \
@@ -610,7 +553,7 @@ all: ./libgcov.a
 all: ./libgcc_eh.a
 
 ./libgcc_s.so: stmp-dirs 
-	 ./xgcc -B./ -B/usr/gcc-4.0/x86_64-unknown-linux-gnu/bin/ -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/include -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/sys-include -L/export/build/gnu/gcc-debug/build-x86_64-linux/gcc/../ld -O2  -DIN_GCC    -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc/./libgcc.map -o libgcc_s.so.1.tmp  $(filter-out  crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o,$(objects)) -lc && rm -f ./libgcc_s.so && if [ -f libgcc_s.so.1 ]; then mv -f libgcc_s.so.1 libgcc_s.so.1.backup; else true; fi && mv libgcc_s.so.1.tmp libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so
+	 ./xgcc -B./ -B/usr/gcc-4.0/x86_64-unknown-linux-gnu/bin/ -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/include -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/sys-include -L/export/build/gnu/gcc/build-x86_64-linux/gcc/../ld -O2  -DIN_GCC    -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc/./libgcc.map -o libgcc_s.so.1.tmp  $(objects) -lc && rm -f ./libgcc_s.so && if [ -f libgcc_s.so.1 ]; then mv -f libgcc_s.so.1 libgcc_s.so.1.backup; else true; fi && mv libgcc_s.so.1.tmp libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so
 all: ./libgcc_s.so
 
 #
@@ -1100,63 +1043,7 @@ libgcc/32/_gcov_execve.o: stmp-dirs $(sr
 	$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)  -m32 -DL_gcov_execve -c $(srcdir)/libgcov.c -o libgcc/32/_gcov_execve.o
 32/libgcov.a: libgcc/32/_gcov_execve.o
 
-32/crtbegin.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) -m32 "  \
-	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtbegin.o
-all: 32/crtbegin.o
-32/libgcc_s_32.so: 32/crtbegin.o
-32/crtend.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) -m32 "  \
-	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtend.o
-all: 32/crtend.o
-32/libgcc_s_32.so: 32/crtend.o
-32/crtbeginS.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) -m32 "  \
-	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtbeginS.o
-all: 32/crtbeginS.o
-32/libgcc_s_32.so: 32/crtbeginS.o
-32/crtendS.o: stmp-dirs
-	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
-	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
-	  AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
-	  AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
-	  CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	  BUILD_PREFIX="$(BUILD_PREFIX)" \
-	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
-	  LANGUAGES="$(LANGUAGES)" \
-	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) -m32 "  \
-	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtendS.o
-all: 32/crtendS.o
-32/libgcc_s_32.so: 32/crtendS.o
-32/crtbeginT.o: stmp-dirs
+extra32: stmp-dirs extra
 	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
 	  AR_FOR_TARGET="$(AR_FOR_TARGET)" \
 	  AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
@@ -1167,9 +1054,8 @@ all: 32/crtendS.o
 	  BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \
 	  LANGUAGES="$(LANGUAGES)" \
 	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS) -m32 "  \
-	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtbeginT.o
-all: 32/crtbeginT.o
-32/libgcc_s_32.so: 32/crtbeginT.o
+	  MULTILIB_CFLAGS=" -m32" T=32/ 32/crtbegin.o 32/crtend.o 32/crtbeginS.o 32/crtendS.o 32/crtbeginT.o
+all: extra32
 
 libgcc/32/libgcc.map: /net/gnu/export/gnu/src/gcc/gcc/gcc/mkmap-symver.awk /net/gnu/export/gnu/src/gcc/gcc/gcc/libgcc-std.ver /net/gnu/export/gnu/src/gcc/gcc/gcc/config/i386/libgcc-x86_64-glibc.ver
 	{ $(NM_FOR_TARGET) -pg $(objects); echo %%; \
@@ -1200,7 +1086,7 @@ all: 32/libgcov.a
 all: 32/libgcc_eh.a
 
 32/libgcc_s_32.so: stmp-dirs 
-	 ./xgcc -B./ -B/usr/gcc-4.0/x86_64-unknown-linux-gnu/bin/ -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/include -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/sys-include -L/export/build/gnu/gcc-debug/build-x86_64-linux/gcc/../ld -O2  -DIN_GCC    -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc/32/libgcc.map -o 32/libgcc_s.so.1.tmp  -m32 $(filter-out  32/crtbegin.o 32/crtend.o 32/crtbeginS.o 32/crtendS.o 32/crtbeginT.o,$(objects)) -lc && rm -f 32/libgcc_s_32.so && if [ -f 32/libgcc_s.so.1 ]; then mv -f 32/libgcc_s.so.1 32/libgcc_s.so.1.backup; else true; fi && mv 32/libgcc_s.so.1.tmp 32/libgcc_s.so.1 && ln -s 32/libgcc_s.so.1 32/libgcc_s_32.so
+	 ./xgcc -B./ -B/usr/gcc-4.0/x86_64-unknown-linux-gnu/bin/ -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/include -isystem /usr/gcc-4.0/x86_64-unknown-linux-gnu/sys-include -L/export/build/gnu/gcc/build-x86_64-linux/gcc/../ld -O2  -DIN_GCC    -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc/32/libgcc.map -o 32/libgcc_s.so.1.tmp  -m32 $(objects) -lc && rm -f 32/libgcc_s_32.so && if [ -f 32/libgcc_s.so.1 ]; then mv -f 32/libgcc_s.so.1 32/libgcc_s.so.1.backup; else true; fi && mv 32/libgcc_s.so.1.tmp 32/libgcc_s.so.1 && ln -s 32/libgcc_s.so.1 32/libgcc_s_32.so
 all: 32/libgcc_s_32.so
 
 libgcc-stage-start:


More information about the Gcc-patches mailing list