On Thu, 18 Nov 2021, Giuliano Belinassi wrote:

> 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?

Yes.  But then whoever blindly adds -fdump- to CFLAGS over the
run of configure is really to blame.  Yes, I agree - "silent"
failure is bad, but that's also the fault of configure since it
cannot distinguish between real and accidential fails when you
supply wrong CFLAGS.

So I'm not sure if -fdump- should be special cased.  But for
sure -o /dev/null might not be a good source for our heuristic
way to determine the aux file prefix and directory.

Richard.

> 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;
> > > +}
> > > 
> > 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to