We were only streaming the first field of every struct. Struct fields have a 
chain link to the next field, thus we need to stream the DECL_CHAIN of every 
field as well recursively.

I limited this to VAR_DECL and FUNCTION_DECL for now (which fixes all of our 
current bugs in regards to the struct fields issues), are there any other DECLs 
that can potentially be fields of a struct?

I was tempted to stream the DECL_CHAIN for the whole "group" VAR_DECL belongs 
to in pph_read_tree, but as it turns out we don't want to do this for 
NAMESPACE_DECL as it gets a new chain link when re-added to the bindings early 
on and changing it here causes an ICE in one of the test cases.
Hence, I reverted to the conservative way of only streaming it for what we know 
we need it for.

Syntax-wise: Is it ok to play this 'case' fall through trick with VAR_DECL or 
should I make a separate case entry with it's own break?

2011-06-24  Gabriel Charette  <gch...@google.com>

        * gcc/cp/pph-streamer-in.c (pph_read_tree):
        Stream in DECL_CHAIN of VAR_DECL.
        Stream in DECL_CHAIN of FUNCTION_DECL.
        * gcc/cp/pph-streamer-out.c (pph_write_tree):
        Stream out DECL_CHAIN of VAR_DECL.
        Stream out DECL_CHAIN of FUNCTION_DECL.
        * gcc/testsuite/g++.dg/pph/x1functions.cc: Fixed bogus, now asm diff.
        * gcc/testsuite/g++.dg/pph/x1variables.cc: Fixed bogus, now asm diff.

diff --git a/gcc/cp/pph-streamer-in.c b/gcc/cp/pph-streamer-in.c
index 0e6763f..8d12839 100644
--- a/gcc/cp/pph-streamer-in.c
+++ b/gcc/cp/pph-streamer-in.c
@@ -1216,12 +1216,13 @@ pph_read_tree (struct lto_input_block *ib 
ATTRIBUTE_UNUSED,
       DECL_INITIAL (expr) = pph_in_tree (stream);
       break;
 
+    case VAR_DECL:
+      DECL_CHAIN (expr) = pph_in_tree (stream);
     case CONST_DECL:
     case FIELD_DECL:
     case NAMESPACE_DECL:
     case PARM_DECL:
     case USING_DECL:
-    case VAR_DECL:
       /* FIXME pph: Should we merge DECL_INITIAL into lang_specific? */
       DECL_INITIAL (expr) = pph_in_tree (stream);
       pph_in_lang_specific (stream, expr);
@@ -1232,6 +1233,7 @@ pph_read_tree (struct lto_input_block *ib 
ATTRIBUTE_UNUSED,
       pph_in_lang_specific (stream, expr);
       DECL_SAVED_TREE (expr) = pph_in_tree (stream);
       DECL_STRUCT_FUNCTION (expr) = pph_in_struct_function (stream);
+      DECL_CHAIN (expr) = pph_in_tree (stream);
       break;
 
     case TYPE_DECL:
diff --git a/gcc/cp/pph-streamer-out.c b/gcc/cp/pph-streamer-out.c
index 613cdcd..e85a629 100644
--- a/gcc/cp/pph-streamer-out.c
+++ b/gcc/cp/pph-streamer-out.c
@@ -1062,12 +1062,13 @@ pph_write_tree (struct output_block *ob, tree expr, 
bool ref_p)
       pph_out_tree_or_ref_1 (stream, DECL_INITIAL (expr), ref_p, 3);
       break;
 
+    case VAR_DECL:
+      pph_out_tree_or_ref_1 (stream, DECL_CHAIN (expr), ref_p, 3);
     case CONST_DECL:
     case FIELD_DECL:
     case NAMESPACE_DECL:
     case PARM_DECL:
     case USING_DECL:
-    case VAR_DECL:
       /* FIXME pph: Should we merge DECL_INITIAL into lang_specific? */
       pph_out_tree_or_ref_1 (stream, DECL_INITIAL (expr), ref_p, 3);
       pph_out_lang_specific (stream, expr, ref_p);
@@ -1078,6 +1079,7 @@ pph_write_tree (struct output_block *ob, tree expr, bool 
ref_p)
       pph_out_lang_specific (stream, expr, ref_p);
       pph_out_tree_or_ref_1 (stream, DECL_SAVED_TREE (expr), ref_p, 3);
       pph_out_struct_function (stream, DECL_STRUCT_FUNCTION (expr), ref_p);
+      pph_out_tree_or_ref_1 (stream, DECL_CHAIN (expr), ref_p, 3);
       break;
 
     case TYPE_DECL:
diff --git a/gcc/testsuite/g++.dg/pph/x1functions.cc 
b/gcc/testsuite/g++.dg/pph/x1functions.cc
index 20cde5c..78df01b 100644
--- a/gcc/testsuite/g++.dg/pph/x1functions.cc
+++ b/gcc/testsuite/g++.dg/pph/x1functions.cc
@@ -1,5 +1,4 @@
-// { dg-xfail-if "BOGUS" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "'mbr_decl_inline' was not declared in this scope" "" { xfail 
*-*-* } 0 }
+// pph asm xdiff
 
 #include "x1functions.h"
 
diff --git a/gcc/testsuite/g++.dg/pph/x1variables.cc 
b/gcc/testsuite/g++.dg/pph/x1variables.cc
index bac3136..0f0814f 100644
--- a/gcc/testsuite/g++.dg/pph/x1variables.cc
+++ b/gcc/testsuite/g++.dg/pph/x1variables.cc
@@ -1,6 +1,4 @@
-// { dg-xfail-if "BOGUS" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "c1variables.h:5:8: error: 'int D::mbr_uninit_plain' is not a 
static member of 'struct D'" "" { xfail *-*-* } 0 }
-// { dg-bogus "c1variables.h:6:14: error: 'const int D::mbr_init_const' is not 
a static member of 'struct D'" "" { xfail *-*-* } 0 }
+// pph asm xdiff
 
 #include "x1variables.h"
 

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

Reply via email to