On Wed, 5 Feb 2014, Jan Hubicka wrote: > > > > 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?
No, we don't stream those. We'd need to stream what the FEs think are the globals (lang_hooks.getdecls()) and somehow partition them and ship them somewhere. Richard. > 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 ---- > > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer