Deal with local static same way as we deal with global static for IPA

Jan Hubicka jh@suse.cz
Thu Jun 9 14:12:00 GMT 2005


> On Wed, Jun 08, 2005 at 09:39:17PM +0200, Jan Hubicka wrote:
> > OK, so you suggest instead of remapping it, simply go ahead and drop it
> > into the unexpanded_var_list (so we will have generic functions with
> > this list partly initialized before we gimplify)?
> 
> Yes.
OK, done thus...

Bootstrapped/regtested i686-pc-gnu-linux, OK?

Honza

2005-06-07  Jan Hubicka  <jh@suse.cz>
	* cgraphunit.c (cgraph_create_edges): Do not walk BLOCK; finalize
	local statics when doing unit-at-a-time.
	(cgraph_varpool_assemble_pending_decls): Output debug info.
	* dwarf2out.c (decls_for_scope): Skip local statics.
	(dwarf2out_decl): Handle local statics.
	* passes.c (rest_of_decl_compilation): Do not differentiate
	local and global statics in unit-at-a-time.
	* tree-inline.c (remap_decls): Put local static into
	unexpanded_vars_list rather than introducing duplicated VAR_DECL
	node.
Index: cgraphunit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraphunit.c,v
retrieving revision 1.116
diff -c -3 -p -r1.116 cgraphunit.c
*** cgraphunit.c	4 Jun 2005 20:23:13 -0000	1.116
--- cgraphunit.c	9 Jun 2005 09:57:18 -0000
*************** cgraph_create_edges (struct cgraph_node 
*** 543,568 ****
  	  walk_tree (bsi_stmt_ptr (bsi), record_reference, node, visited_nodes);
        }
  
!   /* Walk over any private statics that may take addresses of functions.  */
!   if (TREE_CODE (DECL_INITIAL (body)) == BLOCK)
!     {
!       for (step = BLOCK_VARS (DECL_INITIAL (body));
! 	   step;
! 	   step = TREE_CHAIN (step))
! 	if (DECL_INITIAL (step))
! 	  walk_tree (&DECL_INITIAL (step), record_reference, node, visited_nodes);
      }
- 
-   /* Also look here for private statics.  */
-   if (DECL_STRUCT_FUNCTION (body))
-     for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
- 	 step;
- 	 step = TREE_CHAIN (step))
-       {
- 	tree decl = TREE_VALUE (step);
- 	if (DECL_INITIAL (decl) && TREE_STATIC (decl))
- 	  walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes);
-       }
      
    pointer_set_destroy (visited_nodes);
    visited_nodes = NULL;
--- 543,561 ----
  	  walk_tree (bsi_stmt_ptr (bsi), record_reference, node, visited_nodes);
        }
  
!   /* Look for initializers of constant variables and private statics.  */
!   for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
!        step;
!        step = TREE_CHAIN (step))
!     {
!       tree decl = TREE_VALUE (step);
!       if (TREE_CODE (decl) == VAR_DECL
! 	  && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
! 	  && flag_unit_at_a_time)
! 	cgraph_varpool_finalize_decl (decl);
!       else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
! 	walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes);
      }
      
    pointer_set_destroy (visited_nodes);
    visited_nodes = NULL;
*************** cgraph_varpool_assemble_pending_decls (v
*** 743,748 ****
--- 736,749 ----
        if (!TREE_ASM_WRITTEN (decl) && !node->alias && !DECL_EXTERNAL (decl))
  	{
  	  assemble_variable (decl, 0, 1, 0);
+ 	  /* Local static vairables are neever seen by check_global_declarations
+ 	     so we need to output debug info by hand.  */
+ 	  if (decl_function_context (decl) && errorcount == 0 && sorrycount == 0)
+ 	    {
+ 	      timevar_push (TV_SYMOUT);
+ 	      (*debug_hooks->global_decl) (decl);
+ 	      timevar_pop (TV_SYMOUT);
+ 	    }
  	  changed = true;
  	}
        node->next_needed = NULL;
Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
retrieving revision 1.600
diff -c -3 -p -r1.600 dwarf2out.c
*** dwarf2out.c	8 Jun 2005 07:48:16 -0000	1.600
--- dwarf2out.c	9 Jun 2005 09:57:19 -0000
*************** decls_for_scope (tree stmt, dw_die_ref c
*** 12523,12528 ****
--- 12523,12533 ----
  	  
  	  if (die != NULL && die->die_parent == NULL)
  	    add_child_die (context_die, die);
+ 	  /* Do not produce debug information for static variables since
+ 	     these might be optimized out.  We are called for these later
+ 	     in cgraph_varpool_analyze_pending_decls. */
+ 	  if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
+ 	    ;
  	  else
  	    gen_decl_die (decl, context_die);
  	}
*************** dwarf2out_decl (tree decl)
*** 13070,13075 ****
--- 13075,13084 ----
        if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
  	return;
  
+       /* For local statics lookup proper context die.  */
+       if (TREE_STATIC (decl) && decl_function_context (decl))
+ 	context_die = lookup_decl_die (DECL_CONTEXT (decl));
+ 
        /* If we are in terse mode, don't generate any DIEs to represent any
  	 variable declarations or definitions.  */
        if (debug_info_level <= DINFO_LEVEL_TERSE)
Index: passes.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/passes.c,v
retrieving revision 2.91
diff -c -3 -p -r2.91 passes.c
*** passes.c	25 May 2005 12:33:32 -0000	2.91
--- passes.c	9 Jun 2005 09:57:19 -0000
*************** rest_of_decl_compilation (tree decl,
*** 227,233 ****
  	  && !DECL_EXTERNAL (decl))
  	{
  	  if (flag_unit_at_a_time && !cgraph_global_info_ready
! 	      && TREE_CODE (decl) != FUNCTION_DECL && top_level)
  	    cgraph_varpool_finalize_decl (decl);
  	  else
  	    assemble_variable (decl, top_level, at_end, 0);
--- 227,233 ----
  	  && !DECL_EXTERNAL (decl))
  	{
  	  if (flag_unit_at_a_time && !cgraph_global_info_ready
! 	      && TREE_CODE (decl) != FUNCTION_DECL)
  	    cgraph_varpool_finalize_decl (decl);
  	  else
  	    assemble_variable (decl, top_level, at_end, 0);
Index: tree-inline.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v
retrieving revision 1.192
diff -c -3 -p -r1.192 tree-inline.c
*** tree-inline.c	6 Jun 2005 19:31:26 -0000	1.192
--- tree-inline.c	9 Jun 2005 09:57:19 -0000
*************** remap_decls (tree decls, inline_data *id
*** 385,390 ****
--- 385,401 ----
      {
        tree new_var;
  
+       /* We can not chain the local static declarations into the list
+          as we can't duplicate them or break one decl rule.  Go ahead and link
+          them into unexpanded_var_list.  */
+       if (!lang_hooks.tree_inlining.auto_var_in_fn_p (old_var, id->callee)
+ 	  && !DECL_EXTERNAL (old_var))
+ 	{
+ 	  cfun->unexpanded_var_list = tree_cons (NULL_TREE, old_var,
+ 						 cfun->unexpanded_var_list);
+ 	  continue;
+ 	}
+ 
        /* Remap the variable.  */
        new_var = remap_decl (old_var, id);
  



More information about the Gcc-patches mailing list