X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gcc%2Fcgraphbuild.c;h=fb01f24ec076d69740a04fd7d6970ee67b5ac5e0;hb=refs%2Fheads%2Faccepted%2Ftizen%2Fmobile;hp=8bf883005936bbf12058860a85e56faad480e236;hpb=b209d8dc611f3cd793491b8490522bdaf819622b;p=platform%2Fupstream%2Fgcc48.git diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index 8bf8830..fb01f24 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -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 */