Hi!

The comments in both the C and C++ FEs say that after writing PCH file
when --output-pch= is used, we don't want to do anything else and the
routines return to the caller early, especially for C++ FE skipping lots of
needed handling for code generation.  But, nothing is signalled to the
callers, so we actually continue with the full optimization pipeline and
generate assembly.  Because some important parts have been skipped, we
can generate errors though.

Normally, the *.s file is thrown away and not used further, only when
-S or -save-temps is used, it is preserved.

One option would be (patch in the PR) not to skip anything and continue
writing, but as Richard mentioned on IRC, emitting assembly for the header
makes really no sense.  So this patch just does what the comment say,
by setting flag_syntax_only after writing the PCH file tell callers not to
perform cgraph finalization.

In addition to that, the patch also extends the r237955 fix to -S
-save-temps, so that we don't error out on that.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-01-10  Jakub Jelinek  <ja...@redhat.com>

        PR c++/72813
        * gcc.c (default_compilers): Don't add -o %g.s for -S -save-temps
        of c-header.

        * c-decl.c (pop_file_scope): Set flag_syntax_only to 1 after writing
        PCH file.

        * decl2.c (c_parse_final_cleanups): Set flag_syntax_only to 1 after
        writing PCH file.

--- gcc/gcc.c.jj        2017-01-09 17:22:24.000000000 +0100
+++ gcc/gcc.c   2017-01-10 10:42:52.893462294 +0100
@@ -1328,7 +1328,7 @@ static const struct compiler default_com
                %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
                    cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} 
\
                        %(cc1_options)\
-                       %{!fsyntax-only:-o %g.s \
+                       %{!fsyntax-only:%{!S:-o %g.s} \
                            %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
                                               %W{o*:--output-pch=%*}}%V}}\
          %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
--- gcc/c/c-decl.c.jj   2017-01-01 12:45:46.000000000 +0100
+++ gcc/c/c-decl.c      2017-01-10 10:42:07.387043153 +0100
@@ -1420,6 +1420,8 @@ pop_file_scope (void)
   if (pch_file)
     {
       c_common_write_pch ();
+      /* Ensure even the callers don't try to finalize the CU.  */
+      flag_syntax_only = 1;
       return;
     }
 
--- gcc/cp/decl2.c.jj   2017-01-08 17:41:18.000000000 +0100
+++ gcc/cp/decl2.c      2017-01-10 10:41:47.539296496 +0100
@@ -4461,6 +4461,8 @@ c_parse_final_cleanups (void)
          DECL_ASSEMBLER_NAME (node->decl);
       c_common_write_pch ();
       dump_tu ();
+      /* Ensure even the callers don't try to finalize the CU.  */
+      flag_syntax_only = 1;
       return;
     }
 

        Jakub

Reply via email to