On Fri, 19 Nov 2021, Giuliano Belinassi wrote: > The `configure` scripts generated with autoconf often tests compiler > features by setting output to `/dev/null`, which then sets the dump > folder as being /dev/* and the compilation halts with an error because > GCC cannot create files in /dev/. This is a problem when configure is > testing for compiler features because it cannot tell if the failure was > due to unsupported features or any other problem, and disable it even > if it is working. > > As an example, running configure overriding CFLAGS="-fdump-ipa-clones" > will result in several compiler-features as being disabled because of > gcc halting with an error creating files in /dev/*. > > This commit fixes this issue by checking if the output file is > /dev/null or /dev/zero. In this case we use the current working > directory for dump output instead of the directory of the output > file because we cannot write to /dev/*. > > gcc/ChangeLog > 2021-11-16 Giuliano Belinassi <gbelina...@suse.de> > > * gcc.c (process_command): Skip dumpdir override if file is a > not_actual_file_p. > (not_actual_file_p): Return true if file is /dev/zero as well. > * doc/invoke.texi: Update -dumpdir documentation. > > gcc/testsuite/ChangeLog > 2021-11-16 Giuliano Belinassi <gbelina...@suse.de> > > * gcc.dg/devnull-dump.c: New. > > Signed-off-by: Giuliano Belinassi <gbelina...@suse.de> > --- > gcc/doc/invoke.texi | 3 ++- > gcc/gcc.c | 6 ++++-- > gcc/testsuite/gcc.dg/devnull-dump.c | 7 +++++++ > 3 files changed, 13 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/devnull-dump.c > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index 6070288856c..4a17cd4d317 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -1877,7 +1877,8 @@ named @file{dir/bar.*}, combining the given > @var{dumppfx} with the > default @var{dumpbase} derived from the primary output name. Dump > outputs also take the input name suffix: @file{dir/bar.c.*}. > > -It defaults to the location of the output file; options > +It defaults to the location of the output file, unless the output > +file is a special file like @code{/dev/null}. Options > @option{-save-temps=cwd} and @option{-save-temps=obj} override this > default, just like an explicit @option{-dumpdir} option. In case > multiple such options are given, the last one prevails: > diff --git a/gcc/gcc.c b/gcc/gcc.c > index 506c2acc282..43d7cde1be9 100644 > --- a/gcc/gcc.c > +++ b/gcc/gcc.c > @@ -5098,7 +5098,8 @@ process_command (unsigned int decoded_options_count, > > bool explicit_dumpdir = dumpdir; > > - if (!save_temps_overrides_dumpdir && explicit_dumpdir) > + if ((!save_temps_overrides_dumpdir && explicit_dumpdir) > + || (output_file && not_actual_file_p (output_file))) > { > /* Do nothing. */ > } > @@ -10716,7 +10717,8 @@ static bool > not_actual_file_p (const char *name) > { > return (strcmp (name, "-") == 0 > - || strcmp (name, HOST_BIT_BUCKET) == 0); > + || strcmp (name, HOST_BIT_BUCKET) == 0 > + || strcmp (name, "/dev/zero") == 0); > }
OK when you omit the change to include /dev/zero in not_actual_file_p. Thanks, Richard. > /* %:dumps spec function. Take an optional argument that overrides > diff --git a/gcc/testsuite/gcc.dg/devnull-dump.c > b/gcc/testsuite/gcc.dg/devnull-dump.c > new file mode 100644 > index 00000000000..378e0901c28 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/devnull-dump.c > @@ -0,0 +1,7 @@ > +/* { dg-do assemble } */ > +/* { dg-options "-fdump-ipa-clones -o /dev/null" } */ > + > +int main() > +{ > + return 0; > +} >