[PATCH] Refactor dwarf2out_late_global_decl

Richard Biener rguenther@suse.de
Wed Sep 16 08:19:00 GMT 2015


This makes dwarf2out_late_global_decl only do late work, namely add
location/value attributes.  For current LTO we need to make it do
early_global_decl as well (with LTO early debug this will be
conditionalized on !flag_lto_early_debug).

Bootstrapped and tested on x86_64-unknown-linux-gnu and verified
there are no regressions with the gdb testsuite.

This depends on the C++ PCH mangling patch.

If there are no further comments (and the mangling patch is approved) then
I plan to commit it.  I am working on a similar patch for
dwarf2out_function_decl right now.

(just noticed we have a 2nd dwarf maintainer, CCed now)

Richard.

2015-09-16  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.

Index: gcc/passes.c
===================================================================
--- gcc/passes.c	(revision 227779)
+++ gcc/passes.c	(working copy)
@@ -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 ())
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 227779)
+++ gcc/dwarf2out.c	(working copy)
@@ -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.
-
-     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))
+  /* We have to generate early debug late for LTO.  */
+  if (in_lto_p)
+    dwarf2out_early_global_decl (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



More information about the Gcc-patches mailing list