From 7137cdac42c49af85bc0c00b595913bcda9c8d88 Mon Sep 17 00:00:00 2001 From: xguo Date: Sun, 13 Jan 2013 10:12:07 +0000 Subject: 2013-01-13 Terry Guo * gcc/Makefile.in (s-mlib): New argument MULTILIB_REUSE. * gcc/doc/fragments.texi: Document MULTILIB_REUSE. * gcc/gcc.c (multilib_reuse): New internal spec. (set_multilib_dir): Also search multilib from multilib_reuse. * gcc/genmultilib (tmpmultilib3): Refactor code. (tmpmultilib4): Ditto. (multilib_reuse): New multilib argument. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195134 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/genmultilib | 162 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 48 deletions(-) (limited to 'gcc/genmultilib') diff --git a/gcc/genmultilib b/gcc/genmultilib index 5afc6b53291..4dca65d68ff 100644 --- a/gcc/genmultilib +++ b/gcc/genmultilib @@ -85,6 +85,9 @@ # The optional ninth argument is the multiarch name. +# The optional tenth argument specifies how to reuse multilib for different +# option sets. + # The last option should be "yes" if multilibs are enabled. If it is not # "yes", all GCC multilib dir names will be ".". @@ -105,7 +108,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;", @@ -135,7 +138,8 @@ exclusions=$6 osdirnames=$7 multilib_required=$8 multiarch=$9 -enable_multilib=${10} +multilib_reuse=${10} +enable_multilib=${11} echo "static const char *const multilib_raw[] = {" @@ -349,61 +353,94 @@ done optout=`echo ${optout} | sed -e 's/^ //'` echo "\".${defaultosdirname} ${optout};\"," +# This part of code convert an option combination to +# its corresponding directory names. +# The directory names will be deduced from MULTILIB_DIRNAMES, +# MULTILIB_OSDIRNAMES or the option combination itself. +rm -rf tmpmultilib3 +cat >tmpmultilib3 <<\EOF +#!/bin/sh + +dirout= +combo=$1 +todirnames=$2 +toosdirnames=$3 +enable_multilib=$4 + +if [ -n "${todirnames}" ]; then + dirout=`echo ${combo} | sed ${todirnames}` +else + dirout=`echo ${combo} | sed -e 's/=/-/g'` +fi +# Remove the leading and trailing slashes. +dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` + +# Use the OS directory names rather than the option names. +if [ -n "${toosdirnames}" ]; then + osdirout=`echo ${combo} | sed ${toosdirnames}` + # Remove the leading and trailing slashes. + osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` + if [ "x${enable_multilib}" != xyes ]; then + dirout=".:${osdirout}" + disable_multilib=yes + else + case "${osdirout}" in + !*) + dirout=`echo ${osdirout} | sed 's/^!//'` + ;; + *) + dirout="${dirout}:${osdirout}" + ;; + esac + fi +else + if [ "x${enable_multilib}" != xyes ]; then + # genmultilib with --disable-multilib should be + # called with '' '' '' '' '' '' '' no + # if MULTILIB_OSDIRNAMES is empty. + exit 1 + fi +fi +echo "${dirout}" +EOF +chmod +x tmpmultilib3 + +# Script to look through the options and output each option that is present, +# and negate each option that is not present. +rm -rf tmpmultilib4 +cat > tmpmultilib4 <<\EOF +#!/bin/sh + +optout= +combo=$1 +options=$2 + +for set in ${options}; do + setopts=`echo ${set} | sed -e 's_[/|]_ _g'` + for opt in ${setopts}; do + if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then + optout="${optout} ${opt}" + else + optout="${optout} !${opt}" + fi + done +done +optout=`echo ${optout} | sed -e 's/^ //'` +echo "${optout}" +EOF +chmod +x tmpmultilib4 + # Work over the list of combinations. We have to translate each one # to use the directory names rather than the option names, we have to # include the information in matches, and we have to generate the # correct list of options and negations. for combo in ${combinations}; do # Use the directory names rather than the option names. - if [ -n "${todirnames}" ]; then - dirout=`echo ${combo} | sed ${todirnames}` - else - dirout=`echo ${combo} | sed -e 's/=/-/g'` - fi - # Remove the leading and trailing slashes. - dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` - - # Use the OS directory names rather than the option names. - if [ -n "${toosdirnames}" ]; then - osdirout=`echo ${combo} | sed ${toosdirnames}` - # Remove the leading and trailing slashes. - osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` - if [ "x${enable_multilib}" != xyes ]; then - dirout=".:${osdirout}" - disable_multilib=yes - else - case "${osdirout}" in - !*) - dirout=`echo ${osdirout} | sed 's/^!//'` - ;; - *) - dirout="${dirout}:${osdirout}" - ;; - esac - fi - else - if [ "x${enable_multilib}" != xyes ]; then - # genmultilib with --disable-multilib should be - # called with '' '' '' '' '' '' '' no - # if MULTILIB_OSDIRNAMES is empty. - exit 1 - fi - fi + dirout=`./tmpmultilib3 "${combo}" "${todirnames}" "${toosdirnames}" "${enable_multilib}"` # Look through the options. We must output each option that is # present, and negate each option that is not present. - optout= - for set in ${options}; do - setopts=`echo ${set} | sed -e 's_[/|]_ _g'` - for opt in ${setopts}; do - if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then - optout="${optout} ${opt}" - else - optout="${optout} !${opt}" - fi - done - done - optout=`echo ${optout} | sed -e 's/^ //'` + optout=`./tmpmultilib4 "${combo}" "${options}"` # Output the line with all appropriate matches. dirout="${dirout}" optout="${optout}" ./tmpmultilib2 @@ -413,6 +450,35 @@ done echo "NULL" echo "};" +# Output rules used for multilib reuse. +echo "" +echo "static const char *const multilib_reuse_raw[] = {" +for rrule in ${multilib_reuse}; do + # The left part of the rule are the options we used to build multilib. + # The right part of the rule are the options that can reuse this multilib. + combo=`echo ${rrule} | sed -e 's/=.*$//' -e 's/\./=/g'` + copts=`echo ${rrule} | sed -e 's/^.*=//' -e 's/\./=/g'` + # The variable ${combinations} are the option combinations we will build + # multilib from. If the combination in the left part of reuse rule isn't + # in this variable, it means no multilib will be built for current reuse + # rule. Thus the reuse purpose specified by current rule is meaningless. + if expr "${combinations} " : ".*/${combo}/.*" > /dev/null; then + combo="/${combo}/" + dirout=`./tmpmultilib3 "${combo}" "${todirnames}" "${toosdirnames}" "${enable_multilib}"` + copts="/${copts}/" + optout=`./tmpmultilib4 "${copts}" "${options}"` + # Output the line with all appropriate matches. + dirout="${dirout}" optout="${optout}" ./tmpmultilib2 + else + echo "The rule ${rrule} is trying to reuse nonexistent multilib." + exit 1 + fi +done + +# Terminate the list of string. +echo "NULL" +echo "};" + # Output all of the matches now as option and that is the same as that, with # a semicolon trailer. Include all of the normal options as well. # Note, the format of the matches is reversed compared -- cgit v1.2.1