* Makefile.in (s-mlib): Add new argument MULTILIB_REQUIRED.
authorxguo <xguo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2012 11:38:47 +0000 (11:38 +0000)
committerxguo <xguo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2012 11:38:47 +0000 (11:38 +0000)
        * genmultilib (MULTILIB_REQUIRED): New.
        * doc/fragments.texi: Document the MULTILIB_REQUIRED.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187325 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/Makefile.in
gcc/doc/fragments.texi
gcc/genmultilib

index b69e8c9..7a40325 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-09  Terry Guo  <terry.guo@arm.com>
+
+       * Makefile.in (s-mlib): Add new argument MULTILIB_REQUIRED.
+       * genmultilib (MULTILIB_REQUIRED): New.
+       * doc/fragments.texi: Document the MULTILIB_REQUIRED.
+
 2012-05-09  Richard Guenther  <rguenther@suse.de>
 
        * tree-vectorizer.h (vect_loop_versioning): Adjust prototype.
index 98f83d9..716823b 100644 (file)
@@ -1831,10 +1831,11 @@ s-mlib: $(srcdir)/genmultilib Makefile
            "$(MULTILIB_EXTRA_OPTS)" \
            "$(MULTILIB_EXCLUSIONS)" \
            "$(MULTILIB_OSDIRNAMES)" \
+           "$(MULTILIB_REQUIRED)" \
            "@enable_multilib@" \
            > tmp-mlib.h; \
        else \
-         $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no \
+         $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' '' no\
            > tmp-mlib.h; \
        fi
        $(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h
index 31674f9..b184cc0 100644 (file)
@@ -121,6 +121,29 @@ options enabled.  Therefore @code{MULTILIB_EXCEPTIONS} is set to:
 *mthumb/*mhard-float*
 @end smallexample
 
+@findex MULTILIB_REQUIRED
+@item MULTILIB_REQUIRED
+Sometimes when there are only a few combinations are required, it would
+be a big effort to come up with a @code{MULTILIB_EXCEPTIONS} list to
+cover all undesired ones.  In such a case, just listing all the required
+combinations in @code{MULTILIB_REQUIRED} would be more straightforward.
+
+The way to specify the entries in @code{MULTILIB_REQUIRED} is same with
+the way used for @code{MULTILIB_EXCEPTIONS}, only this time what are
+required will be specified.  Suppose there are multiple sets of
+@code{MULTILIB_OPTIONS} and only two combinations are required, one
+for ARMv7-M and one for ARMv7-R with hard floating-point ABI and FPU, the
+@code{MULTILIB_REQUIRED} can be set to:
+@smallexample
+@code{MULTILIB_REQUIRED} =  mthumb/march=armv7-m
+@code{MULTILIB_REQUIRED} += march=armv7-r/mfloat-abi=hard/mfpu=vfpv3-d16
+@end smallexample
+
+The @code{MULTILIB_REQUIRED} can be used together with
+@code{MULTILIB_EXCEPTIONS}.  The option combinations generated from
+@code{MULTILIB_OPTIONS} will be filtered by @code{MULTILIB_EXCEPTIONS}
+and then by @code{MULTILIB_REQUIRED}.
+
 @findex MULTILIB_EXTRA_OPTS
 @item MULTILIB_EXTRA_OPTS
 Sometimes it is desirable that when building multiple versions of
index 270de2b..02fc276 100644 (file)
 # the os directory names are used exclusively.  Use the mapping when
 # there is no one-to-one equivalence between GCC levels and the OS.
 
+# The optional eighth argument which intends to reduce the effort to write
+# so many MULTILIB_EXCEPTIONS rules. This option defines a series of option
+# combinations that we actually required.
+# For some cases, the generated option combinations are far more than what
+# we need, we have to write a lot of rules to screen out combinations we
+# don't need. If we missed some rules, the unexpected libraries will be built.
+# Now with this argument, one can simply give what combinations are needed.
+# It is pretty straigtforward.
+# This argument can be used together with MULTILIB_EXCEPTIONS and will take
+# effect after the MULTILIB_EXCEPTIONS.
+
 # The last option should be "yes" if multilibs are enabled.  If it is not
 # "yes", all GCC multilib dir names will be ".".
 
 #   genmultilib 'm64/m32 mno-app-regs|mcmodel=medany' '64 32 alt'
 #              'mcmodel?medany=mcmodel?medmid' 'm32/mno-app-regs* m32/mcmodel=*'
 #              '' 'm32/!m64/mno-app-regs m32/!m64/mcmodel=medany'
-#              '../lib64 ../lib32 alt' yes
+#              '../lib64 ../lib32 alt' '' yes
 # This produces:
 #   ". !m64 !m32 !mno-app-regs !mcmodel=medany;",
 #   "64:../lib64 m64 !m32 !mno-app-regs !mcmodel=medany;",
@@ -121,7 +132,8 @@ exceptions=$4
 extra=$5
 exclusions=$6
 osdirnames=$7
-enable_multilib=$8
+multilib_required=$8
+enable_multilib=$9
 
 echo "static const char *const multilib_raw[] = {"
 
@@ -195,6 +207,33 @@ EOF
   combinations=`./tmpmultilib2 ${combinations}`
 fi
 
+# If the MULTILIB_REQUIRED list are provided,
+# filter out combinations not in this list.
+if [ -n "${multilib_required}" ]; then
+  cat >tmpmultilib2 <<\EOF
+#!/bin/sh
+# This recursive script weeds out any combination of multilib
+# switches that not in the expected list.
+
+  for opt in $@; do
+    case "$opt" in
+EOF
+
+  for expect in ${multilib_required}; do
+    echo "      /${expect}/) echo \${opt};;" >> tmpmultilib2
+  done
+
+cat >>tmpmultilib2 <<\EOF
+      *) ;;
+    esac
+  done
+EOF
+
+   chmod +x tmpmultilib2
+   combinations=`./tmpmultilib2 ${combinations}`
+
+fi
+
 # Construct a sed pattern which will convert option names to directory
 # names.
 todirnames=