Patchwork [pph] Function Merging (issue5278047)

login
register
mail settings
Submitter Lawrence Crowl
Date Oct. 17, 2011, 6:19 a.m.
Message ID <20111017061919.C196822266C@jade.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/120098/
State New
Headers show

Comments

Lawrence Crowl - Oct. 17, 2011, 6:19 a.m.
Add function merging.  First, let function mangled names match.
Second, overwrite existing struct functions for merged functions.
Third, add filtering for already emitted functions.

The result is ICEs in the call graph code.

Add tests for overload sets with more than one member.

Bootstrapped on x64.


2011-10-16   Lawrence Crowl  <crowl@google.com>


--
This patch is available for review at http://codereview.appspot.com/5278047

Patch

Index: gcc/testsuite/ChangeLog.pph

	* g++.dg/pph/c4inline.cc: Change to ICE in cgraph.
	* g++.dg/pph/x1keyed.cc: Likewise.
	* g++.dg/pph/x1keyno.cc: Likewise.
	* g++.dg/pph/x4keyed.cc: Likewise.
	* g++.dg/pph/x4keyex.cc: Likewise.
	* g++.dg/pph/x4keyno.cc: Likewise.
	* g++.dg/pph/x4tmplclass1.cc: Likewise.
	* g++.dg/pph/x4tmplclass2.cc: Likewise.
	* g++.dg/pph/x4tmplfuncinln.cc: Likewise.
	* g++.dg/pph/x4tmplfuncninl.cc: Likewise.
	* g++.dg/pph/x6rtti.cc: Likewise.
	* g++.dg/pph/x7rtti.cc: Likewise.
	* g++.dg/pph/z4tmplclass1.cc: Likewise.
	* g++.dg/pph/z4tmplclass2.cc: Likewise.
	* g++.dg/pph/z4tmplfuncinln.cc: Likewise.
	* g++.dg/pph/z4tmplfuncninl.cc: Likewise.
	* g++.dg/pph/x1tmplclass2.cc: Change to missing function.

Index: gcc/cp/ChangeLog.pph

2011-10-16   Lawrence Crowl  <crowl@google.com>

	* pph-streamer-in.c (pph_match_to_overload): Comment on overloading.
	(pph_match_to_function): Allow functions to match for merging.  
	Comment on overloading.
	(pph_match_to_link): Comment on overloading.
	(pph_in_struct_function): Implement overwriting a struct function
	when merging.
	(pph_in_symtab): Add filtering for already emitted functions.
	* pph-streamer.h (pph_trace_tree): Add a boolean parameter specifying
	whether or not the tree was actually merged.
	* pph-streamer.c (pph_trace_tree): Add a boolean parameter specifying
	whether or not the tree was actually merged.  Change output to
	correspond.  Update callers.


Index: gcc/testsuite/g++.dg/pph/x4tmplfuncninl.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4tmplfuncninl.cc	(revision 180072)
+++ gcc/testsuite/g++.dg/pph/x4tmplfuncninl.cc	(working copy)
@@ -1,6 +1,5 @@ 
-// { dg-xfail-if "ICE" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "a0tmplfuncninl_g.h:12:23: internal compiler error: in instantiate_decl" "" { xfail *-*-* } 0 }
-// { dg-excess-errors "Template list problems" }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4tmplfuncninl.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
 
 #include "x0tmplfuncninl1.h"
 #include "x0tmplfuncninl2.h"
Index: gcc/testsuite/g++.dg/pph/z4tmplfuncninl.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/z4tmplfuncninl.cc	(revision 180072)
+++ gcc/testsuite/g++.dg/pph/z4tmplfuncninl.cc	(working copy)
@@ -1,6 +1,5 @@ 
-// { dg-xfail-if "ICE" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "a0tmplfuncninl_g.h:12:23: internal compiler error: in instantiate_decl" "" { xfail *-*-* } 0 }
-// { dg-excess-errors "Template list problems" }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "z4tmplfuncninl.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
 
 #include "x0tmplfuncninl3.h"
 #include "x0tmplfuncninl4.h"
Index: gcc/testsuite/g++.dg/pph/x4keyno.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4keyno.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x4keyno.cc	(working copy)
@@ -1,5 +1,8 @@ 
-// { dg-xfail-if "BOGUS MERGE AUXVAR" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "x4keyno.cc:12:1: error: redefinition of 'const char _ZTS5keyno" "" { xfail *-*-* } 0 }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4keyno.cc:15:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+// { dg-excess-errors "typeinfo name duplicatd" }
+
+// Previously.
 // The variable for the typeinfo name for 'keyno' is duplicated.
 
 #include "x0keyno1.h"
Index: gcc/testsuite/g++.dg/pph/x1keyed.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x1keyed.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x1keyed.cc	(working copy)
@@ -1,3 +1,6 @@ 
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x1keyed.cc:12:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+
 #include "x0keyed1.h"
 
 int keyed::key( int arg ) { return mix( field & arg ); }
Index: gcc/testsuite/g++.dg/pph/x7rtti.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x7rtti.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x7rtti.cc	(working copy)
@@ -1,18 +1,7 @@ 
 // FIXME pph: This should be a { dg=do run } (with '=' replaced by '-')
-// { dg-xfail-if "BOGUS POSSIBLE TYPE MISMERGE" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "x7rtti.cc:19:0: warning: .__STDC_IEC_559_COMPLEX__. redefined .enabled by default." "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:19:0: warning: .__STDC_ISO_10646__. redefined .enabled by default." "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:19:0: warning: .__STDC_IEC_559__. redefined .enabled by default." "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:22:26: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:23:22: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:24:29: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:25:22: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:26:29: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:27:22: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:28:29: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:29:22: error: no match for .operator" "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:33:1: error: redefinition of .const char _ZTS15non_polymorphic ..." "" { xfail *-*-* } 0 }
-// { dg-bogus "x7rtti.cc:33:1: error: redefinition of .const char _ZTS11polymorphic ..." "" { xfail *-*-* } 0 }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x7rtti.cc:22:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+// { dg-excess-errors "macro redefinition and operator match problems" }
 
 #include "x5rtti1.h"
 #include "x5rtti2.h"
Index: gcc/testsuite/g++.dg/pph/x1tmplclass2.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x1tmplclass2.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x1tmplclass2.cc	(working copy)
@@ -1,9 +1,9 @@ 
-// pph asm xdiff 37711
-// xfail BOGUS MISSVAR , ORDER
+// pph asm xdiff 34237
+// xfail BOGUS MISSVAR, MISSFUNC
 // The assembly is missing a template class static member variable
 // base<char>::variable instantiated in a prior pph file.
-// Explicit specializations base<short>::variable and base<double>::d_variable
-// appear in a different order.
+// Functions base<double>::d_static_non_inline() and
+// base<double>::d_dynamic_non_inline() are also missing.
 
 #include "x0tmplclass23.h"
 #include "a0tmplclass2_u.h"
Index: gcc/testsuite/g++.dg/pph/z4tmplclass1.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/z4tmplclass1.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/z4tmplclass1.cc	(working copy)
@@ -1,4 +1,7 @@ 
-// pph asm xdiff 10444
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "z4tmplclass1.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
+
+// Previously
 // xfail BOGUS DUPVAR DUPFUNC
 
 #include "x0tmplclass13.h"
Index: gcc/testsuite/g++.dg/pph/c4inline.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/c4inline.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/c4inline.cc	(working copy)
@@ -1,8 +1,5 @@ 
-// pph asm xdiff 36250
-// xfail BOGUS DUPFUN
-//
-// Emitting a second copy of the inline function f.
-// With comdat, the linker may paper over the differences.
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "c4inline.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
 
 #include "c0inline1.h"
 #include "c0inline2.h"
Index: gcc/testsuite/g++.dg/pph/x4keyex.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4keyex.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x4keyex.cc	(working copy)
@@ -1,4 +1,7 @@ 
-// pph asm xdiff 32642
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4keyex.cc:29:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+
+// Previously.
 // xfail BOGUS MERGE LABELS
 //
 // This test case fails to compare because LFB/LFE labels are different.
Index: gcc/testsuite/g++.dg/pph/x4tmplfuncinln.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4tmplfuncinln.cc	(revision 180072)
+++ gcc/testsuite/g++.dg/pph/x4tmplfuncinln.cc	(working copy)
@@ -1,6 +1,5 @@ 
-// { dg-xfail-if "ICE" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "a0tmplfuncinln_g.h:17:23: internal compiler error: in instantiate_decl" "" { xfail *-*-* } 0 }
-// { dg-excess-errors "Template list problems" }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4tmplfuncinln.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
 
 #include "x0tmplfuncinln1.h"
 #include "x0tmplfuncinln2.h"
Index: gcc/testsuite/g++.dg/pph/z4tmplfuncinln.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/z4tmplfuncinln.cc	(revision 180072)
+++ gcc/testsuite/g++.dg/pph/z4tmplfuncinln.cc	(working copy)
@@ -1,6 +1,5 @@ 
-// { dg-xfail-if "ICE" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "a0tmplfuncinln_g.h:17:23: internal compiler error: in instantiate_decl" "" { xfail *-*-* } 0 }
-// { dg-excess-errors "Template list problems" }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "z4tmplfuncinln.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
 
 #include "x0tmplfuncinln3.h"
 #include "x0tmplfuncinln4.h"
Index: gcc/testsuite/g++.dg/pph/x1keyno.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x1keyno.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x1keyno.cc	(working copy)
@@ -1,3 +1,6 @@ 
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x1keyno.cc:10:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+
 #include "x0keyno1.h"
 
 int main()
Index: gcc/testsuite/g++.dg/pph/z4tmplclass2.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/z4tmplclass2.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/z4tmplclass2.cc	(working copy)
@@ -1,4 +1,7 @@ 
-// pph asm xdiff 59292
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "z4tmplclass2.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
+
+// Previously
 // xfail BOGUS DUPVAR DUPFUNC
 
 #include "x0tmplclass23.h"
Index: gcc/testsuite/g++.dg/pph/x4tmplclass1.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4tmplclass1.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x4tmplclass1.cc	(working copy)
@@ -1,4 +1,7 @@ 
-// pph asm xdiff 36067
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4tmplclass1.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
+
+// Previoiusly:
 // Assembly differences seem to be due to the order in which the
 // symbols in the template hash tables are emitted.
 #include "x0tmplclass11.h"
Index: gcc/testsuite/g++.dg/pph/x4keyed.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4keyed.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x4keyed.cc	(working copy)
@@ -1,6 +1,6 @@ 
-// { dg-xfail-if "BOGUS MERGE AUXVAR" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "x4keyed.cc:14:1: error: redefinition of 'const char _ZTS5keyed ..'" "" { xfail *-*-* } 0 }
-// The variable for the typeinfo name for 'keyed' is duplicated.
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4keyed.cc:14:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+// { dg-excess-errors "callgraph problems" }
 
 #include "x0keyed1.h"
 #include "x0keyed2.h"
Index: gcc/testsuite/g++.dg/pph/x4tmplclass2.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x4tmplclass2.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x4tmplclass2.cc	(working copy)
@@ -1,4 +1,7 @@ 
-// pph asm xdiff 49533
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x4tmplclass2.cc:1:0: internal compiler error: in cgraph_create_node, at cgraph.c:502" "" { xfail *-*-* } 0 }
+
+// Prevously:
 // xfail BOGUS DUPFUN
 // base<short>::dynamic_early_inline() and base<short>::static_early_inline()
 // are duplicated.
Index: gcc/testsuite/g++.dg/pph/x6rtti.cc
===================================================================
--- gcc/testsuite/g++.dg/pph/x6rtti.cc	(revision 180071)
+++ gcc/testsuite/g++.dg/pph/x6rtti.cc	(working copy)
@@ -1,4 +1,9 @@ 
-// { dg-xfail-if "BOGUS POSSIBLE TYPE MISMERGE" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-xfail-if "ICE CGRAPH" { "*-*-*" } { "-fpph-map=pph.map" } }
+// { dg-bogus "x6rtti.cc:14:1: internal compiler error: in cgraph_analyze_functions, at cgraphunit.c:1193" "" { xfail *-*-* } 0 }
+// { dg-excess-errors "callgraph problems" }
+
+// Previously:
+// "BOGUS POSSIBLE TYPE MISMERGE"
 //FIXME We should make this a run test.
 
 #include "x5rtti1.h"
Index: gcc/cp/pph-streamer-in.c
===================================================================
--- gcc/cp/pph-streamer-in.c	(revision 180072)
+++ gcc/cp/pph-streamer-in.c	(working copy)
@@ -748,9 +748,9 @@  pph_match_to_overload (tree expr ATTRIBU
 			location_t where ATTRIBUTE_UNUSED,
 			const char *idstr, tree *link ATTRIBUTE_UNUSED)
 {
-  /* FIXME crowl: Assume functions are distinct for now.  */
+  /* FIXME pph: This is apparently not how overloading works.  */
   if (flag_pph_debug >= 2)
-    fprintf (pph_logfile, "PPH: function \"%s\" assumed distinct\n", idstr);
+    fprintf (pph_logfile, "PPH: unhandled overload list for \"%s\"\n", idstr);
   return NULL;
 }
 
@@ -762,12 +762,17 @@  pph_match_to_overload (tree expr ATTRIBU
 static tree
 pph_match_to_function (tree expr ATTRIBUTE_UNUSED,
 			location_t where ATTRIBUTE_UNUSED,
-			const char *idstr, tree *link ATTRIBUTE_UNUSED)
+			const char *idstr ATTRIBUTE_UNUSED, tree *link)
 {
-  /* FIXME crowl: Assume functions are distinct for now.  */
-  if (flag_pph_debug >= 2)
-    fprintf (pph_logfile, "PPH: function \"%s\" assumed distinct\n", idstr);
-  return NULL;
+  /* This function is called when strings match, which in the case
+     of functions are the mangled names.  The mangled names should be
+     distinct, so assume a match. */
+
+  /* FIXME pph: This routine may need to check overloading.
+     If it does, then we need to match on the identifier,
+     not the mangled name, as the identifier is the overload set.  */
+
+  return *link;
 }
 
 
@@ -783,6 +788,7 @@  pph_match_to_link (tree expr, location_t
 
   link_code = TREE_CODE (*link);
   if (link_code == TREE_LIST)
+    /* FIXME pph: This is apparently not how overloading works.  */
     return pph_match_to_overload (expr, where, idstr, link);
 
   expr_code = TREE_CODE (expr);
@@ -1174,16 +1180,26 @@  pph_in_struct_function (pph_stream *stre
       return;
     }
 
-  /* Allocate a new DECL_STRUCT_FUNCTION for DECL.  */
+  /* Possibly allocate a new DECL_STRUCT_FUNCTION for DECL.  */
   t = pph_in_tree (stream);
   gcc_assert (t == decl);
-  allocate_struct_function (decl, false);
   fn = DECL_STRUCT_FUNCTION (decl);
+  if (!fn)
+    {
+      /* The DECL_STRUCT_FUNCTION does not already already exists,
+         which implies that we are reading an entirely new function
+         and not merging into an existing function.  */
+      /* We would normally use ALLOC_AND_REGISTER,
+         but allocate_struct_function does not return a pointer.  */
+      allocate_struct_function (decl, false);
+      fn = DECL_STRUCT_FUNCTION (decl);
+    }
 
-  /* Now register it.  We would normally use ALLOC_AND_REGISTER,
-     but allocate_struct_function does not return a pointer.  */
+  /* Now register it.  */
   pph_cache_insert_at (&stream->cache, fn, ix, PPH_function);
 
+  /* FIXME pph: For now, accept the new version of the fields when merging.  */
+
   input_struct_function_base (fn, stream->encoder.r.data_in,
 			      stream->encoder.r.ib);
 
@@ -2027,7 +2043,7 @@  pph_in_tree_1 (pph_stream *stream, tree 
     TREE_CHAIN (expr) = saved_expr_chain;
 
   if (flag_pph_tracer)
-    pph_trace_tree (expr, chain != NULL);
+    pph_trace_tree (expr, chain != NULL, expr != read);
 
   /* If needed, sign the recently materialized tree to detect
      mutations.  Note that we only need to compute signatures
@@ -2200,6 +2216,8 @@  pph_in_symtab (pph_stream *stream)
 	  node = pph_in_cgraph_node (stream);
 	  if (node && node->local.finalized)
 	    {
+	      if (pph_decl_already_emitted (decl))
+		continue;
 	      /* Since the writer had finalized this cgraph node,
 		 we have to re-play its actions.  To do that, we need
 		 to clear the finalized and reachable bits in the
Index: gcc/cp/pph-streamer.c
===================================================================
--- gcc/cp/pph-streamer.c	(revision 180072)
+++ gcc/cp/pph-streamer.c	(working copy)
@@ -334,10 +334,10 @@  pph_add_include (pph_stream *stream, pph
 /* Print tracing information for a possibly MERGEABLE tree T.  */
 
 void
-pph_trace_tree (tree t, bool mergeable)
+pph_trace_tree (tree t, bool mergeable, bool merged)
 {
   bool emit = false;
-  char merging = mergeable ? '*' : '.';
+  char merging = merged ? '#' : mergeable ? '*' : '.';
   bool is_decl = DECL_P (t);
   char userdef =  is_decl ? '*' : '.';
 
Index: gcc/cp/pph-streamer.h
===================================================================
--- gcc/cp/pph-streamer.h	(revision 180072)
+++ gcc/cp/pph-streamer.h	(working copy)
@@ -231,7 +231,7 @@  pph_stream *pph_stream_open (const char 
 void pph_mark_stream_read (pph_stream *);
 void pph_stream_close (pph_stream *);
 void pph_add_include (pph_stream *, pph_stream *);
-void pph_trace_tree (tree, bool);
+void pph_trace_tree (tree, bool, bool);
 void pph_cache_insert_at (pph_cache *, void *, unsigned, enum pph_tag);
 bool pph_cache_lookup (pph_cache *, void *, unsigned *, enum pph_tag);
 bool pph_cache_lookup_in_includes (pph_stream *, void *, unsigned *, unsigned *,
Index: gcc/cp/pph-streamer-out.c
===================================================================
--- gcc/cp/pph-streamer-out.c	(revision 180072)
+++ gcc/cp/pph-streamer-out.c	(working copy)
@@ -1963,7 +1963,7 @@  pph_out_tree_1 (pph_stream *stream, tree
   else if (marker == PPH_RECORD_START || marker == PPH_RECORD_START_MUTATED)
     {
       if (flag_pph_tracer)
-	pph_trace_tree (expr, mergeable);
+	pph_trace_tree (expr, mergeable, false);
 
       /* This is the first time we see EXPR, write it out.  */
       if (marker == PPH_RECORD_START)