diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-11 08:12:07 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-11 08:12:07 +0000 |
commit | 2b2fe71055f970318515ba8e01819f1d32608b9b (patch) | |
tree | f130064a1afb004534493bef2e1ee78ef7e2723b /gcc/cgraph.c | |
parent | 8234f09041f74605ace7f36a41ddca962d33a18e (diff) | |
download | gcc-2b2fe71055f970318515ba8e01819f1d32608b9b.tar.gz |
* cgraph.c: Include ipa-utils.h
(cgraph_create_virtual_clone): Update references.
* Makefile.in (cgraph.o): Add dependency at ipa-utils.h
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159258 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 64a9c6559cc..5f609aaf434 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -96,6 +96,7 @@ The callgraph: #include "except.h" #include "diagnostic.h" #include "rtl.h" +#include "ipa-utils.h" static void cgraph_node_remove_callers (struct cgraph_node *node); static inline void cgraph_edge_remove_caller (struct cgraph_edge *e); @@ -2139,6 +2140,8 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node, struct cgraph_node *new_node = NULL; tree new_decl; struct cgraph_node key, **slot; + size_t i; + struct ipa_replace_map *map; gcc_assert (tree_versionable_function_p (old_decl)); @@ -2170,6 +2173,26 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node, DECL_WEAK (new_node->decl) = 0; new_node->clone.tree_map = tree_map; new_node->clone.args_to_skip = args_to_skip; + for (i = 0; VEC_iterate (ipa_replace_map_p, tree_map, i, map); i++) + { + tree var = map->new_tree; + + STRIP_NOPS (var); + if (TREE_CODE (var) != ADDR_EXPR) + continue; + var = get_base_var (var); + if (!var) + continue; + + /* Record references of the future statement initializing the constant + argument. */ + if (TREE_CODE (var) == FUNCTION_DECL) + ipa_record_reference (new_node, NULL, cgraph_node (var), + NULL, IPA_REF_ADDR, NULL); + else if (TREE_CODE (var) == VAR_DECL) + ipa_record_reference (new_node, NULL, NULL, varpool_node (var), + IPA_REF_ADDR, NULL); + } if (!args_to_skip) new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip; else if (old_node->clone.combined_args_to_skip) |