OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / mklibgcc.in
index b36d31e..60e3905 100644 (file)
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Construct makefile for libgcc.
-#   Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+#   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006
+#   Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 
@@ -10,6 +11,7 @@
 # objext
 # LIB1ASMFUNCS
 # LIB2FUNCS_ST
+# LIB2FUNCS_EXCLUDE
 # LIBGCOV
 # LIB2ADD
 # LIB2ADD_ST 
 # FPBIT
 # FPBIT_FUNCS
 # LIB2_DIVMOD_FUNCS
+# LIB2_SIDITI_CONV_FUNCS
+# DFP_ENABLE
+# DFP_CFLAGS
 # DPBIT
 # DPBIT_FUNCS
 # TPBIT
 # TPBIT_FUNCS
+# D32PBIT
+# D32PBIT_FUNCS
+# D64PBIT
+# D64PBIT_FUNCS
+# D128PBIT
+# D128PBIT_FUNCS
 # LIBGCC
 # MULTILIBS
 # EXTRA_MULTILIB_PARTS
@@ -54,16 +65,48 @@ echo 'dirs = libgcc'
 echo
 
 # Library members defined in libgcc2.c.
+
+# The floating-point conversion routines that involve a single-word integer.
+# XX stands for the integer mode.
+swfloatfuncs=
+for mode in sf df xf; do
+  swfloatfuncs="$swfloatfuncs _fixuns${mode}XX"
+done
+
+# Likewise double-word routines.
+dwfloatfuncs=
+for mode in sf df xf tf; do
+  dwfloatfuncs="$dwfloatfuncs _fix${mode}XX _fixuns${mode}XX"
+  dwfloatfuncs="$dwfloatfuncs _floatXX${mode} _floatunXX${mode}"
+done
+
+# Entries of the form <objfile>:<func>:<wordsize> indicate that libgcc2.c
+# should be compiled with L<func> defined and with LIBGCC2_UNITS_PER_WORD
+# set to <wordsize>.  <objfile> is the name of the associated object file
+
 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
+       _cmpdi2 _ucmpdi2 _clear_cache
        _enable_execute_stack _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 _powisf2 _powidf2
        _powixf2 _powitf2 _mulsc3 _muldc3 _mulxc3 _multc3 _divsc3 _divdc3
-       _divxc3 _divtc3'
+       _divxc3 _divtc3 _bswapsi2 _bswapdi2'
+
+if [ "$LIB2_SIDITI_CONV_FUNCS" ]; then
+  for func in $swfloatfuncs; do
+    sifunc=`echo $func | sed -e 's/XX/si/'`
+    lib2funcs="$lib2funcs $sifunc:$sifunc:4"
+  done
+  for func in $dwfloatfuncs; do
+    difunc=`echo $func | sed -e 's/XX/di/'`
+    tifunc=`echo $func | sed -e 's/XX/ti/'`
+    lib2funcs="$lib2funcs $difunc:$difunc:4 $tifunc:$difunc:8"
+  done
+else
+  lib2funcs="$lib2funcs `echo $swfloatfuncs | sed -e 's/XX/si/g'`"
+  lib2funcs="$lib2funcs `echo $dwfloatfuncs | sed -e 's/XX/di/g'`"
+fi
 
 # Disable SHLIB_LINK if shared libgcc not enabled.
 if [ "@enable_shared@" = "no" ]; then
@@ -96,6 +139,12 @@ libgcov_c_dep='stmp-dirs $(srcdir)/libgcov.c $(srcdir)/gcov-io.h $(srcdir)/gcov-
 # Dependencies for fp-bit.c
 fpbit_c_dep='stmp-dirs config.status tsystem.h'
 
+# Dependencies for decnumber and friends.  This is an overzealous set,
+# but at least we can be sure to recompile if anything gets modified.
+decnumber_dep='stmp-dirs $(srcdir)/../libdecnumber/decContext.h $(srcdir)/../libdecnumber/decNumber.h
+       $(srcdir)/../libdecnumber/decNumberLocal.h $(srcdir)/../libdecnumber/decimal32.h $(srcdir)/../libdecnumber/decimal64.h
+       $(srcdir)/../libdecnumber/decimal128.h $(srcdir)/../libdecnumber/decDPD.h $(srcdir)/../libdecnumber/decUtility.h'
+
 # Flag whether we need eh_dummy.c
 need_eh_dummy=
 
@@ -143,10 +192,11 @@ else
 fi
 
 # Remove any objects from lib2funcs and LIB2_DIVMOD_FUNCS that are
-# defined as optimized assembly code in LIB1ASMFUNCS.
-for name in $LIB1ASMFUNCS; do
-  lib2funcs=`echo $lib2funcs | sed -e 's/^'$name' //' \
-                                  -e 's/ '$name' / /' \
+# defined as optimized assembly code in LIB1ASMFUNCS or as C code
+# in LIB2FUNCS_EXCLUDE.
+for name in $LIB1ASMFUNCS $LIB2FUNCS_EXCLUDE; do
+  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' / /' \
@@ -248,16 +298,25 @@ for ml in $MULTILIBS; do
   #
 
   for name in $lib2funcs; do
+    case $name in
+      *:*:*)
+       defines=`echo $name | sed -e 's/.*:\(.*\):\(.*\)/-DL\1 -DLIBGCC2_UNITS_PER_WORD=\2/'`
+       name=`echo $name | sed -e 's/\(.*\):.*:.*/\1/'`
+       ;;
+      *)
+       defines="-DL$name"
+       ;;
+    esac
     if [ "$libgcc_s_so" ]; then
       out="libgcc/${dir}/${name}${objext}"
       outS="libgcc/${dir}/${name}_s${objext}"
 
       echo $outS: $libgcc2_c_dep
-      echo "   $gcc_s_compile" $flags -DL$name -c '$(srcdir)/libgcc2.c' \
+      echo "   $gcc_s_compile" $flags $defines -c '$(srcdir)/libgcc2.c' \
        -o $outS
 
       echo $out: $libgcc2_c_dep
-      echo "   $gcc_compile" $flags -DL$name '$(vis_hide)' \
+      echo "   $gcc_compile" $flags $defines '$(vis_hide)' \
         -c '$(srcdir)/libgcc2.c' -o $out
 
       echo $libgcc_a: $out
@@ -268,7 +327,7 @@ for ml in $MULTILIBS; do
     else
       out="libgcc/${dir}/${name}${objext}"
       echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
-      echo "   $gcc_compile" $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $out
+      echo "   $gcc_compile" $flags $defines -c '$(srcdir)/libgcc2.c' -o $out
       echo $libgcc_a: $out
     fi
   done
@@ -313,92 +372,95 @@ for ml in $MULTILIBS; do
   # Build software floating point functions.
   #
 
-  if [ "$FPBIT" ]; then
-    for name in $FPBIT_FUNCS; do
-      if [ "$libgcc_s_so" ]; then
-       out="libgcc/${dir}/${name}${objext}"
-       outS="libgcc/${dir}/${name}_s${objext}"
-
-       echo $outS: $FPBIT $fpbit_c_dep
-       echo "  $gcc_s_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $FPBIT -o $outS
-
-        echo $out: $FPBIT $fpbit_c_dep
-        echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         '$(vis_hide)' -c $FPBIT -o $out
-
-       echo $libgcc_a: $out
-       echo $libgcc_s_so: $outS
-       if [ "$SHLIB_MKMAP" ]; then
-         echo libgcc/${dir}/libgcc.map: $outS
-       fi
-      else
-       out="libgcc/${dir}/${name}${objext}"
-       echo $out: $FPBIT $fpbit_c_dep
-       echo "  $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $FPBIT -o $out
-
-       echo $libgcc_a: $out
+  for fpbit_var in FPBIT DPBIT TPBIT ; do
+      fpfuncs_var="${fpbit_var}_FUNCS"
+      eval fpbit=\$$fpbit_var
+      eval fpfuncs=\$$fpfuncs_var
+
+      if [ "$fpbit" ] ; then
+         for name in $fpfuncs; do
+             case "$name" in
+               # _sf_to_tf and _df_to_tf require tp-bit.c
+               # being compiled in.
+               _[sd]f_to_tf) [ -z "$TPBIT" ] && continue;;
+             esac
+             if [ "$libgcc_s_so" ]; then
+                 out="libgcc/${dir}/${name}${objext}"
+                 outS="libgcc/${dir}/${name}_s${objext}"
+
+                 echo $outS: $fpbit $fpbit_c_dep
+                 echo "        $gcc_s_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
+                     -c $fpbit -o $outS
+
+                 echo $out: $fpbit $fpbit_c_dep
+                 echo "        $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
+                     '$(vis_hide)' -c $fpbit -o $out
+                 
+                 echo $libgcc_a: $out
+                 echo $libgcc_s_so: $outS
+                 if [ "$SHLIB_MKMAP" ]; then
+                     echo libgcc/${dir}/libgcc.map: $outS
+                 fi
+             else
+                 out="libgcc/${dir}/${name}${objext}"
+                 echo $out: $fpbit $fpbit_c_dep
+                 echo "        $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
+                     -c $fpbit -o $out
+                 
+                 echo $libgcc_a: $out
+             fi
+         done
       fi
-    done
-  fi
-
-  if [ "$DPBIT" ]; then
-    for name in $DPBIT_FUNCS; do
-      if [ "$libgcc_s_so" ]; then
-       out="libgcc/${dir}/${name}${objext}"
-       outS="libgcc/${dir}/${name}_s${objext}"
+  done
 
-       echo $outS: $DPBIT $fpbit_c_dep
-       echo "  $gcc_s_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $DPBIT -o $outS
+  if [ "@enable_decimal_float@" = "yes" -a -z "$libgcc_so" ]; then
+    # If $DFP_ENABLE is set, then we want all data type sizes.
+    if [ "$DFP_ENABLE" ] ; then
+       D32PBIT=1; D64PBIT=1; D128PBIT=1
+    fi
 
-        echo $out: $DPBIT $fpbit_c_dep
-        echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         '$(vis_hide)' -c $DPBIT -o $out
+    # Bring in the DFP support code if D32PBIT, D64PBIT or D128PBIT are set.
+    if [ -n "$D32PBIT" -o -n "$D64PBIT" -o -n "$D128PBIT" ] ; then
+      dec_filenames="decContext decNumber decRound decLibrary decUtility"
+    fi
 
-       echo $libgcc_a: $out
-       echo $libgcc_s_so: $outS
-       if [ "$SHLIB_MKMAP" ]; then
-         echo libgcc/${dir}/libgcc.map: $outS
-       fi
-      else
-       out="libgcc/${dir}/${name}${objext}"
-       echo $out: $DPBIT $fpbit_c_dep
-       echo "  $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $DPBIT -o $out
+    # Only bring in decimal*.c files for types we support.
+    if [ -n "$D32PBIT" ] ; then
+      dec_filenames="$dec_filenames decimal32"
+    fi
+    if [ -n "$D64PBIT" ] ; then
+      dec_filenames="$dec_filenames decimal64"
+    fi
+    if [ -n "$D128PBIT" ] ; then
+      dec_filenames="$dec_filenames decimal128"
+    fi
 
-       echo $libgcc_a: $out
-      fi
+    for name in $dec_filenames ; do
+      out="libgcc/${dir}/${name}${objext}"
+      echo $out: "\$(srcdir)/../libdecnumber/${name}.c" $decnumber_dep
+      echo "   $gcc_compile" $flags -c "\$(srcdir)/../libdecnumber/${name}.c" -o $out
+      echo $libgcc_a: $out
     done
-  fi
-
-  if [ "$TPBIT" ]; then
-    for name in $TPBIT_FUNCS; do
-      if [ "$libgcc_s_so" ]; then
-       out="libgcc/${dir}/${name}${objext}"
-       outS="libgcc/${dir}/${name}_s${objext}"
 
-       echo $outS: $TPBIT $fpbit_c_dep
-       echo "  $gcc_s_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $TPBIT -o $outS
-
-        echo $out: $TPBIT $fpbit_c_dep
-        echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         '$(vis_hide)' -c $TPBIT -o $out
-
-       echo $libgcc_a: $out
-       echo $libgcc_s_so: $outS
-       if [ "$SHLIB_MKMAP" ]; then
-         echo libgcc/${dir}/libgcc.map: $outS
-       fi
-      else
-       out="libgcc/${dir}/${name}${objext}"
-       echo $out: $TPBIT $fpbit_c_dep
-       echo "  $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
-         -c $TPBIT -o $out
+    # For individual functions, loop over each variable by name.
+    for dpbit_var in D32PBIT D64PBIT D128PBIT ; do
+      dpfuncs_var="${dpbit_var}_FUNCS"
+      eval dpbit=\$$dpbit_var
+      eval dpfuncs=\$$dpfuncs_var
+      case "$dpbit_var" in
+         D32PBIT)  dpwidth=32 ;;
+         D64PBIT)  dpwidth=64 ;;
+         D128PBIT) dpwidth=128 ;;
+      esac
 
-       echo $libgcc_a: $out
+      if [ "$dpbit" ]; then
+        for name in $dpfuncs; do
+          out="libgcc/${dir}/${name}${objext}"
+         echo $out: config/dfp-bit.h config/dfp-bit.c $fpbit_c_dep
+         echo "        $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name -DWIDTH=$dpwidth \
+             $DFP_CFLAGS -c $\(srcdir\)/config/dfp-bit.c -o $out
+         echo $libgcc_a: $out
+        done
       fi
     done
   fi
@@ -806,7 +868,7 @@ echo "      if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi"
 
 if [ "$need_eh_dummy" ]; then
   echo "eh_dummy.c:"
-  echo "       echo 'struct eh_dummy;' > \$@"
+  echo "       echo 'int __libgcc_eh_dummy;' > \$@"
 fi
 
 echo ""
@@ -821,12 +883,15 @@ for ml in $MULTILIBS; do
     ldir='$(DESTDIR)$(libsubdir)'
   fi
   echo '       $(INSTALL_DATA)' ${dir}/libgcc.a ${ldir}/
+  echo '       chmod 644'  ${ldir}/libgcc.a
   echo '       $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
   echo '       $(INSTALL_DATA)' ${dir}/libgcov.a ${ldir}/
+  echo '       chmod 644'  ${ldir}/libgcov.a
   echo '       $(RANLIB_FOR_TARGET)' ${ldir}/libgcov.a
 
   if [ "$SHLIB_LINK" ]; then
     echo '     $(INSTALL_DATA)' ${dir}/libgcc_eh.a ${ldir}/
+    echo '     chmod 644'  ${ldir}/libgcc_eh.a
     echo '     $(RANLIB_FOR_TARGET)' ${ldir}/libgcc_eh.a
 
     shlib_slibdir_qual=
@@ -845,6 +910,7 @@ for ml in $MULTILIBS; do
              -e "s%@shlib_slibdir_qual@%$shlib_slibdir_qual%g"
       libunwinddir='$(DESTDIR)$(slibdir)$(shlib_slibdir_qual)/$(shlib_dir)'
       echo '   $(INSTALL_DATA)' ${dir}/libunwind.a ${libunwinddir}/
+      echo '   chmod 644' ${dir}/libunwind.a
       echo '   $(RANLIB_FOR_TARGET)' ${libunwinddir}/libunwind.a
     fi
   fi