[pph] Do not emit PCH if generating PPH (issue4591061)

Diego Novillo dnovillo@google.com
Fri Jun 10 15:53:00 GMT 2011


On Thu, Jun 9, 2011 at 11:49, Diego Novillo <dnovillo@google.com> wrote:
>
> We were trying to generate PCH and PPH information at the same time.
> We never noticed because PPH is generated after PCH, so we were just
> clobbering over the previous dump.
>
> Found it by accident while debugging a GC ICE.  This should make
> testing slightly faster.
>
> Committed to the branch.

This version had problems and it was still abusing the PCH options
from specs.  The problem is that when compiling header files
separately, the compiler assumes that we want to generate PCH files.

In the long term, I think we will want to replace PCH with PPH, but
until then I'm adding a new flag -fpph-gen to distinguish the PCH from
the PPH generation.  So, when compiling a header file, if you want a
PPH image, you need to:

$ gcc -fpph-gen foo.h

This generate foo.pph instead of foo.gch.

The new patch also adds documentation on the three user-facing flags
used for pph.

Tested on x86_64.


Diego.
-------------- next part --------------
Index: gcc/c-family/c-opts.c
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index e52583e..8fe566e 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -368,13 +368,11 @@ c_common_handle_option (size_t scode, const char *arg, int value,
       break;
 
     case OPT__output_pch_:
-      {
-        char *dot = strrchr (arg, '.');
-        if (dot != NULL && strcmp (dot, ".pph") == 0)
-          pph_out_file = arg;
-        else
-          pch_file = arg;
-      }
+      pch_file = arg;
+      break;
+
+    case OPT__output_pph_:
+      pph_out_file = arg;
       break;
 
     case OPT_A:
Index: gcc/c-family/c.opt
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 67708b8..bdc0fc9 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -139,6 +139,9 @@ C ObjC C++ ObjC++ Joined Alias(o)
 -output-pch=
 C ObjC C++ ObjC++ Joined Separate
 
+-output-pph=
+C++ Joined Separate
+
 -pedantic
 C ObjC C++ ObjC++ Alias(pedantic)
 
@@ -933,8 +936,12 @@ fpph-dump-tree
 C++ Var(flag_pph_dump_tree)
 -fpph-dump-tree	Dump global namespace tree around PPH reads/writes.
 
+fpph-gen
+C++
+-fpph-gen	Generate a PPH image from the input file
+
 fpph-hdr=
-C++ ObjC++ Joined MissingArgError(missing filename after %qs)
+C++ Joined MissingArgError(missing filename after %qs)
 -fpph-hdr=<base-name>   A mapping from <base-name>.h to <base-name>.pph
 
 fpph-logfile=
@@ -942,7 +949,7 @@ C++ Joined RejectNegative Var(flag_pph_logfile)
 -fpph-logfile=<file-name>	Emit PPH debug information to <file-name>
 
 fpph-map=
-C++ ObjC++ Joined MissingArgError(missing filename after %qs)
+C++ Joined MissingArgError(missing filename after %qs)
 -fpph-map=<file-name>   A file of mappings from #include to PPH file
 
 fpph-tracer=
Index: gcc/cp/lang-specs.h
diff --git a/gcc/cp/lang-specs.h b/gcc/cp/lang-specs.h
index a73aba3..ef03a39 100644
--- a/gcc/cp/lang-specs.h
+++ b/gcc/cp/lang-specs.h
@@ -48,8 +48,9 @@ along with GCC; see the file COPYING3.  If not see
       cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
 	      %{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
 	%(cc1_options) %2\
-	%{!fsyntax-only:%{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
-        %W{o*:--output-pch=%*}}%V}}}}",
+	%{!fpph-gen:%{!fsyntax-only:%{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
+	%W{o*:--output-pch=%*}}}} \
+	%{fpph-gen:%{!o*:--output-pph=%b.pph}%W{o*:--output-pph=%*}}%V}}}",
      CPLUSPLUS_CPP_SPEC, 0, 0},
   {"@c++",
     "%{E|M|MM:cc1plus -E %(cpp_options) %2 %(cpp_debug_options)}\
Index: gcc/doc/invoke.texi
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 6207800..524471a 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -195,6 +195,7 @@ in the following sections.
 -fno-threadsafe-statics -fuse-cxa-atexit  -fno-weak  -nostdinc++ @gol
 -fno-default-inline  -fvisibility-inlines-hidden @gol
 -fvisibility-ms-compat @gol
+-fpph-hdr -fpph-map -fpph-gen @gol
 -Wabi  -Wconversion-null  -Wctor-dtor-privacy @gol
 -Wnoexcept -Wnon-virtual-dtor  -Wreorder @gol
 -Weffc++  -Wstrict-null-sentinel @gol
@@ -2171,6 +2172,42 @@ option exists only for testing, and should not be used by end-users;
 it will result in inferior code and has no benefits.  This option may
 be removed in a future release of G++.
 
+@item -fpph-gen
+@opindex fpph-gen
+Generate a Pre-Parsed Header (PPH) file instead of a PCH file.  This option
+is only valid when compiling header files separately.  Instead of generating
+a PCH files, G++ will save the parsed declarations in a header file to
+a PPH file.  By default, the PPH image for a header file named @file{foo.h}
+is @file{foo.pph}.
+
+NOTE: This option is temporary.  It is only meant to serve the initial
+implementation of this feature.  The final user interface will likely
+use a different mechanism for PPH.
+
+@item -fpph-map=@var{file.map}
+@opindex fpph-map
+Use PPH mapping file @file{file.map} to determine what headers should be
+processed from their PPH images.  This file contains a list of file name
+pairs in the form ``@var{file.h} @var{file.pph}''.  When the pre-processor
+finds the directive @code{#include "file.h"}, and there exists a mapping
+between @var{file.h} and @var{file.pph} in @file{file.map}, then the
+compiler will instantiate the PPH image @var{file.pph}.  The text
+in @var{file.h} will be ignored.
+
+NOTE: This option is temporary.  It is only meant to serve the initial
+implementation of this feature.  The final user interface will likely
+use a different mechanism for PPH.
+
+@item -fpph-hdr=@var{file.h}
+@opindex fpph-hdr
+This is a short-hand notation to map a single header @file{file.h} to
+its image @file{file.pph}.  Multiple occurrences of this flag will
+introduce multiple mappings.
+
+NOTE: This option is temporary.  It is only meant to serve the initial
+implementation of this feature.  The final user interface will likely
+use a different mechanism for PPH.
+
 @item -nostdinc++
 @opindex nostdinc++
 Do not search for header files in the standard directories specific to
Index: gcc/testsuite/lib/dg-pph.exp
diff --git a/gcc/testsuite/lib/dg-pph.exp b/gcc/testsuite/lib/dg-pph.exp
index 2058959..c773aa0 100644
--- a/gcc/testsuite/lib/dg-pph.exp
+++ b/gcc/testsuite/lib/dg-pph.exp
@@ -33,7 +33,7 @@ proc dg-pph-hdr { subdir test options mapflag suffix } {
     verbose -log "\nTesting $nshort, $options"
 
     set dg-do-what-default preparse
-    dg-test -keep-output $test "$options $mapflag -I." ""
+    dg-test -keep-output $test "-fpph-gen $options $mapflag -I." ""
 
 }
 
@@ -51,7 +51,7 @@ proc dg-pph-neg { subdir test options mapflag suffix } {
     verbose -log "\nTesting $nshort, $options"
 
     set dg-do-what-default compile
-    dg-test -keep-output $test "$options $mapflag -I." ""
+    dg-test -keep-output $test "-fpph-gen $options $mapflag -I." ""
     if { ![file_on_host exists "$bname.s"] } {
 	file_on_host delete "$bname.s"
     }


More information about the Gcc-patches mailing list