Mercurial > hg > CbC > CbC_gcc
diff gcc/cgraphbuild.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
line wrap: on
line diff
--- a/gcc/cgraphbuild.c Sun Aug 21 07:07:55 2011 +0900 +++ b/gcc/cgraphbuild.c Fri Oct 27 22:46:09 2017 +0900 @@ -1,6 +1,5 @@ /* Callgraph construction. - Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2003-2017 Free Software Foundation, Inc. Contributed by Jan Hubicka This file is part of GCC. @@ -22,15 +21,14 @@ #include "config.h" #include "system.h" #include "coretypes.h" -#include "tm.h" +#include "backend.h" #include "tree.h" -#include "tree-flow.h" -#include "langhooks.h" -#include "pointer-set.h" -#include "cgraph.h" -#include "intl.h" #include "gimple.h" #include "tree-pass.h" +#include "cgraph.h" +#include "gimple-fold.h" +#include "gimple-iterator.h" +#include "gimple-walk.h" #include "ipa-utils.h" #include "except.h" @@ -38,7 +36,7 @@ struct record_reference_ctx { bool only_vars; - struct varpool_node *varpool_node; + class varpool_node *varpool_node; }; /* Walk tree and record all calls and references to functions/variables. @@ -51,7 +49,13 @@ { tree t = *tp; tree decl; - struct record_reference_ctx *ctx = (struct record_reference_ctx *)data; + record_reference_ctx *ctx = (record_reference_ctx *)data; + + t = canonicalize_constructor_val (t, NULL); + if (!t) + t = *tp; + else if (t != *tp) + *tp = t; switch (TREE_CODE (t)) { @@ -67,24 +71,16 @@ decl = get_base_var (*tp); if (TREE_CODE (decl) == FUNCTION_DECL) { + cgraph_node *node = cgraph_node::get_create (decl); if (!ctx->only_vars) - cgraph_mark_address_taken_node (cgraph_node (decl)); - ipa_record_reference (NULL, ctx->varpool_node, - cgraph_node (decl), NULL, - IPA_REF_ADDR, NULL); + node->mark_address_taken (); + ctx->varpool_node->create_reference (node, IPA_REF_ADDR); } - if (TREE_CODE (decl) == VAR_DECL) + if (VAR_P (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, - IPA_REF_ADDR, NULL); + varpool_node *vnode = varpool_node::get_create (decl); + ctx->varpool_node->create_reference (vnode, IPA_REF_ADDR); } *walk_subtrees = 0; break; @@ -97,9 +93,6 @@ *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; } @@ -109,7 +102,7 @@ /* Record references to typeinfos in the type list LIST. */ static void -record_type_list (struct cgraph_node *node, tree list) +record_type_list (cgraph_node *node, tree list) { for (; list; list = TREE_CHAIN (list)) { @@ -121,13 +114,10 @@ if (TREE_CODE (type) == ADDR_EXPR) { type = TREE_OPERAND (type, 0); - if (TREE_CODE (type) == VAR_DECL) + if (VAR_P (type)) { - struct varpool_node *vnode = varpool_node (type); - varpool_mark_needed_node (vnode); - ipa_record_reference (node, NULL, - NULL, vnode, - IPA_REF_ADDR, NULL); + varpool_node *vnode = varpool_node::get_create (type); + node->create_reference (vnode, IPA_REF_ADDR); } } } @@ -137,14 +127,18 @@ for NODE. */ static void -record_eh_tables (struct cgraph_node *node, struct function *fun) +record_eh_tables (cgraph_node *node, function *fun) { eh_region i; if (DECL_FUNCTION_PERSONALITY (node->decl)) - ipa_record_reference (node, NULL, - cgraph_node (DECL_FUNCTION_PERSONALITY (node->decl)), - NULL, IPA_REF_ADDR, NULL); + { + tree per_decl = DECL_FUNCTION_PERSONALITY (node->decl); + cgraph_node *per_node = cgraph_node::get_create (per_decl); + + node->create_reference (per_node, IPA_REF_ADDR); + per_node->mark_address_taken (); + } i = fun->eh->region_tree; if (!i) @@ -191,39 +185,16 @@ } } -/* 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 compute_call_stmt_bb_frequency (tree decl, basic_block bb) { - int entry_freq = ENTRY_BLOCK_PTR_FOR_FUNCTION + int entry_freq = ENTRY_BLOCK_PTR_FOR_FN (DECL_STRUCT_FUNCTION (decl))->frequency; int freq = bb->frequency; - if (profile_status_for_function (DECL_STRUCT_FUNCTION (decl)) == PROFILE_ABSENT) + if (profile_status_for_fn (DECL_STRUCT_FUNCTION (decl)) == PROFILE_ABSENT) return CGRAPH_FREQ_BASE; if (!entry_freq) @@ -239,31 +210,21 @@ /* Mark address taken in STMT. */ static bool -mark_address (gimple stmt, tree addr, void *data) +mark_address (gimple *stmt, tree addr, tree, void *data) { addr = get_base_address (addr); if (TREE_CODE (addr) == FUNCTION_DECL) { - struct cgraph_node *node = cgraph_node (addr); - cgraph_mark_address_taken_node (node); - ipa_record_reference ((struct cgraph_node *)data, NULL, - node, NULL, - IPA_REF_ADDR, stmt); + cgraph_node *node = cgraph_node::get_create (addr); + node->mark_address_taken (); + ((symtab_node *)data)->create_reference (node, IPA_REF_ADDR, stmt); } - else if (addr && TREE_CODE (addr) == VAR_DECL + else if (addr && VAR_P (addr) && (TREE_STATIC (addr) || DECL_EXTERNAL (addr))) { - struct varpool_node *vnode = varpool_node (addr); - int walk_subtrees; + varpool_node *vnode = varpool_node::get_create (addr); - 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, - IPA_REF_ADDR, stmt); + ((symtab_node *)data)->create_reference (vnode, IPA_REF_ADDR, stmt); } return false; @@ -272,33 +233,22 @@ /* Mark load of T. */ static bool -mark_load (gimple stmt, tree t, void *data) +mark_load (gimple *stmt, tree t, tree, void *data) { t = get_base_address (t); if (t && TREE_CODE (t) == FUNCTION_DECL) { /* ??? This can happen on platforms with descriptors when these are directly manipulated in the code. Pretend that it's an address. */ - struct cgraph_node *node = cgraph_node (t); - cgraph_mark_address_taken_node (node); - ipa_record_reference ((struct cgraph_node *)data, NULL, - node, NULL, - IPA_REF_ADDR, stmt); + cgraph_node *node = cgraph_node::get_create (t); + node->mark_address_taken (); + ((symtab_node *)data)->create_reference (node, IPA_REF_ADDR, stmt); } - else if (t && TREE_CODE (t) == VAR_DECL - && (TREE_STATIC (t) || DECL_EXTERNAL (t))) + else if (t && VAR_P (t) && (TREE_STATIC (t) || DECL_EXTERNAL (t))) { - struct varpool_node *vnode = varpool_node (t); - int walk_subtrees; + varpool_node *vnode = varpool_node::get_create (t); - 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, - IPA_REF_LOAD, stmt); + ((symtab_node *)data)->create_reference (vnode, IPA_REF_LOAD, stmt); } return false; } @@ -306,119 +256,134 @@ /* Mark store of T. */ static bool -mark_store (gimple stmt, tree t, void *data) +mark_store (gimple *stmt, tree t, tree, void *data) { t = get_base_address (t); - if (t && TREE_CODE (t) == VAR_DECL - && (TREE_STATIC (t) || DECL_EXTERNAL (t))) + if (t && VAR_P (t) && (TREE_STATIC (t) || DECL_EXTERNAL (t))) { - struct varpool_node *vnode = varpool_node (t); - int walk_subtrees; + varpool_node *vnode = varpool_node::get_create (t); - 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, - IPA_REF_STORE, stmt); + ((symtab_node *)data)->create_reference (vnode, IPA_REF_STORE, stmt); } return false; } +/* Record all references from cgraph_node that are taken in statement STMT. */ + +void +cgraph_node::record_stmt_references (gimple *stmt) +{ + walk_stmt_load_store_addr_ops (stmt, this, mark_load, mark_store, + mark_address); +} + /* Create cgraph edges for function calls. Also look for functions and variables having addresses taken. */ -static unsigned int -build_cgraph_edges (void) +namespace { + +const pass_data pass_data_build_cgraph_edges = +{ + GIMPLE_PASS, /* type */ + "*build_cgraph_edges", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_build_cgraph_edges : public gimple_opt_pass +{ +public: + pass_build_cgraph_edges (gcc::context *ctxt) + : gimple_opt_pass (pass_data_build_cgraph_edges, ctxt) + {} + + /* opt_pass methods: */ + virtual unsigned int execute (function *); + +}; // class pass_build_cgraph_edges + +unsigned int +pass_build_cgraph_edges::execute (function *fun) { basic_block bb; - struct cgraph_node *node = cgraph_node (current_function_decl); - struct pointer_set_t *visited_nodes = pointer_set_create (); + cgraph_node *node = cgraph_node::get (current_function_decl); gimple_stmt_iterator gsi; tree decl; unsigned ix; /* Create the callgraph edges and record the nodes referenced by the function. body. */ - FOR_EACH_BB (bb) + FOR_EACH_BB_FN (bb, fun) { for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple stmt = gsi_stmt (gsi); + gimple *stmt = gsi_stmt (gsi); tree decl; - if (is_gimple_call (stmt)) + if (is_gimple_debug (stmt)) + continue; + + if (gcall *call_stmt = dyn_cast <gcall *> (stmt)) { int freq = compute_call_stmt_bb_frequency (current_function_decl, bb); - decl = gimple_call_fndecl (stmt); + decl = gimple_call_fndecl (call_stmt); if (decl) - cgraph_create_edge (node, cgraph_node (decl), stmt, - bb->count, freq, - bb->loop_depth); + node->create_edge (cgraph_node::get_create (decl), call_stmt, bb->count, freq); + else if (gimple_call_internal_p (call_stmt)) + ; else - cgraph_create_indirect_edge (node, stmt, - gimple_call_flags (stmt), - bb->count, freq, - bb->loop_depth); + node->create_indirect_edge (call_stmt, + gimple_call_flags (call_stmt), + bb->count, freq); } - walk_stmt_load_store_addr_ops (stmt, node, mark_load, - mark_store, mark_address); - if (gimple_code (stmt) == GIMPLE_OMP_PARALLEL - && gimple_omp_parallel_child_fn (stmt)) + node->record_stmt_references (stmt); + if (gomp_parallel *omp_par_stmt = dyn_cast <gomp_parallel *> (stmt)) { - tree fn = gimple_omp_parallel_child_fn (stmt); - ipa_record_reference (node, NULL, cgraph_node (fn), - NULL, IPA_REF_ADDR, stmt); + tree fn = gimple_omp_parallel_child_fn (omp_par_stmt); + node->create_reference (cgraph_node::get_create (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_node (fn), - NULL, IPA_REF_ADDR, stmt); + node->create_reference (cgraph_node::get_create (fn), + IPA_REF_ADDR, stmt); fn = gimple_omp_task_copy_fn (stmt); if (fn) - ipa_record_reference (node, NULL, cgraph_node (fn), - NULL, IPA_REF_ADDR, stmt); + node->create_reference (cgraph_node::get_create (fn), + IPA_REF_ADDR, stmt); } } - for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi)) - walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node, - mark_load, mark_store, mark_address); + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + node->record_stmt_references (gsi_stmt (gsi)); } /* 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))) - varpool_finalize_decl (decl); - record_eh_tables (node, cfun); + FOR_EACH_LOCAL_DECL (fun, ix, decl) + if (VAR_P (decl) + && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl)) + && !DECL_HAS_VALUE_EXPR_P (decl) + && TREE_TYPE (decl) != error_mark_node) + varpool_node::finalize_decl (decl); + record_eh_tables (node, fun); - pointer_set_destroy (visited_nodes); return 0; } -struct gimple_opt_pass pass_build_cgraph_edges = +} // anon namespace + +gimple_opt_pass * +make_pass_build_cgraph_edges (gcc::context *ctxt) { - { - GIMPLE_PASS, - "*build_cgraph_edges", /* name */ - NULL, /* gate */ - build_cgraph_edges, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_NONE, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } -}; + return new pass_build_cgraph_edges (ctxt); +} /* Record references to functions and other variables present in the initial value of DECL, a variable. @@ -427,141 +392,184 @@ 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 record_reference_ctx ctx = {false, NULL}; + varpool_node *node = varpool_node::get_create (decl); + hash_set<tree> visited_nodes; + record_reference_ctx ctx = {false, NULL}; ctx.varpool_node = node; ctx.only_vars = only_vars; walk_tree (&DECL_INITIAL (decl), record_reference, - &ctx, visited_nodes); - pointer_set_destroy (visited_nodes); + &ctx, &visited_nodes); } /* Rebuild cgraph edges for current function node. This needs to be run after passes that don't update the cgraph. */ unsigned int -rebuild_cgraph_edges (void) +cgraph_edge::rebuild_edges (void) { basic_block bb; - struct cgraph_node *node = cgraph_node (current_function_decl); + cgraph_node *node = cgraph_node::get (current_function_decl); gimple_stmt_iterator gsi; - cgraph_node_remove_callees (node); - ipa_remove_all_references (&node->ref_list); + node->remove_callees (); + node->remove_all_references (); - node->count = ENTRY_BLOCK_PTR->count; + node->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; - FOR_EACH_BB (bb) + FOR_EACH_BB_FN (bb, cfun) { for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple stmt = gsi_stmt (gsi); + gimple *stmt = gsi_stmt (gsi); tree decl; - if (is_gimple_call (stmt)) + if (gcall *call_stmt = dyn_cast <gcall *> (stmt)) { int freq = compute_call_stmt_bb_frequency (current_function_decl, bb); - decl = gimple_call_fndecl (stmt); + decl = gimple_call_fndecl (call_stmt); if (decl) - cgraph_create_edge (node, cgraph_node (decl), stmt, - bb->count, freq, - bb->loop_depth); + node->create_edge (cgraph_node::get_create (decl), call_stmt, + bb->count, freq); + else if (gimple_call_internal_p (call_stmt)) + ; else - cgraph_create_indirect_edge (node, stmt, - gimple_call_flags (stmt), - bb->count, freq, - bb->loop_depth); + node->create_indirect_edge (call_stmt, + gimple_call_flags (call_stmt), + bb->count, freq); } - walk_stmt_load_store_addr_ops (stmt, node, mark_load, - mark_store, mark_address); - + node->record_stmt_references (stmt); } - for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi)) - walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node, - mark_load, mark_store, mark_address); + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + node->record_stmt_references (gsi_stmt (gsi)); } record_eh_tables (node, cfun); gcc_assert (!node->global.inlined_to); + if (node->instrumented_version + && !node->instrumentation_clone) + node->create_reference (node->instrumented_version, IPA_REF_CHKP, NULL); + return 0; } -/* Rebuild cgraph edges for current function node. This needs to be run after - passes that don't update the cgraph. */ +/* Rebuild cgraph references for current function node. This needs to be run + after passes that don't update the cgraph. */ void -cgraph_rebuild_references (void) +cgraph_edge::rebuild_references (void) { basic_block bb; - struct cgraph_node *node = cgraph_node (current_function_decl); + cgraph_node *node = cgraph_node::get (current_function_decl); gimple_stmt_iterator gsi; + ipa_ref *ref = NULL; + int i; - ipa_remove_all_references (&node->ref_list); + /* Keep speculative references for further cgraph edge expansion. */ + for (i = 0; node->iterate_reference (i, ref);) + if (!ref->speculative) + ref->remove_reference (); + else + i++; - node->count = ENTRY_BLOCK_PTR->count; - - FOR_EACH_BB (bb) + FOR_EACH_BB_FN (bb, cfun) { for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple stmt = gsi_stmt (gsi); - - 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)) - walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node, - mark_load, mark_store, mark_address); + node->record_stmt_references (gsi_stmt (gsi)); + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + node->record_stmt_references (gsi_stmt (gsi)); } record_eh_tables (node, cfun); + + if (node->instrumented_version + && !node->instrumentation_clone) + node->create_reference (node->instrumented_version, IPA_REF_CHKP, NULL); } -struct gimple_opt_pass pass_rebuild_cgraph_edges = +namespace { + +const pass_data pass_data_rebuild_cgraph_edges = { - { - GIMPLE_PASS, - "*rebuild_cgraph_edges", /* name */ - NULL, /* gate */ - rebuild_cgraph_edges, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_CGRAPH, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ - } + GIMPLE_PASS, /* type */ + "*rebuild_cgraph_edges", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_CGRAPH, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_rebuild_cgraph_edges : public gimple_opt_pass +{ +public: + pass_rebuild_cgraph_edges (gcc::context *ctxt) + : gimple_opt_pass (pass_data_rebuild_cgraph_edges, ctxt) + {} -static unsigned int -remove_cgraph_callee_edges (void) + /* opt_pass methods: */ + opt_pass * clone () { return new pass_rebuild_cgraph_edges (m_ctxt); } + virtual unsigned int execute (function *) + { + return cgraph_edge::rebuild_edges (); + } + +}; // class pass_rebuild_cgraph_edges + +} // anon namespace + +gimple_opt_pass * +make_pass_rebuild_cgraph_edges (gcc::context *ctxt) +{ + return new pass_rebuild_cgraph_edges (ctxt); +} + + +namespace { + +const pass_data pass_data_remove_cgraph_callee_edges = { - cgraph_node_remove_callees (cgraph_node (current_function_decl)); + GIMPLE_PASS, /* type */ + "*remove_cgraph_callee_edges", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_remove_cgraph_callee_edges : public gimple_opt_pass +{ +public: + pass_remove_cgraph_callee_edges (gcc::context *ctxt) + : gimple_opt_pass (pass_data_remove_cgraph_callee_edges, ctxt) + {} + + /* opt_pass methods: */ + opt_pass * clone () { + return new pass_remove_cgraph_callee_edges (m_ctxt); + } + virtual unsigned int execute (function *); + +}; // class pass_remove_cgraph_callee_edges + +unsigned int +pass_remove_cgraph_callee_edges::execute (function *) +{ + cgraph_node *node = cgraph_node::get (current_function_decl); + node->remove_callees (); + node->remove_all_references (); return 0; } -struct gimple_opt_pass pass_remove_cgraph_callee_edges = +} // anon namespace + +gimple_opt_pass * +make_pass_remove_cgraph_callee_edges (gcc::context *ctxt) { - { - GIMPLE_PASS, - "*remove_cgraph_callee_edges", /* name */ - NULL, /* gate */ - remove_cgraph_callee_edges, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_NONE, /* tv_id */ - 0, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ - } -}; + return new pass_remove_cgraph_callee_edges (ctxt); +}