On Thu, 2021-11-18 at 10:43 +0100, Richard Biener wrote: > On Tue, 16 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 dump folder is > > /dev/. > > If yes, then it just informs the user and disables dumping, but > > does > > not halt the compilation and the compiler retuns 0 to the shell. > > I think matching '/dev/*' is broken. Either failure to open a dump > file should be an error or not. Btw, some configure tests check > for compiler output as well which still breaks in this case.
Hi, IMHO gcc shouldn't fail when it cannot write the dump files because compilation could still continue compiling even if the dumps cannot be created. However, I chose to do not because the code may be issuing an error for other reasons, and matching for /dev/ fixes the test case. > > IMHO a more reasonable thing to do would be to not treat > -o /dev/null as a source for -dumpdir and friends. Alex? > You did the last re-org, where'd we put such special casing? > > Of course configure checks using -fdump-... with -o /dev/null are > a bit fragile. They could use -fdump-...=FILENAME > But that would also set all clones output as being equal to FILENAME and don't create one dump for every compiled file, no? Thanks, Giuliano. > Thnaks, > Richard. > > > gcc/ChangeLog > > 2021-11-16 Giuliano Belinassi <gbelina...@suse.de> > > > > * dumpfile.c (dump_open): Do not halt compilation when file > > matches /dev/*. > > > > 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/dumpfile.c | 17 ++++++++++++++++- > > gcc/testsuite/gcc.dg/devnull-dump.c | 7 +++++++ > > 2 files changed, 23 insertions(+), 1 deletion(-) > > create mode 100644 gcc/testsuite/gcc.dg/devnull-dump.c > > > > diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c > > index 8169daf7f59..b1dbfb371af 100644 > > --- a/gcc/dumpfile.c > > +++ b/gcc/dumpfile.c > > @@ -378,7 +378,22 @@ dump_open (const char *filename, bool trunc) > > FILE *stream = fopen (filename, trunc ? "w" : "a"); > > > > if (!stream) > > - error ("could not open dump file %qs: %m", filename); > > + { > > + /* Autoconf tests compiler functionalities by setting output > > to /dev/null. > > + In this case, if dumps are enabled, it will try to set the > > output > > + folder to /dev/*, which is of course invalid and the > > compiler will exit > > + with an error, resulting in configure script reporting the > > tested > > + feature as being unavailable. Here we test this case by > > checking if the > > + output file prefix has /dev/ and only inform the user in > > this case > > + rather than refusing to compile. */ > > + > > + const char *const slash_dev = "/dev/"; > > + if (strncmp(slash_dev, filename, strlen(slash_dev)) == 0) > > + inform (UNKNOWN_LOCATION, > > + "could not open dump file %qs: %m. Dumps are > > disabled.", filename); > > + else > > + error ("could not open dump file %qs: %m", filename); > > + } > > return stream; > > } > > > > 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; > > +} > > >