aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-07-20 14:15:02 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2009-07-20 14:15:02 +0200
commit08ad1d6d82e6531a00d773bc3f24548b98c1f89a (patch)
tree7ffb62e406ff8a8c4d6703fbbf79fddf2716b7aa /gcc/cgraph.c
parentc4023c1903e09ab3f83785b8d38ba9ffd7e295e9 (diff)
downloadgcc-08ad1d6d82e6531a00d773bc3f24548b98c1f89a.zip
gcc-08ad1d6d82e6531a00d773bc3f24548b98c1f89a.tar.gz
gcc-08ad1d6d82e6531a00d773bc3f24548b98c1f89a.tar.bz2
cgraph.h (combined_args_to_skip): New field.
2009-07-20 Jan Hubicka <jh@suse.cz> Martin Jambor <mjambor@suse.cz> * cgraph.h (combined_args_to_skip): New field. * cgraph.c (cgraph_create_virtual_clone): Properly handle combined_args_to_skip and args_to_skip. * tree-inline.c (update_clone_info): New function. (tree_function_versioning): Call update_clone_info. * cgraphunit.c: (cgraph_materialize_clone): Dump materialized functions. (cgraph_materialize_all_clones): More extensive dumping, working with combined_args_to_skip rather than args_to_skip. Co-Authored-By: Martin Jambor <mjambor@suse.cz> From-SVN: r149808
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 3d0fee5..ea47aa3 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1716,6 +1716,31 @@ 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;
+ 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)
+ {
+ int newi = 0, oldi = 0;
+ tree arg;
+ bitmap new_args_to_skip = BITMAP_GGC_ALLOC ();
+ struct cgraph_node *orig_node;
+ for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of)
+ ;
+ for (arg = DECL_ARGUMENTS (orig_node->decl); arg; arg = TREE_CHAIN (arg), oldi++)
+ {
+ if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi))
+ {
+ bitmap_set_bit (new_args_to_skip, oldi);
+ continue;
+ }
+ if (bitmap_bit_p (args_to_skip, newi))
+ bitmap_set_bit (new_args_to_skip, oldi);
+ newi++;
+ }
+ new_node->clone.combined_args_to_skip = new_args_to_skip;
+ }
+ else
+ new_node->clone.combined_args_to_skip = args_to_skip;
new_node->local.externally_visible = 0;
new_node->local.local = 1;
new_node->lowered = true;