aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-05-11 10:12:07 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-05-11 08:12:07 +0000
commita940b4d9ab2566bce05dd5abb9b90467684a43e8 (patch)
treef130064a1afb004534493bef2e1ee78ef7e2723b /gcc/cgraph.c
parent57762e976d599914956203d04f706744bec54ef1 (diff)
downloadgcc-a940b4d9ab2566bce05dd5abb9b90467684a43e8.zip
gcc-a940b4d9ab2566bce05dd5abb9b90467684a43e8.tar.gz
gcc-a940b4d9ab2566bce05dd5abb9b90467684a43e8.tar.bz2
cgraph.c: Include ipa-utils.h
* cgraph.c: Include ipa-utils.h (cgraph_create_virtual_clone): Update references. * Makefile.in (cgraph.o): Add dependency at ipa-utils.h From-SVN: r159258
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 64a9c65..5f609aa 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)