From 9f9ebcdfc635e94463350898b625e0f3b1431ec0 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 11 Apr 2011 17:17:44 +0200 Subject: [PATCH] cgraph.c (cgraph_local_info): Call cgraph_get_node instead of cgraph_node, handle NULL return value. 2011-04-11 Martin Jambor gcc/ * cgraph.c (cgraph_local_info): Call cgraph_get_node instead of cgraph_node, handle NULL return value. (cgraph_global_info): Likewise. (cgraph_rtl_info): Likewise. * tree-inline.c (estimate_num_insns): Likewise. * gimplify.c (unshare_body): Likewise. (unvisit_body): Likewise. (gimplify_body): Likewise. * predict.c (optimize_function_for_size_p): Likewise. * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Likewise. (call_may_clobber_ref_p_1): Likewise. * varasm.c (function_section_1): Likewise. (assemble_start_function): Likewise. gcc/java/ * decl.c (java_mark_decl_local): Call cgraph_get_node instead of cgraph_node and handle returned NULL. From-SVN: r172258 --- gcc/ChangeLog | 16 ++++++++++++++++ gcc/cgraph.c | 15 ++++++++++----- gcc/gimplify.c | 12 +++++++----- gcc/java/ChangeLog | 5 +++++ gcc/java/decl.c | 5 ++++- gcc/predict.c | 15 +++++++++++---- gcc/tree-inline.c | 3 ++- gcc/tree-ssa-alias.c | 17 +++++++++++------ gcc/varasm.c | 18 +++++++++++------- 9 files changed, 77 insertions(+), 29 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dee374f6d63..1533847975f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2011-04-11 Martin Jambor + + * cgraph.c (cgraph_local_info): Call cgraph_get_node instead + of cgraph_node, handle NULL return value. + (cgraph_global_info): Likewise. + (cgraph_rtl_info): Likewise. + * tree-inline.c (estimate_num_insns): Likewise. + * gimplify.c (unshare_body): Likewise. + (unvisit_body): Likewise. + (gimplify_body): Likewise. + * predict.c (optimize_function_for_size_p): Likewise. + * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Likewise. + (call_may_clobber_ref_p_1): Likewise. + * varasm.c (function_section_1): Likewise. + (assemble_start_function): Likewise. + 2011-04-11 Martin Jambor * except.c (set_nothrow_function_flags): Call cgraph_get_node instead diff --git a/gcc/cgraph.c b/gcc/cgraph.c index a6217e9af35..80f7c7c34f7 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1766,7 +1766,9 @@ cgraph_local_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); - node = cgraph_node (decl); + node = cgraph_get_node (decl); + if (!node) + return NULL; return &node->local; } @@ -1778,7 +1780,9 @@ cgraph_global_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready); - node = cgraph_node (decl); + node = cgraph_get_node (decl); + if (!node) + return NULL; return &node->global; } @@ -1790,9 +1794,10 @@ cgraph_rtl_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); - node = cgraph_node (decl); - if (decl != current_function_decl - && !TREE_ASM_WRITTEN (node->decl)) + node = cgraph_get_node (decl); + if (!node + || (decl != current_function_decl + && !TREE_ASM_WRITTEN (node->decl))) return NULL; return &node->rtl; } diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 633e613da9f..598fe9cfb97 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -959,11 +959,11 @@ copy_if_shared (tree *tp) static void unshare_body (tree *body_p, tree fndecl) { - struct cgraph_node *cgn = cgraph_node (fndecl); + struct cgraph_node *cgn = cgraph_get_node (fndecl); copy_if_shared (body_p); - if (body_p == &DECL_SAVED_TREE (fndecl)) + if (cgn && body_p == &DECL_SAVED_TREE (fndecl)) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl); } @@ -1000,11 +1000,11 @@ unmark_visited (tree *tp) static void unvisit_body (tree *body_p, tree fndecl) { - struct cgraph_node *cgn = cgraph_node (fndecl); + struct cgraph_node *cgn = cgraph_get_node (fndecl); unmark_visited (body_p); - if (body_p == &DECL_SAVED_TREE (fndecl)) + if (cgn && body_p == &DECL_SAVED_TREE (fndecl)) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl); } @@ -7695,6 +7695,7 @@ gimplify_body (tree *body_p, tree fndecl, bool do_parms) gimple_seq parm_stmts, seq; gimple outer_bind; struct gimplify_ctx gctx; + struct cgraph_node *cgn; timevar_push (TV_TREE_GIMPLIFY); @@ -7712,7 +7713,8 @@ gimplify_body (tree *body_p, tree fndecl, bool do_parms) unshare_body (body_p, fndecl); unvisit_body (body_p, fndecl); - if (cgraph_node (fndecl)->origin) + cgn = cgraph_get_node (fndecl); + if (cgn && cgn->origin) nonlocal_vlas = pointer_set_create (); /* Make sure input_location isn't set to something weird. */ diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 61b24187337..3f81762c901 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +2011-04-11 Martin Jambor + + * decl.c (java_mark_decl_local): Call cgraph_get_node instead of + cgraph_node and handle returned NULL. + 2011-03-25 Kai Tietz * jcf-parse.c (java_read_sourcefilenames): Use filename_cmp diff --git a/gcc/java/decl.c b/gcc/java/decl.c index a17b826696b..75f44c97585 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -1928,7 +1928,10 @@ java_mark_decl_local (tree decl) #ifdef ENABLE_CHECKING /* Double check that we didn't pass the function to the callgraph early. */ if (TREE_CODE (decl) == FUNCTION_DECL) - gcc_assert (!cgraph_node (decl)->local.finalized); + { + struct cgraph_node *node = cgraph_get_node (decl); + gcc_assert (!node || !node->local.finalized); + } #endif gcc_assert (!DECL_RTL_SET_P (decl)); } diff --git a/gcc/predict.c b/gcc/predict.c index b9a4063073b..f210428fca1 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -214,10 +214,17 @@ probably_never_executed_bb_p (const_basic_block bb) bool optimize_function_for_size_p (struct function *fun) { - return (optimize_size - || (fun && fun->decl - && (cgraph_node (fun->decl)->frequency - == NODE_FREQUENCY_UNLIKELY_EXECUTED))); + struct cgraph_node *node; + + if (optimize_size) + return true; + if (!fun || !fun->decl) + return false; + node = cgraph_get_node (fun->decl); + if (node && (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)) + return true; + else + return false; } /* Return true when current function should always be optimized for speed. */ diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 25d3e26badf..140d7781c84 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3470,10 +3470,11 @@ estimate_num_insns (gimple stmt, eni_weights *weights) case GIMPLE_CALL: { tree decl = gimple_call_fndecl (stmt); + struct cgraph_node *node; /* Do not special case builtins where we see the body. This just confuse inliner. */ - if (!decl || cgraph_node (decl)->analyzed) + if (!decl || !(node = cgraph_get_node (decl)) || node->analyzed) ; /* For buitins that are likely expanded to nothing or inlined do not account operand costs. */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index f7fc7d20881..4edacb56ba6 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1245,14 +1245,18 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref) /* Check if base is a global static variable that is not read by the function. */ - if (TREE_CODE (base) == VAR_DECL + if (callee != NULL_TREE + && TREE_CODE (base) == VAR_DECL && TREE_STATIC (base)) { + struct cgraph_node *node = cgraph_get_node (callee); bitmap not_read; - if (callee != NULL_TREE - && (not_read - = ipa_reference_get_not_read_global (cgraph_node (callee))) + /* FIXME: Callee can be an OMP builtin that does not have a call graph + node yet. We should enforce that there are nodes for all decls in the + IL and remove this check instead. */ + if (node + && (not_read = ipa_reference_get_not_read_global (node)) && bitmap_bit_p (not_read, DECL_UID (base))) goto process_args; } @@ -1512,10 +1516,11 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref) && TREE_CODE (base) == VAR_DECL && TREE_STATIC (base)) { + struct cgraph_node *node = cgraph_get_node (callee); bitmap not_written; - if ((not_written - = ipa_reference_get_not_written_global (cgraph_node (callee))) + if (node + && (not_written = ipa_reference_get_not_written_global (node)) && bitmap_bit_p (not_written, DECL_UID (base))) return false; } diff --git a/gcc/varasm.c b/gcc/varasm.c index 332f0f46033..8365612e5f3 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -573,11 +573,14 @@ function_section_1 (tree decl, bool force_cold) if (decl) { - struct cgraph_node *node = cgraph_node (decl); + struct cgraph_node *node = cgraph_get_node (decl); - freq = node->frequency; - startup = node->only_called_at_startup; - exit = node->only_called_at_exit; + if (node) + { + freq = node->frequency; + startup = node->only_called_at_startup; + exit = node->only_called_at_exit; + } } if (force_cold) freq = NODE_FREQUENCY_UNLIKELY_EXECUTED; @@ -1575,11 +1578,12 @@ assemble_start_function (tree decl, const char *fnname) } else if (DECL_SECTION_NAME (decl)) { + struct cgraph_node *node = cgraph_get_node (current_function_decl); /* Calls to function_section rely on first_function_block_is_cold being accurate. */ - first_function_block_is_cold - = (cgraph_node (current_function_decl)->frequency - == NODE_FREQUENCY_UNLIKELY_EXECUTED); + first_function_block_is_cold = (node + && node->frequency + == NODE_FREQUENCY_UNLIKELY_EXECUTED); } in_cold_section_p = first_function_block_is_cold; -- 2.30.2