With the passes.c hunk in the patch below we FAIL assembly comparison
of g++.dg/pch/system-[12].C because with PCH we have computed
DECL_ASSEMBLER_NAME and thus appended DW_AT_linkage_name early during
PCH generation while without PCH we compute it lazily and end up
appending DW_AT_specification earlier.  Thus we have swapped dwarf
attribute order and assembly comparison fails.

Clearly this kind of "IL" changes dependent on whether we are writing
a PCH file is going to cause differences down the food chain.
(there is another case in instantiate_decl calling add_pending_template
dependent on pch_file)

Now a simple solution is to simply not do that (mangle decls).  Another
would be to always mangle decls where we now do so conditional on PCH.
Another soulution is to declare we don't care about assembly differences
with/without using PCH and remove assembly comparison from the
testsuite harness.

Bootstrapped on x86_64-unknown-linux-gnu, testing + gdb testing in 
progress.

Ok for trunk (with note_decl_for_pch completely removed)?

The passes.c hunk is needed because we otherwise miss to properly
create the early DIEs for those kind of globals (we'll be left
with a declaration DIE from the type DIE creation and miss the
definition part).

Thanks,
Richard.

2015-08-27  Richard Biener  <rguent...@suse.de>

        * passes.c (rest_of_decl_compilation): Also call early_global_decl
        on global definitions in type context.

        cp/
        * semantics.c (note_decl_for_pch): Do not mangle the decl.

Index: gcc/passes.c
===================================================================
--- gcc/passes.c        (revision 227258)
+++ gcc/passes.c        (working copy)
@@ -318,7 +318,15 @@ rest_of_decl_compilation (tree decl,
       && !decl_function_context (decl)
       && !current_function_decl
       && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
-      && !decl_type_context (decl)
+      && (!decl_type_context (decl)
+         /* If we created a varpool node for the decl make sure to
+            call early_global_decl.  Otherwise we miss changes
+            introduced by member definitions like
+              struct A { static int staticdatamember; };
+              int A::staticdatamember;
+            and thus have incomplete early debug.  */
+         || (TREE_CODE (decl) == VAR_DECL
+             && TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
       /* Avoid confusing the debug information machinery when there are
         errors.  */
       && !seen_error ())
Index: gcc/cp/semantics.c
===================================================================
--- gcc/cp/semantics.c  (revision 227258)
+++ gcc/cp/semantics.c  (working copy)
@@ -2962,15 +2962,21 @@ finish_member_declaration (tree decl)
    translation units which include the PCH file.  */
 
 void
-note_decl_for_pch (tree decl)
+note_decl_for_pch (tree)
 {
   gcc_assert (pch_file);
 
+  /* ???  This changes debug info with/without PCH as DW_AT_linkage_name
+     attributes are added at different times (early when with PCH
+     or late, via pending assembler names, when without PCH).
+     See g++.dg/pch/system-[12].C.  */
+#if 0
   /* There's a good chance that we'll have to mangle names at some
      point, even if only for emission in debugging information.  */
   if (VAR_OR_FUNCTION_DECL_P (decl)
       && !processing_template_decl)
     mangle_decl (decl);
+#endif
 }
 
 /* Finish processing a complete template declaration.  The PARMS are

Reply via email to