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