#include "tree-pass.h"
#include "ipa-utils.h"
#include "except.h"
+#include "ipa-inline.h"
/* Context of record_reference. */
struct record_reference_ctx
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)
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);
- if (vnode->alias && vnode->extra_name)
- vnode = vnode->extra_name;
- 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;
*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;
}
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);
}
}
{
eh_region i;
- if (DECL_FUNCTION_PERSONALITY (node->decl))
- ipa_record_reference (node, NULL,
- cgraph_get_create_node (DECL_FUNCTION_PERSONALITY (node->decl)),
- NULL, IPA_REF_ADDR, NULL);
+ if (DECL_FUNCTION_PERSONALITY (node->symbol.decl))
+ {
+ struct cgraph_node *per_node;
+
+ 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);
+ }
i = fun->eh->region_tree;
if (!i)
}
}
-/* 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;
- if (!node->analyzed)
- e->inline_failed = CIF_BODY_NOT_AVAILABLE;
- else if (node->local.redefined_extern_inline)
- e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
- else if (!node->local.inlinable)
- e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
- else if (e->call_stmt_cannot_inline_p)
- e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
- else
- e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
- }
-}
-
/* 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
{
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);
- if (vnode->alias && vnode->extra_name)
- vnode = vnode->extra_name;
- 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);
}
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);
- if (vnode->alias && vnode->extra_name)
- vnode = vnode->extra_name;
- 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;
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);
- if (vnode->alias && vnode->extra_name)
- vnode = vnode->extra_name;
- 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;
decl = gimple_call_fndecl (stmt);
if (decl)
cgraph_create_edge (node, cgraph_get_create_node (decl),
- stmt, bb->count, freq, bb->loop_depth);
+ stmt, bb->count, freq);
else
cgraph_create_indirect_edge (node, stmt,
gimple_call_flags (stmt),
- bb->count, freq,
- bb->loop_depth);
+ bb->count, freq);
}
walk_stmt_load_store_addr_ops (stmt, node, mark_load,
mark_store, mark_address);
&& 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);
}
/* 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);
{
GIMPLE_PASS,
"*build_cgraph_edges", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
NULL, /* gate */
build_cgraph_edges, /* execute */
NULL, /* sub */
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;
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;
decl = gimple_call_fndecl (stmt);
if (decl)
cgraph_create_edge (node, cgraph_get_create_node (decl), stmt,
- bb->count, freq, bb->loop_depth);
+ bb->count, freq);
else
cgraph_create_indirect_edge (node, stmt,
gimple_call_flags (stmt),
- bb->count, freq,
- bb->loop_depth);
+ bb->count, freq);
}
walk_stmt_load_store_addr_ops (stmt, node, mark_load,
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);
}
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;
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);
}
{
GIMPLE_PASS,
"*rebuild_cgraph_edges", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
NULL, /* gate */
rebuild_cgraph_edges, /* execute */
NULL, /* sub */
{
GIMPLE_PASS,
"*remove_cgraph_callee_edges", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
NULL, /* gate */
remove_cgraph_callee_edges, /* execute */
NULL, /* sub */