passes.c (rest_of_decl_compilation): Always call early_global_decl debug hook when...
authorRichard Biener <rguenther@suse.de>
Thu, 17 Sep 2015 09:47:43 +0000 (09:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Sep 2015 09:47:43 +0000 (09:47 +0000)
2015-09-17  Richard Biener  <rguenther@suse.de>

* passes.c (rest_of_decl_compilation): Always call early_global_decl
debug hook when we created a varpool node.
* dwarf2out.c (dwarf2out_late_global_decl): When in LTO call
dwarf2out_early_global_decl, when not just add location or
value attributes to existing DIEs.

From-SVN: r227857

gcc/ChangeLog
gcc/dwarf2out.c
gcc/passes.c

index dcc6f2f4347a9147f688a4840d493edbdeba62b3..ffa966e00fb17fd9819cfc0a3a4098bf66677d96 100644 (file)
@@ -1,3 +1,11 @@
+2015-09-17  Richard Biener  <rguenther@suse.de>
+
+       * passes.c (rest_of_decl_compilation): Always call early_global_decl
+       debug hook when we created a varpool node.
+       * dwarf2out.c (dwarf2out_late_global_decl): When in LTO call
+       dwarf2out_early_global_decl, when not just add location or
+       value attributes to existing DIEs.
+
 2015-09-17  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64.md (copysigndf3): New.
index 7d098d8cb0ed6ba80a13b391819f34a2ce14ffb3..04d593b16a2fb9ff38b22253a9b55b499029012c 100644 (file)
@@ -21626,14 +21626,20 @@ dwarf2out_early_global_decl (tree decl)
 static void
 dwarf2out_late_global_decl (tree decl)
 {
-  /* Output any global decls we missed or fill-in any location
-     information we were unable to determine on the first pass.
+  /* We have to generate early debug late for LTO.  */
+  if (in_lto_p)
+    dwarf2out_early_global_decl (decl);
 
-     Skip over functions because they were handled by the
-     debug_hooks->function_decl() call in rest_of_handle_final.  */
-  if ((TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl))
+    /* Fill-in any location information we were unable to determine
+       on the first pass.  */
+  if (TREE_CODE (decl) == VAR_DECL
       && !POINTER_BOUNDS_P (decl))
-    dwarf2out_decl (decl);
+    {
+      dw_die_ref die = lookup_decl_die (decl);
+      if (die)
+       add_location_or_const_value_attribute (die, decl, false,
+                                              DW_AT_location);
+    }
 }
 
 /* Output debug information for type decl DECL.  Called from toplev.c
index 1b677ac5a67ee373912844a705a4a6f5a3e18c4b..274e508f62d956f8f4ff46b1edfc3d4b9f147ccf 100644 (file)
@@ -318,7 +318,17 @@ 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 and late debug
+            called from varpool node removal fails to handle it
+            properly.  */
+         || (TREE_CODE (decl) == VAR_DECL
+             && TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
       /* Avoid confusing the debug information machinery when there are
         errors.  */
       && !seen_error ())