> 
> 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 ----

Reply via email to