===================================================================
@@ -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;
}
===================================================================
@@ -3470,10 +3470,11 @@ estimate_num_insns (gimple stmt, eni_wei
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. */
===================================================================
@@ -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
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
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. */
===================================================================
@@ -214,10 +214,11 @@ probably_never_executed_bb_p (const_basi
bool
optimize_function_for_size_p (struct function *fun)
{
+ struct cgraph_node *node;
return (optimize_size
|| (fun && fun->decl
- && (cgraph_node (fun->decl)->frequency
- == NODE_FREQUENCY_UNLIKELY_EXECUTED)));
+ && (node = cgraph_get_node (fun->decl))
+ && (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)));
}
/* Return true when current function should always be optimized for speed. */
===================================================================
@@ -1245,14 +1245,18 @@ ref_maybe_used_by_call_p_1 (gimple call,
/* 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, a
&& 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;
}
===================================================================
@@ -605,11 +605,14 @@ function_section_1 (tree decl, bool forc
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;
@@ -1607,11 +1610,12 @@ assemble_start_function (tree decl, cons
}
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;
===================================================================
@@ -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));
}