> > When looking at PR60060, outputting the declaration debug info for > a local static variable twice (once via BLOCK_VARS and once via > calling the debug hook on all globals) I noticed that the > rest_of_decl_compilation call in materialize_cgraph always works > on the empty lto_global_var_decls vector (we only populate it > later). That results in the opportunity to effectively remove it > and in lto_write_globals walk over the defined vars in the > varpool instead. > > Eventually the fix for PR60060 is to not push TREE_ASM_WRITTEN > decls there (but I'm not sure of other side-effects of that ...). > > Thus, this cleanup first. > > LTO bootstrap / regtest running on x86_64-unknown-linux-gnu. > > Ok?
Seems OK to me. I always had an impression that this machinery exists to make decls that are revmoed fro symbol table (optimized out) to land the debug info, but I think this is mostly broken by partitioning anyway, right? Do we stream them at all? Honza > > Thanks, > Richard. > > 2014-02-05 Richard Biener <rguent...@suse.de> > > lto/ > * lto.h (lto_global_var_decls): Remove. > * lto-lang.c (lto_init): Do not allocate lto_global_var_decls. > (lto_write_globals): Do nothing in WPA stage, gather globals from > the varpool here ... > * lto.c (lto_main): ... not here. > (materialize_cgraph): Do not call rest_of_decl_compilation > on the empty lto_global_var_decls vector. > (lto_global_var_decls): Remove. > > Index: gcc/lto/lto-lang.c > =================================================================== > *** gcc/lto/lto-lang.c (revision 207497) > --- gcc/lto/lto-lang.c (working copy) > *************** lto_getdecls (void) > *** 1075,1085 **** > static void > lto_write_globals (void) > { > ! tree *vec = lto_global_var_decls->address (); > ! int len = lto_global_var_decls->length (); > wrapup_global_declarations (vec, len); > emit_debug_global_declarations (vec, len); > ! vec_free (lto_global_var_decls); > } > > static tree > --- 1075,1094 ---- > static void > lto_write_globals (void) > { > ! if (flag_wpa) > ! return; > ! > ! /* Record the global variables. */ > ! vec<tree> lto_global_var_decls = vNULL; > ! varpool_node *vnode; > ! FOR_EACH_DEFINED_VARIABLE (vnode) > ! lto_global_var_decls.safe_push (vnode->decl); > ! > ! tree *vec = lto_global_var_decls.address (); > ! int len = lto_global_var_decls.length (); > wrapup_global_declarations (vec, len); > emit_debug_global_declarations (vec, len); > ! lto_global_var_decls.release (); > } > > static tree > *************** lto_init (void) > *** 1218,1224 **** > #undef NAME_TYPE > > /* Initialize LTO-specific data structures. */ > - vec_alloc (lto_global_var_decls, 256); > in_lto_p = true; > > return true; > --- 1227,1232 ---- > Index: gcc/lto/lto.c > =================================================================== > *** gcc/lto/lto.c (revision 207497) > --- gcc/lto/lto.c (working copy) > *************** along with GCC; see the file COPYING3. > *** 50,57 **** > #include "context.h" > #include "pass_manager.h" > > - /* Vector to keep track of external variables we've seen so far. */ > - vec<tree, va_gc> *lto_global_var_decls; > > static GTY(()) tree first_personality_decl; > > --- 50,55 ---- > *************** read_cgraph_and_symbols (unsigned nfiles > *** 3009,3017 **** > static void > materialize_cgraph (void) > { > - tree decl; > struct cgraph_node *node; > - unsigned i; > timevar_id_t lto_timer; > > if (!quiet_flag) > --- 3007,3013 ---- > *************** materialize_cgraph (void) > *** 3043,3052 **** > current_function_decl = NULL; > set_cfun (NULL); > > - /* Inform the middle end about the global variables we have seen. */ > - FOR_EACH_VEC_ELT (*lto_global_var_decls, i, decl) > - rest_of_decl_compilation (decl, 1, 0); > - > if (!quiet_flag) > fprintf (stderr, "\n"); > > --- 3039,3044 ---- > *************** lto_main (void) > *** 3309,3316 **** > do_whole_program_analysis (); > else > { > - varpool_node *vnode; > - > timevar_start (TV_PHASE_OPT_GEN); > > materialize_cgraph (); > --- 3301,3306 ---- > *************** lto_main (void) > *** 3330,3339 **** > this. */ > if (flag_lto_report || (flag_wpa && flag_lto_report_wpa)) > print_lto_report_1 (); > - > - /* Record the global variables. */ > - FOR_EACH_DEFINED_VARIABLE (vnode) > - vec_safe_push (lto_global_var_decls, vnode->decl); > } > } > > --- 3320,3325 ---- > Index: gcc/lto/lto.h > =================================================================== > *** gcc/lto/lto.h (revision 207497) > --- gcc/lto/lto.h (working copy) > *************** extern tree lto_eh_personality (void); > *** 41,49 **** > extern void lto_main (void); > extern void lto_read_all_file_options (void); > > - /* In lto-symtab.c */ > - extern GTY(()) vec<tree, va_gc> *lto_global_var_decls; > - > /* In lto-elf.c or lto-coff.c */ > extern lto_file *lto_obj_file_open (const char *filename, bool writable); > extern void lto_obj_file_close (lto_file *file); > --- 41,46 ----