From 9636e80677cfde263dcff8e5263bf719ec0dbc97 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 27 Jun 2017 18:33:28 +0100 Subject: [PATCH] Fix genmultilib reuse rule checks for large sets of option combinations. genmultilib computes combination_space, a list of all combinations of options in MULTILIB_OPTIONS that might have multilibs built for them (some of which may end up not having multilibs built for them, and some of those may end up being mapped to other multilibs with MULTILIB_REUSE). It is then used to validate the right hand part of MULTILIB_REUSE rules, checking with expr that combination_space matches a basic regular expression derived from that right hand part. There are two problems with this approach to validation: * It requires that right hand part to have options in the same order as in MULTILIB_OPTIONS, in contradiction to the documentation of MULTILIB_REUSE saying that order does not matter there. * combination_space can be so large that the expr call fails with an E2BIG error. I have a local ARM configuration with 40 multilibs but 3840 combinations of options from MULTILIB_OPTIONS (so 3839 listed in combination_space, since it doesn't list the default multilib) and 996 MULTILIB_REUSE rules. This generates a combination_space string longer than the Linux kernel's MAX_ARG_STRLEN (PAGE_SIZE * 32, the limit on the length of a single argv string), so that expr cannot be run. This patch changes the validation approach to generate a much shorter extended regular expression for any sequence of multilib options in any order, and uses that for the validation instead. Tested with a build for arm-none-eabi --with-multilib-list=aprofile (as a configuration that uses MULTILIB_REUSE). * genmultilib (combination_space): Remove variable. Validate reuse rules against regular expression for any sequence of multilib options in any order. From-SVN: r249703 --- gcc/ChangeLog | 6 ++++++ gcc/genmultilib | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f7e5931217..fcabe2595f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-06-27 Joseph Myers + + * genmultilib (combination_space): Remove variable. + Validate reuse rules against regular expression for any sequence + of multilib options in any order. + 2017-06-27 Michael Collison * config/aarch64/aarch64-simd.md (aarch64_combine): Directly diff --git a/gcc/genmultilib b/gcc/genmultilib index c8bcdf3935d..0767e68719e 100644 --- a/gcc/genmultilib +++ b/gcc/genmultilib @@ -186,8 +186,7 @@ fi EOF chmod +x tmpmultilib -combination_space=`initial=/ ./tmpmultilib ${options}` -combinations="$combination_space" +combinations=`initial=/ ./tmpmultilib ${options}` # If there exceptions, weed them out now if [ -n "${exceptions}" ]; then @@ -460,6 +459,15 @@ done echo "NULL" echo "};" +# Generate a regular expression to validate option combinations. +options_re= +for set in ${options}; do + for opt in `echo ${set} | sed -e 's_[/|]_ _g'`; do + options_re="${options_re}${options_re:+|}${opt}" + done +done +options_re="^/((${options_re})/)*\$" + # Output rules used for multilib reuse. echo "" echo "static const char *const multilib_reuse_raw[] = {" @@ -473,7 +481,7 @@ for rrule in ${multilib_reuse}; do # 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 - if expr "${combination_space} " : ".*/${copts}/.*" > /dev/null; then + if echo "/${copts}/" | grep -E "${options_re}" > /dev/null; then combo="/${combo}/" dirout=`./tmpmultilib3 "${combo}" "${todirnames}" "${toosdirnames}" "${enable_multilib}"` copts="/${copts}/" -- 2.30.2