This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Refactor dwarf2out_late_global_decl
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: jason at redhat dot com, ccoutant at gmail dot com
- Date: Wed, 16 Sep 2015 10:07:14 +0200 (CEST)
- Subject: [PATCH] Refactor dwarf2out_late_global_decl
- Authentication-results: sourceware.org; auth=none
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