X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fmklibgcc.in;h=9835f62c8d4b9f790bab744a2268f057b31a0633;hb=60f65a0a49e09022024224c76569fcfe389bcb26;hp=06c2ec0134ebf34d89e76b07ece9db0ee7ea2c8f;hpb=6af61abe034ab1a1025075ea23b7cff888cefbe4;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/mklibgcc.in b/gcc/mklibgcc.in index 06c2ec0134e..9835f62c8d4 100644 --- a/gcc/mklibgcc.in +++ b/gcc/mklibgcc.in @@ -1,6 +1,6 @@ #!/bin/sh # Construct makefile for libgcc. -# Copyright (C) 2000, 2002 Free Software Foundation, Inc. +# Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. # # This file is part of GCC. @@ -9,9 +9,8 @@ # # objext # LIB1ASMFUNCS -# LIB2FUNCS_1 -# LIB2FUNCS_2 # LIB2FUNCS_ST +# LIBGCOV # LIB2ADD # LIB2ADD_ST # LIB2ADDEH @@ -21,6 +20,8 @@ # LIB2_DIVMOD_FUNCS # DPBIT # DPBIT_FUNCS +# TPBIT +# TPBIT_FUNCS # LIBGCC # MULTILIBS # EXTRA_MULTILIB_PARTS @@ -32,7 +33,7 @@ # SHLIB_MAPFILES # SHLIB_NM_FLAGS # SHLIB_INSTALL -# SHLIB_SLIBDIR_SUFFIXES +# MULTILIB_OSDIRNAMES # Make needs VPATH to be literal. echo 'srcdir = @srcdir@' @@ -42,6 +43,16 @@ echo echo 'force:' echo +# Library members defined in libgcc2.c. +lib2funcs='_muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 + _cmpdi2 _ucmpdi2 _floatdidf _floatdisf _fixunsdfsi _fixunssfsi + _fixunsdfdi _fixdfdi _fixunssfdi _fixsfdi _fixxfdi _fixunsxfdi + _floatdixf _fixunsxfsi _fixtfdi _fixunstfdi _floatditf _clear_cache + _trampoline __main _absvsi2 _absvdi2 _addvsi3 _addvdi3 + _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 _negvsi2 _negvdi2 _ctors + _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 _ctzsi2 _ctzdi2 _popcount_tab + _popcountsi2 _popcountdi2 _paritysi2 _paritydi2' + # Disable SHLIB_LINK if shared libgcc not enabled. if [ "@enable_shared@" = "no" ]; then SHLIB_LINK="" @@ -56,12 +67,15 @@ make_compile='$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \ AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \ AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \ CC="$(CC)" CFLAGS="$(CFLAGS)" \ - HOST_PREFIX="$(HOST_PREFIX)" \ - HOST_PREFIX_1="$(HOST_PREFIX_1)" \ + BUILD_PREFIX="$(BUILD_PREFIX)" \ + BUILD_PREFIX_1="$(BUILD_PREFIX_1)" \ LANGUAGES="$(LANGUAGES)"' # Dependencies for libgcc2.c -libgcc2_c_dep='stmp-dirs $(srcdir)/libgcc2.c $(CONFIG_H) $(MACHMODE_H) longlong.h gbl-ctors.h config.status stmp-int-hdrs tsystem.h'" $LIB2ADDEHDEP" +libgcc2_c_dep='stmp-dirs $(srcdir)/libgcc2.c $(CONFIG_H) coretypes.h $(TM_H) $(MACHMODE_H) longlong.h gbl-ctors.h config.status stmp-int-hdrs tsystem.h'" $LIB2ADDEHDEP" + +# Dependencies for libgcov.c +libgcov_c_dep='stmp-dirs $(srcdir)/libgcov.c $(CONFIG_H) coretypes.h $(TM_H) $(MACHMODE_H) longlong.h gbl-ctors.h config.status stmp-int-hdrs tsystem.h $(srcdir)/gcov-io.h $(srcdir)/gcov-io.c gcov-iov.h' # Dependencies for fp-bit.c fpbit_c_dep='stmp-dirs config.status tsystem.h' @@ -82,14 +96,11 @@ for name in $LIB1ASMFUNCS; do echo " $gcc_compile" $flags -DL$name -xassembler-with-cpp \ -c '$(srcdir)/config/$(LIB1ASMSRC)' -o $out - # Remove any objects from LIB2FUNCS and LIB2_DIVMOD_FUNCS that are + # Remove any objects from lib2funcs and LIB2_DIVMOD_FUNCS that are # defined as optimized assembly code in LIB1ASMFUNCS. - LIB2FUNCS_1=`echo $LIB2FUNCS_1 | sed -e 's/^'$name' //' \ - -e 's/ '$name' / /' \ - -e 's/ '$name'$//'` - LIB2FUNCS_2=`echo $LIB2FUNCS_2 | sed -e 's/^'$name' //' \ - -e 's/ '$name' / /' \ - -e 's/ '$name'$//'` + lib2funcs=`echo $lib2funcs | sed -e 's/^'$name' //' \ + -e 's/ '$name' / /' \ + -e 's/ '$name'$//'` LIB2_DIVMOD_FUNCS=`echo $LIB2_DIVMOD_FUNCS | sed -e 's/^'$name' //' \ -e 's/ '$name' / /' \ -e 's/ '$name'$//'` @@ -105,14 +116,14 @@ libgcc2_objs="" libgcc2_st_objs="" libgcc2_eh_objs="" -for name in $LIB2FUNCS_1 $LIB2FUNCS_2; do +for name in $lib2funcs; do for ml in $MULTILIBS; do dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; out="libgcc/${dir}/${name}${objext}" echo $out: $libgcc2_c_dep - echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \ + echo " $gcc_compile" $flags -DL$name \ -c '$(srcdir)/libgcc2.c' -o $out done libgcc2_objs="$libgcc2_objs ${name}${objext}" @@ -125,7 +136,7 @@ for name in $LIB2FUNCS_ST; do out="libgcc/${dir}/${name}${objext}" echo $out: $libgcc2_c_dep - echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \ + echo " $gcc_compile" $flags -DL$name \ -c '$(srcdir)/libgcc2.c' -o $out done libgcc2_st_objs="$libgcc2_st_objs ${name}${objext}" @@ -138,7 +149,7 @@ for name in $LIB2_DIVMOD_FUNCS; do out="libgcc/${dir}/${name}${objext}" echo $out: $libgcc2_c_dep - echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \ + echo " $gcc_compile" $flags -DL$name \ -c '$(srcdir)/libgcc2.c' -fexceptions -fnon-call-exceptions -o $out done libgcc2_objs="$libgcc2_objs ${name}${objext}" @@ -174,6 +185,21 @@ if [ "$DPBIT" ]; then done fi +if [ "$TPBIT" ]; then + for name in $TPBIT_FUNCS; do + for ml in $MULTILIBS; do + dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` + flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; + out="libgcc/${dir}/${name}${objext}" + + echo $out: $TPBIT $fpbit_c_dep + echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \ + -c $TPBIT -o $out + done + libgcc2_objs="$libgcc2_objs ${name}${objext}" + done +fi + for file in $LIB2ADD; do name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'` oname=`echo $name | sed -e 's,.*/,,'` @@ -232,6 +258,25 @@ for file in $LIB2ADD_ST; do libgcc2_st_objs="$libgcc2_st_objs ${oname}${objext}" done +# +# build libgcov components +# + +libgcov_objs="" + +for name in $LIBGCOV; do + for ml in $MULTILIBS; do + dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` + flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; + out="libgcc/${dir}/${name}${objext}" + + echo $out: $libgcov_c_dep + echo " $gcc_compile" $flags -DL$name \ + -c '$(srcdir)/libgcov.c' -o $out + done + libgcov_objs="$libgcov_objs ${name}${objext}" +done + # SHLIB_MKMAP # SHLIB_MKMAP_OPTS # SHLIB_MAPFILES @@ -258,13 +303,28 @@ for ml in $MULTILIBS; do libgcc_st_objs="$libgcc_st_objs libgcc/${dir}/$o" done + libgcov_a_objs="" + for o in $libgcov_objs; do + libgcov_a_objs="$libgcov_a_objs libgcc/${dir}/$o" + done + if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" ]; then mapfile="libgcc/${dir}/libgcc.map" tmpmapfile="libgcc/${dir}/tmp-libgcc.map" - echo "" - echo "${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES $libgcc_sh_objs" - echo ' { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_sh_objs; echo %%; cat $SHLIB_MAPFILES; } | "'$(AWK)'" -f $SHLIB_MKMAP $SHLIB_MKMAP_OPTS > ${tmpmapfile}" - echo ' mv '"$tmpmapfile"' $@' + # This uses a here document instead of echos because some shells + # will convert the \1 in the second sed command to a control-A. + # The behavior of here documents is more predictable. + cat < ${tmpmapfile} + mv '$tmpmapfile' \$@ +EOF fi shlib_deps="$shlib_deps $mapfile" @@ -279,32 +339,46 @@ for ml in $MULTILIBS; do if [ "@libgcc_visibility@" = yes -a "$SHLIB_LINK" ]; then libgcc_a_objs= echo "" + echo "libgcc/${dir}/stacknote.s: stmp-dirs" + echo ' @( echo | $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) '${flags}' -S -o - -xc - | grep .note.GNU-stack || : ) > $@.tmp' + echo ' @mv -f $@.tmp $@' + echo "" for o in $libgcc_objs $libgcc_st_objs; do # .oS objects will have all non-local symbol definitions .hidden oS=`echo ${o} | sed s~${objext}'$~.oS~g'` - echo "${oS}: stmp-dirs ${o}" - echo ' @$(NM_FOR_TARGET) '${SHLIB_NM_FLAGS} ${o}' | $(AWK) '\''NF == 3 { print "\t.hidden", $$3 }'\'' | $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) '${flags}' -r -nostdinc -nostdlib -o $@ '${o}' -xassembler -' + echo "${oS}: stmp-dirs libgcc/${dir}/stacknote.s ${o}" + # non-GNU nm emits three fields even for undefined and typeless symbols, + # so explicitly omit them + echo ' ( $(NM_FOR_TARGET) '${SHLIB_NM_FLAGS} ${o}' | $(AWK) '\''NF == 3 && $$2 !~ /^[UN]$$/ { print "\t.hidden", $$3 }'\''; cat libgcc/${dir}/stacknote.s ) | $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) '${flags}' -r -nostdinc -nostdlib -o $@ '${o}' -xassembler -' libgcc_a_objs="${libgcc_a_objs} ${oS}" done fi + # Each of these .a files depends on stmp-dirs. It would seem that + # this dependency is redundant, since each of the object files + # itself depends on stmp-dirs. However, it is possible that there + # are in fact no object files. In that case, the stmp-dirs + # dependency is required; the directory containing the archive must + # exist before the archive itself can be created. echo "" - echo "${dir}/libgcc.a: $libgcc_a_objs" + echo "${dir}/libgcc.a: stmp-dirs $libgcc_a_objs" echo " -rm -rf ${dir}/libgcc.a" echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_a_objs - echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\ - echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\ - echo ' else true; fi;' + echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a + + echo "" + echo "${dir}/libgcov.a: stmp-dirs $libgcov_a_objs" + echo " -rm -rf ${dir}/libgcov.a" + echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcov.a $libgcov_a_objs + echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcov.a if [ "$SHLIB_LINK" ]; then echo "" - echo "${dir}/libgcc_eh.a: $libgcc_eh_objs" + echo "${dir}/libgcc_eh.a: stmp-dirs $libgcc_eh_objs" echo " -rm -rf ${dir}/libgcc_eh.a" echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc_eh.a $libgcc_eh_objs - echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\ - echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc_eh.a ';' \\ - echo ' else true; fi;' + echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc_eh.a if [ -z "$SHLIB_MULTILIB" ]; then if [ "$dir" = . ]; then @@ -314,22 +388,23 @@ for ml in $MULTILIBS; do fi shlib_so_name="$shlib_base_name" shlib_dir= - if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then + shlib_slibdir_qual= + if [ -n "$MULTILIB_OSDIRNAMES" ]; then if [ "$dir" != . ]; then + gcc_multilib_dir=`./xgcc -B./ $flags --print-multi-directory` + os_multilib_dir=`./xgcc -B./ $flags --print-multi-os-directory` shlib_dir="$dir"/ - for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do - base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'` - if [ "$dir" = "$base_ml_dir" ]; then - shlib_so_name=libgcc_s - break - else - canon_dir=`echo $dir | sed -n -e "s:$base_ml_dir/::p"` - if [ -n "$canon_dir" ]; then - shlib_so_name=libgcc_s_`echo $canon_dir | sed s,/,_,g` - break - fi + gcc_multilib_sup=`echo $gcc_multilib_dir | sed 's~^[^/]*/~~'` + os_multilib_base=`echo $os_multilib_dir | sed -n "s~/${gcc_multilib_sup}\$~~p"` + if [ -z "$os_multilib_base" ]; then + shlib_so_name=libgcc_s + if [ "$os_multilib_dir" != "." ]; then + shlib_slibdir_qual="/$os_multilib_dir" fi - done + else + shlib_so_name=libgcc_s_`echo $gcc_multilib_sup | sed s,/,_,g` + shlib_slibdir_qual="/$os_multilib_base" + fi fi fi echo "" @@ -341,7 +416,8 @@ for ml in $MULTILIBS; do -e "s%@shlib_base_name@%$shlib_base_name%g" \ -e "s%@shlib_map_file@%$mapfile%g" \ -e "s%@shlib_so_name@%$shlib_so_name%g" \ - -e "s%@shlib_dir@%$shlib_dir%g" + -e "s%@shlib_dir@%$shlib_dir%g" \ + -e "s%@shlib_slibdir_qual@%%g" elif [ "$SHLIB_MULTILIB" = "$dir" ]; then shlib_base_name="libgcc_s"; echo "" @@ -353,7 +429,8 @@ for ml in $MULTILIBS; do -e "s%@shlib_base_name@%$shlib_base_name%g" \ -e "s%@shlib_map_file@%$mapfile%g" \ -e "s%@shlib_so_name@%$shlib_base_name%g" \ - -e "s%@shlib_dir@%%g" + -e "s%@shlib_dir@%%g" \ + -e "s%@shlib_slibdir_qual@%%g" fi fi done @@ -362,16 +439,18 @@ dirs=libgcc for ml in $MULTILIBS; do dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` if [ $dir != . ]; then - dirs="$dirs libgcc/${dir}" + dirs="$dirs ${dir} libgcc/${dir}" fi done echo '' echo 'libgcc-stage-start:' echo ' for dir in '"${dirs}"'; do \' -echo ' if [ -d $(stage)/$$dir ]; then true; else mkdir $(stage)/$$dir; fi; \' +echo ' if [ -d $(stage)/$$dir ]; then true; else '$mkinstalldirs' $(stage)/$$dir; fi; \' echo ' done' echo ' -for dir in '"${dirs}"'; do \' echo ' mv $$dir/*'"${objext}"' $(stage)/$$dir; \' +echo ' test ! -f $$dir/stacknote.s || mv $$dir/stacknote.s $(stage)/$$dir; \' +echo ' test ! -f $$dir/libgcc.a || mv $$dir/lib* $(stage)/$$dir; \' echo ' done' echo "" @@ -383,7 +462,7 @@ for ml in $MULTILIBS; do if [ $dir != . ]; then dirs="$dirs ${dir} libgcc/${dir}" fi - all="$all ${dir}/libgcc.a" + all="$all ${dir}/libgcc.a ${dir}/libgcov.a" if [ "$SHLIB_LINK" ]; then all="$all ${dir}/libgcc_eh.a" if [ -z "$SHLIB_MULTILIB" ]; then @@ -435,14 +514,17 @@ echo "" echo "install: $all" for ml in $MULTILIBS; do dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` + flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; if [ $dir != . ]; then - ldir='$(libsubdir)'/$dir - echo " if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;" + ldir='$(DESTDIR)$(libsubdir)'/$dir + echo " if [ -d $ldir ]; then true; else $mkinstalldirs $ldir; chmod a+rx $ldir; fi;" else - ldir='$(libsubdir)' + ldir='$(DESTDIR)$(libsubdir)' fi echo ' $(INSTALL_DATA)' ${dir}/libgcc.a ${ldir}/ echo ' $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a + echo ' $(INSTALL_DATA)' ${dir}/libgcov.a ${ldir}/ + echo ' $(RANLIB_FOR_TARGET)' ${ldir}/libgcov.a if [ "$SHLIB_LINK" ]; then echo ' $(INSTALL_DATA)' ${dir}/libgcc_eh.a ${ldir}/ @@ -457,39 +539,22 @@ for ml in $MULTILIBS; do shlib_so_name="$shlib_base_name" shlib_dir= shlib_slibdir_qual= - if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then - shlib_slibdir_qual=none + if [ -n "$MULTILIB_OSDIRNAMES" ]; then + gcc_multilib_dir=`./xgcc -B./ $flags --print-multi-directory` + os_multilib_dir=`./xgcc -B./ $flags --print-multi-os-directory` if [ "$dir" != . ]; then shlib_dir="$dir"/ - for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do - base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'` - if [ "$dir" = "$base_ml_dir" ]; then - shlib_so_name=libgcc_s - shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'` - break - else - canon_dir=`echo $dir | sed -n -e "s:$base_ml_dir/::p"` - if [ -n "$canon_dir" ]; then - shlib_so_name=libgcc_s_`echo $canon_dir | sed s,/,_,g` - shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'` - break - fi - fi - done fi - if [ "$shlib_slibdir_qual" = none ]; then - for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do - base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'` - shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'` - for ml2 in $MULTILIBS; do - dir2=`echo ${ml2} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` - if [ "$base_ml_dir" = "$dir2" ]; then - shlib_slibdir_qual= - break - fi - done - if [ -n "$shlib_slibdir_qual" ]; then break; fi - done + gcc_multilib_sup=`echo $gcc_multilib_dir | sed 's~^[^/]*/~~'` + os_multilib_base=`echo $os_multilib_dir | sed -n "s~/${gcc_multilib_sup}\$~~p"` + if [ -z "$os_multilib_base" ]; then + shlib_so_name=libgcc_s + if [ "$os_multilib_dir" != "." ]; then + shlib_slibdir_qual="/$os_multilib_dir" + fi + else + shlib_so_name=libgcc_s_`echo $gcc_multilib_sup | sed s,/,_,g` + shlib_slibdir_qual="/$os_multilib_base" fi fi echo " $SHLIB_INSTALL" \ @@ -512,10 +577,10 @@ for f in $EXTRA_MULTILIB_PARTS; do dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'` if [ $dir != . ]; then out=${dir}/$f - ldir='$(libsubdir)'/$dir + ldir='$(DESTDIR)$(libsubdir)'/$dir else out=$f - ldir='$(libsubdir)' + ldir='$(DESTDIR)$(libsubdir)' fi echo ' $(INSTALL_DATA)' $out $ldir/ done