diff options
author | Jan Hubicka <jh@suse.cz> | 2009-07-20 14:15:02 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2009-07-20 14:15:02 +0200 |
commit | 08ad1d6d82e6531a00d773bc3f24548b98c1f89a (patch) | |
tree | 7ffb62e406ff8a8c4d6703fbbf79fddf2716b7aa /gcc/cgraph.c | |
parent | c4023c1903e09ab3f83785b8d38ba9ffd7e295e9 (diff) | |
download | gcc-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.c | 25 |
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; |