Hi! This patch fixes both a correctness problem (bootstrap failure in libgfortran for a couple of targets) and debug info quality issue. The correctness issue is about the fact that clearing DECL_INITIAL (well, setting it to error_mark_node is the same) in varpool_remove_node is changing the decl's bss_initializer_p (decl) status, thus can affect section flags of it for DWARF2 if an unused decl has e.g. make_decl_rtl_for_debug called from implicit pointer expansion before varpool_remove_node and then e.g. during dwarf2out_finish after it. This function intentionally doesn't remember the RTL, that could affect code generation. And for the debug info quality issue see the next patch that actually improves use of DECL_INITIAL for debug info generation.
Even if we add some param to limit the size of the initializers we want to emit into debug info, still the varpool_remove_node clearing of the initializer would need to be done (if we want to try hard to save compile time memory) in a way to keep the bss_initializer_p the same as before, so call it before clearing, if it was set, setting it to error_mark_node is perhaps fine, if it was set, it needs to be set to some other magic value and everything that uses DECL_INITIAL afterwards need to be taught about that (including bss_initializer_p not to treat that other magic value as bss initializer). Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2012-12-06 Jakub Jelinek <ja...@redhat.com> PR fortran/55395 * varpool.c (varpool_remove_node): Don't drop DECL_INITIAL if -g and emitting DWARF2+. --- gcc/varpool.c.jj 2012-11-19 14:41:27.000000000 +0100 +++ gcc/varpool.c 2012-12-04 17:42:41.228752645 +0100 @@ -65,7 +65,10 @@ varpool_remove_node (struct varpool_node && !DECL_VIRTUAL_P (node->symbol.decl) /* dbxout output constant initializers for readonly vars. */ && (!host_integerp (DECL_INITIAL (node->symbol.decl), 0) - || !TREE_READONLY (node->symbol.decl))) + || !TREE_READONLY (node->symbol.decl)) + /* dwarf2out can use most of the initializers. */ + && write_symbols != DWARF2_DEBUG + && write_symbols != VMS_AND_DWARF2_DEBUG) DECL_INITIAL (node->symbol.decl) = error_mark_node; ggc_free (node); } Jakub