Update to 4.8.2.
[platform/upstream/gcc48.git] / gcc / cgraphbuild.c
index 8bf8830..fb01f24 100644 (file)
@@ -1,6 +1,5 @@
 /* Callgraph construction.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 2003-2013 Free Software Foundation, Inc.
    Contributed by Jan Hubicka
 
 This file is part of GCC.
@@ -54,7 +53,7 @@ record_reference (tree *tp, int *walk_subtrees, void *data)
   tree decl;
   struct record_reference_ctx *ctx = (struct record_reference_ctx *)data;
 
-  t = canonicalize_constructor_val (t);
+  t = canonicalize_constructor_val (t, NULL);
   if (!t)
     t = *tp;
   else if (t != *tp)
@@ -77,18 +76,16 @@ record_reference (tree *tp, int *walk_subtrees, void *data)
          struct cgraph_node *node = cgraph_get_create_node (decl);
          if (!ctx->only_vars)
            cgraph_mark_address_taken_node (node);
-         ipa_record_reference (NULL, ctx->varpool_node, node, NULL,
+         ipa_record_reference ((symtab_node)ctx->varpool_node,
+                               (symtab_node)node,
                                IPA_REF_ADDR, NULL);
        }
 
       if (TREE_CODE (decl) == VAR_DECL)
        {
-         struct varpool_node *vnode = varpool_node (decl);
-         if (lang_hooks.callgraph.analyze_expr)
-           lang_hooks.callgraph.analyze_expr (&decl, walk_subtrees);
-         varpool_mark_needed_node (vnode);
-         ipa_record_reference (NULL, ctx->varpool_node,
-                               NULL, vnode,
+         struct varpool_node *vnode = varpool_node_for_decl (decl);
+         ipa_record_reference ((symtab_node)ctx->varpool_node,
+                               (symtab_node)vnode,
                                IPA_REF_ADDR, NULL);
        }
       *walk_subtrees = 0;
@@ -102,9 +99,6 @@ record_reference (tree *tp, int *walk_subtrees, void *data)
          *walk_subtrees = 0;
          break;
        }
-
-      if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
-       return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees);
       break;
     }
 
@@ -128,10 +122,9 @@ record_type_list (struct cgraph_node *node, tree list)
          type = TREE_OPERAND (type, 0);
          if (TREE_CODE (type) == VAR_DECL)
            {
-             struct varpool_node *vnode = varpool_node (type);
-             varpool_mark_needed_node (vnode);
-             ipa_record_reference (node, NULL,
-                                   NULL, vnode,
+             struct varpool_node *vnode = varpool_node_for_decl (type);
+             ipa_record_reference ((symtab_node)node,
+                                   (symtab_node)vnode,
                                    IPA_REF_ADDR, NULL);
            }
        }
@@ -146,12 +139,12 @@ record_eh_tables (struct cgraph_node *node, struct function *fun)
 {
   eh_region i;
 
-  if (DECL_FUNCTION_PERSONALITY (node->decl))
+  if (DECL_FUNCTION_PERSONALITY (node->symbol.decl))
     {
       struct cgraph_node *per_node;
 
-      per_node = cgraph_get_create_node (DECL_FUNCTION_PERSONALITY (node->decl));
-      ipa_record_reference (node, NULL, per_node, NULL, IPA_REF_ADDR, NULL);
+      per_node = cgraph_get_create_node (DECL_FUNCTION_PERSONALITY (node->symbol.decl));
+      ipa_record_reference ((symtab_node)node, (symtab_node)per_node, IPA_REF_ADDR, NULL);
       cgraph_mark_address_taken_node (per_node);
     }
 
@@ -200,20 +193,6 @@ record_eh_tables (struct cgraph_node *node, struct function *fun)
     }
 }
 
-/* Reset inlining information of all incoming call edges of NODE.  */
-
-void
-reset_inline_failed (struct cgraph_node *node)
-{
-  struct cgraph_edge *e;
-
-  for (e = node->callers; e; e = e->next_caller)
-    {
-      e->callee->global.inlined_to = NULL;
-      initialize_inline_failed (e);
-    }
-}
-
 /* Computes the frequency of the call statement so that it can be stored in
    cgraph_edge.  BB is the basic block of the call statement.  */
 int
@@ -246,21 +225,17 @@ mark_address (gimple stmt, tree addr, void *data)
     {
       struct cgraph_node *node = cgraph_get_create_node (addr);
       cgraph_mark_address_taken_node (node);
-      ipa_record_reference ((struct cgraph_node *)data, NULL,
-                           node, NULL,
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)node,
                            IPA_REF_ADDR, stmt);
     }
   else if (addr && TREE_CODE (addr) == VAR_DECL
           && (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
     {
-      struct varpool_node *vnode = varpool_node (addr);
-      int walk_subtrees;
-
-      if (lang_hooks.callgraph.analyze_expr)
-       lang_hooks.callgraph.analyze_expr (&addr, &walk_subtrees);
-      varpool_mark_needed_node (vnode);
-      ipa_record_reference ((struct cgraph_node *)data, NULL,
-                           NULL, vnode,
+      struct varpool_node *vnode = varpool_node_for_decl (addr);
+
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_ADDR, stmt);
     }
 
@@ -279,21 +254,17 @@ mark_load (gimple stmt, tree t, void *data)
         directly manipulated in the code.  Pretend that it's an address.  */
       struct cgraph_node *node = cgraph_get_create_node (t);
       cgraph_mark_address_taken_node (node);
-      ipa_record_reference ((struct cgraph_node *)data, NULL,
-                           node, NULL,
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)node,
                            IPA_REF_ADDR, stmt);
     }
   else if (t && TREE_CODE (t) == VAR_DECL
           && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
     {
-      struct varpool_node *vnode = varpool_node (t);
-      int walk_subtrees;
-
-      if (lang_hooks.callgraph.analyze_expr)
-       lang_hooks.callgraph.analyze_expr (&t, &walk_subtrees);
-      varpool_mark_needed_node (vnode);
-      ipa_record_reference ((struct cgraph_node *)data, NULL,
-                           NULL, vnode,
+      struct varpool_node *vnode = varpool_node_for_decl (t);
+
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_LOAD, stmt);
     }
   return false;
@@ -308,14 +279,10 @@ mark_store (gimple stmt, tree t, void *data)
   if (t && TREE_CODE (t) == VAR_DECL
       && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
     {
-      struct varpool_node *vnode = varpool_node (t);
-      int walk_subtrees;
-
-      if (lang_hooks.callgraph.analyze_expr)
-       lang_hooks.callgraph.analyze_expr (&t, &walk_subtrees);
-      varpool_mark_needed_node (vnode);
-      ipa_record_reference ((struct cgraph_node *)data, NULL,
-                           NULL, vnode,
+      struct varpool_node *vnode = varpool_node_for_decl (t);
+
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_STORE, stmt);
      }
   return false;
@@ -362,22 +329,25 @@ build_cgraph_edges (void)
              && gimple_omp_parallel_child_fn (stmt))
            {
              tree fn = gimple_omp_parallel_child_fn (stmt);
-             ipa_record_reference (node, NULL, cgraph_get_create_node (fn),
-                                   NULL, IPA_REF_ADDR, stmt);
+             ipa_record_reference ((symtab_node)node,
+                                   (symtab_node)cgraph_get_create_node (fn),
+                                   IPA_REF_ADDR, stmt);
            }
          if (gimple_code (stmt) == GIMPLE_OMP_TASK)
            {
              tree fn = gimple_omp_task_child_fn (stmt);
              if (fn)
-               ipa_record_reference (node, NULL, cgraph_get_create_node (fn),
-                                     NULL, IPA_REF_ADDR, stmt);
+               ipa_record_reference ((symtab_node)node,
+                                     (symtab_node) cgraph_get_create_node (fn),
+                                     IPA_REF_ADDR, stmt);
              fn = gimple_omp_task_copy_fn (stmt);
              if (fn)
-               ipa_record_reference (node, NULL, cgraph_get_create_node (fn),
-                                     NULL, IPA_REF_ADDR, stmt);
+               ipa_record_reference ((symtab_node)node,
+                                     (symtab_node)cgraph_get_create_node (fn),
+                                     IPA_REF_ADDR, stmt);
            }
        }
-      for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
+      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
                                       mark_load, mark_store, mark_address);
    }
@@ -385,7 +355,8 @@ build_cgraph_edges (void)
   /* Look for initializers of constant variables and private statics.  */
   FOR_EACH_LOCAL_DECL (cfun, ix, decl)
     if (TREE_CODE (decl) == VAR_DECL
-       && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
+       && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
+       && !DECL_HAS_VALUE_EXPR_P (decl))
       varpool_finalize_decl (decl);
   record_eh_tables (node, cfun);
 
@@ -398,6 +369,7 @@ struct gimple_opt_pass pass_build_cgraph_edges =
  {
   GIMPLE_PASS,
   "*build_cgraph_edges",                       /* name */
+  OPTGROUP_NONE,                        /* optinfo_flags */
   NULL,                                        /* gate */
   build_cgraph_edges,                  /* execute */
   NULL,                                        /* sub */
@@ -420,7 +392,7 @@ void
 record_references_in_initializer (tree decl, bool only_vars)
 {
   struct pointer_set_t *visited_nodes = pointer_set_create ();
-  struct varpool_node *node = varpool_node (decl);
+  struct varpool_node *node = varpool_node_for_decl (decl);
   struct record_reference_ctx ctx = {false, NULL};
 
   ctx.varpool_node = node;
@@ -441,7 +413,7 @@ rebuild_cgraph_edges (void)
   gimple_stmt_iterator gsi;
 
   cgraph_node_remove_callees (node);
-  ipa_remove_all_references (&node->ref_list);
+  ipa_remove_all_references (&node->symbol.ref_list);
 
   node->count = ENTRY_BLOCK_PTR->count;
 
@@ -469,7 +441,7 @@ rebuild_cgraph_edges (void)
                                         mark_store, mark_address);
 
        }
-      for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
+      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
                                       mark_load, mark_store, mark_address);
     }
@@ -489,7 +461,7 @@ cgraph_rebuild_references (void)
   struct cgraph_node *node = cgraph_get_node (current_function_decl);
   gimple_stmt_iterator gsi;
 
-  ipa_remove_all_references (&node->ref_list);
+  ipa_remove_all_references (&node->symbol.ref_list);
 
   node->count = ENTRY_BLOCK_PTR->count;
 
@@ -503,7 +475,7 @@ cgraph_rebuild_references (void)
                                         mark_store, mark_address);
 
        }
-      for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
+      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
                                       mark_load, mark_store, mark_address);
     }
@@ -515,6 +487,7 @@ struct gimple_opt_pass pass_rebuild_cgraph_edges =
  {
   GIMPLE_PASS,
   "*rebuild_cgraph_edges",             /* name */
+  OPTGROUP_NONE,                        /* optinfo_flags */
   NULL,                                        /* gate */
   rebuild_cgraph_edges,                        /* execute */
   NULL,                                        /* sub */
@@ -542,6 +515,7 @@ struct gimple_opt_pass pass_remove_cgraph_callee_edges =
  {
   GIMPLE_PASS,
   "*remove_cgraph_callee_edges",               /* name */
+  OPTGROUP_NONE,                        /* optinfo_flags */
   NULL,                                        /* gate */
   remove_cgraph_callee_edges,          /* execute */
   NULL,                                        /* sub */