On Tue, 26 May 2020, Alexandre Oliva wrote: > On May 26, 2020, Richard Biener <rguent...@suse.de> wrote: > > > xgcc: error: unrecognized command-line option '-dumpbase'^M > > > xg++: error: unrecognized command-line option '-dA'; did you mean '-A' > > > Here's a proper patch submission. I'm still throwing tests at it, but > it's already proved (with a non-bootstrapped build and test run) to fix > the latent (to me) problems above, exposed by configuring GCC without > Ada support, so I think putting it in is highly desirable, and a strict > improvement. Ok to install?
OK. Thanks, Richard. > > do not skip validation of switch after %<opt > > From: Alexandre Oliva <ol...@adacore.com> > > After the patch that revamped dump and aux outputs, GCC compilation > drivers built without Ada would reject -d* options. Such options > would only be validated because of the %{d*} in Ada lang specs, though > other languages had it as well. Other languages had %< specs that had > to be there before %{d*} %:dumps(), while Ada was missing them. > Adding them to Ada brought the same problem to compilers that had Ada > enabled. > > The reason validation failed was that they mishandled %< specs, > advancing past the beginning of the next spec, causing it not to be > handled. Since %{d*} appeared after an odd %<, it was thus ignored. > The logic of validate_switches originally skipped the closing brace > that matched the opening brace, but this shouldn't happen for %<. > Fixed by letting validate_switches know whether it is handling a > braced group or a single atom, and behaving accordingly. > > > for gcc/ChangeLog > > * gcc.c (validate_switches): Add braced parameter. Adjust all > callers. Expected and skip trailing brace only if braced. > Return after handling one atom otherwise. > (DUMPS_OPTIONS): New. > (cpp_debug_options): Define in terms of it. > > for gcc/ada/ChangeLog > > * gcc-interfaces/lang-specs.h (ADA_DUMPS_OPTIONS): Define in > terms of DUMPS_OPTIONS. Replace occurrences of %{d*} %:dumps > with it. > --- > gcc/ada/gcc-interface/lang-specs.h | 10 +++++++--- > gcc/gcc.c | 32 +++++++++++++++++++++++--------- > 2 files changed, 30 insertions(+), 12 deletions(-) > > diff --git a/gcc/ada/gcc-interface/lang-specs.h > b/gcc/ada/gcc-interface/lang-specs.h > index 12b7cf5e..f0ef3b92 100644 > --- a/gcc/ada/gcc-interface/lang-specs.h > +++ b/gcc/ada/gcc-interface/lang-specs.h > @@ -23,6 +23,10 @@ > * * > > ****************************************************************************/ > > +/* Pass -d* flags to the actual compiler, but mapping non-Ada > + extensions to .ada in dump file names. */ > +#define ADA_DUMPS_OPTIONS DUMPS_OPTIONS ("%{!.adb:%{!.ads:.ada}}") > + > /* This is the contribution to the `default_compilers' array in gcc.c for > GNAT. */ > > @@ -35,7 +39,7 @@ > gnat1 %{I*} %{k8:-gnatk8} %{Wall:-gnatwa} %{w:-gnatws} %{!Q:-quiet}\ > %{nostdinc*} %{nostdlib*}\ > %{fcompare-debug-second:-gnatd_A} \ > - %{O*} %{W*} %{w} %{p} %{pg:-p} %{d*} %:dumps(%{!.adb:%{!.ads:.ada}}) \ > + %{O*} %{W*} %{w} %{p} %{pg:-p} " ADA_DUMPS_OPTIONS " \ > %{coverage:-fprofile-arcs -ftest-coverage} " > #if defined(TARGET_VXWORKS_RTP) > "%{fRTS=rtp|fRTS=rtp-smp|fRTS=ravenscar-cert-rtp:-mrtp} " > @@ -51,7 +55,7 @@ > %{!c:%e-c required for gnat2why}\ > gnat1why %{I*} %{k8:-gnatk8} %{!Q:-quiet}\ > %{nostdinc*} %{nostdlib*}\ > - %{a} %{d*} %:dumps(%{!.adb:%{!.ads:.ada}}) \ > + %{a} " ADA_DUMPS_OPTIONS " \ > %{gnatea:-gnatez} %{g*&m*&f*} \ > %1 %{o*:%w%*-gnatO} \ > %i \ > @@ -62,7 +66,7 @@ > %{!c:%e-c required for gnat2scil}\ > gnat1scil %{I*} %{k8:-gnatk8} %{!Q:-quiet}\ > %{nostdinc*} %{nostdlib*}\ > - %{a} %{d*} %:dumps(%{!.adb:%{!.ads:.ada}}) \ > + %{a} " ADA_DUMPS_OPTIONS " \ > %{gnatea:-gnatez} %{g*&m*&f*} \ > %1 %{o*:%w%*-gnatO} \ > %i \ > diff --git a/gcc/gcc.c b/gcc/gcc.c > index 8c851d7..e2362175f4 100644 > --- a/gcc/gcc.c > +++ b/gcc/gcc.c > @@ -388,7 +388,7 @@ static void do_option_spec (const char *, const char *); > static void do_self_spec (const char *); > static const char *find_file (const char *); > static int is_directory (const char *, bool); > -static const char *validate_switches (const char *, bool); > +static const char *validate_switches (const char *, bool, bool); > static void validate_all_switches (void); > static inline void validate_switches_from_spec (const char *, bool); > static void give_switch (int, int); > @@ -1176,9 +1176,16 @@ static const char *cpp_options = > %{!fno-working-directory:-fworking-directory}}} %{O*}\ > %{undef} %{save-temps*:-fpch-preprocess}"; > > +/* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al. > + > + Make it easy for a language to override the argument for the > + %:dumps specs function call. */ > +#define DUMPS_OPTIONS(EXTS) \ > + "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")" > + > /* This contains cpp options which are not passed when the preprocessor > output will be used by another program. */ > -static const char *cpp_debug_options = "%<dumpdir %<dumpbase %<dumpbase-ext > %{d*} %:dumps()"; > +static const char *cpp_debug_options = DUMPS_OPTIONS (""); > > /* NB: This is shared amongst all front-ends, except for Ada. */ > static const char *cc1_options = > @@ -9061,7 +9068,7 @@ validate_switches_from_spec (const char *spec, bool > user) > || (*p == 'W' && *++p == '{') > || (*p == '@' && *++p == '{'))) > /* We have a switch spec. */ > - p = validate_switches (p + 1, user); > + p = validate_switches (p + 1, user, *p == '{'); > } > > static void > @@ -9080,11 +9087,15 @@ validate_all_switches (void) > validate_switches_from_spec (link_command_spec, false); > } > > -/* Look at the switch-name that comes after START > - and mark as valid all supplied switches that match it. */ > +/* Look at the switch-name that comes after START and mark as valid > + all supplied switches that match it. If BRACED, handle other > + switches after '|' and '&', and specs after ':' until ';' or '}', > + going back for more switches after ';'. Without BRACED, handle > + only one atom. Return a pointer to whatever follows the handled > + items, after the closing brace if BRACED. */ > > static const char * > -validate_switches (const char *start, bool user_spec) > +validate_switches (const char *start, bool user_spec, bool braced) > { > const char *p = start; > const char *atom; > @@ -9126,6 +9137,9 @@ next_member: > switches[i].validated = true; > } > > + if (!braced) > + return p; > + > if (*p) p++; > if (*p && (p[-1] == '|' || p[-1] == '&')) > goto next_member; > @@ -9138,11 +9152,11 @@ next_member: > { > p++; > if (*p == '{' || *p == '<') > - p = validate_switches (p+1, user_spec); > + p = validate_switches (p+1, user_spec, *p == '{'); > else if (p[0] == 'W' && p[1] == '{') > - p = validate_switches (p+2, user_spec); > + p = validate_switches (p+2, user_spec, true); > else if (p[0] == '@' && p[1] == '{') > - p = validate_switches (p+2, user_spec); > + p = validate_switches (p+2, user_spec, true); > } > else > p++; > > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)