cgraphunit.c (cgraph_create_edges): Do not walk BLOCK; finalize local statics when...
authorJan Hubicka <jh@suse.cz>
Thu, 9 Jun 2005 16:21:36 +0000 (18:21 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 9 Jun 2005 16:21:36 +0000 (16:21 +0000)
* 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.

From-SVN: r100802

gcc/ChangeLog
gcc/cgraphunit.c
gcc/dwarf2out.c
gcc/passes.c
gcc/tree-inline.c

index d647b3d190d58b85dd508adbe0e03babb7b6c7b5..9eb7ed5f5809ea020bb78384cb3b1aede77dcddf 100644 (file)
@@ -1,3 +1,16 @@
+2005-06-09  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.
+
 2005-06-09  Daniel Berlin  <dberlin@dberlin.org>
 
        * config/rs6000/rs6000.c: (rs6000_insn_valid_within_doloop): Fix
index 0cedbd62086b6ceb4a133e956f76017364854f34..67d5e49a78794a82278a13797bca1312816412e2 100644 (file)
@@ -543,26 +543,19 @@ cgraph_create_edges (struct cgraph_node *node, tree body)
          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)
+  /* Look for initializers of constant variables and private statics.  */
+  for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
+       step;
+       step = TREE_CHAIN (step))
     {
-      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);
+      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);
     }
-
-  /* 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;
@@ -743,6 +736,14 @@ cgraph_varpool_assemble_pending_decls (void)
       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 2fe28d5e3fcfb40addd24ceb0c2703e0373d27e3..1ae49905806f99e9611bf0effc37ec28b2bb8f34 100644 (file)
@@ -12523,6 +12523,11 @@ decls_for_scope (tree stmt, dw_die_ref context_die, int depth)
          
          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);
        }
@@ -13070,6 +13075,10 @@ dwarf2out_decl (tree decl)
       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 369a2a53b2716f9fd6dccde87c68c1fc034e11ad..93126b020ea5d84ef18be188e045ca041cc7818b 100644 (file)
@@ -227,7 +227,7 @@ rest_of_decl_compilation (tree decl,
          && !DECL_EXTERNAL (decl))
        {
          if (flag_unit_at_a_time && !cgraph_global_info_ready
-             && TREE_CODE (decl) != FUNCTION_DECL && top_level)
+             && TREE_CODE (decl) != FUNCTION_DECL)
            cgraph_varpool_finalize_decl (decl);
          else
            assemble_variable (decl, top_level, at_end, 0);
index 6d2ef06eb27d6887d55eb4f4e371014a3bd64000..db4b1e913066cbf070ebfef16e13a4e724581e47 100644 (file)
@@ -385,6 +385,17 @@ remap_decls (tree decls, inline_data *id)
     {
       tree new_var;
 
+      /* We can not chain the local static declarations into the unexpanded_var_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);