From: xguo Date: Wed, 9 May 2012 11:38:47 +0000 (+0000) Subject: * Makefile.in (s-mlib): Add new argument MULTILIB_REQUIRED. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cec456166b4f52066e208ce4b09b98b42dc68bb2;p=thirdparty%2Fgcc.git * Makefile.in (s-mlib): Add new argument MULTILIB_REQUIRED. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b69e8c9aa120..7a403254a6e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-05-09 Terry Guo + + * 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 * tree-vectorizer.h (vect_loop_versioning): Adjust prototype. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 98f83d9156dc..716823b2850d 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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 diff --git a/gcc/doc/fragments.texi b/gcc/doc/fragments.texi index 31674f9a5d0e..b184cc036ff6 100644 --- a/gcc/doc/fragments.texi +++ b/gcc/doc/fragments.texi @@ -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 diff --git a/gcc/genmultilib b/gcc/genmultilib index 270de2b2a2cd..02fc2768d456 100644 --- a/gcc/genmultilib +++ b/gcc/genmultilib @@ -73,6 +73,17 @@ # 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 ".". @@ -93,7 +104,7 @@ # 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=