i386.c (legitimize_tls_address): Generate tls_initial_exec_64_sun only when !TARGET_X32.
[gcc.git] / gcc / cgraphbuild.c
index d7ef7f9d99daec7d59296e10c0b0739761f483f7..ce8f2ee080a798f8fe1a1efab09aa4e8dedbeef0 100644 (file)
@@ -54,7 +54,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 +77,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,
+         ipa_record_reference ((symtab_node)ctx->varpool_node,
+                               (symtab_node)vnode,
                                IPA_REF_ADDR, NULL);
        }
       *walk_subtrees = 0;
@@ -102,9 +100,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;
     }
 
@@ -129,9 +124,8 @@ record_type_list (struct cgraph_node *node, tree list)
          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,
+             ipa_record_reference ((symtab_node)node,
+                                   (symtab_node)vnode,
                                    IPA_REF_ADDR, NULL);
            }
        }
@@ -146,12 +140,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);
     }
 
@@ -232,21 +226,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,
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_ADDR, stmt);
     }
 
@@ -265,21 +255,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,
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_LOAD, stmt);
     }
   return false;
@@ -295,13 +281,9 @@ mark_store (gimple stmt, tree t, void *data)
       && (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,
+      ipa_record_reference ((symtab_node)data,
+                           (symtab_node)vnode,
                            IPA_REF_STORE, stmt);
      }
   return false;
@@ -348,22 +330,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);
    }
@@ -371,7 +356,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);
 
@@ -427,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;
 
@@ -455,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);
     }
@@ -475,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;
 
@@ -489,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);
     }