aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-12-10 22:17:28 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-12-10 21:17:28 +0000
commit1e29e4d36f701712b541e989ff091d7a6ce1afcd (patch)
tree1431b495e7d6781af6da4f0b74dbc84b5cde4b77 /gcc/lto-cgraph.c
parenta06478dd6c5f0e3fb334ab88adc4de7c6fd5789e (diff)
downloadgcc-1e29e4d36f701712b541e989ff091d7a6ce1afcd.zip
gcc-1e29e4d36f701712b541e989ff091d7a6ce1afcd.tar.gz
gcc-1e29e4d36f701712b541e989ff091d7a6ce1afcd.tar.bz2
invoke.texi: (-devirtualize-at-ltrans): Document.
* doc/invoke.texi: (-devirtualize-at-ltrans): Document. * lto-cgraph.c (lto_output_varpool_node): Mark initializer as removed when it is not streamed to the given ltrans. (compute_ltrans_boundary): Make code adding all polymorphic call targets conditional with !flag_wpa || flag_ltrans_devirtualize. * common.opt (fdevirtualize-at-ltrans): New flag. From-SVN: r218609
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r--gcc/lto-cgraph.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index b310b44..cf92892 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -615,7 +615,8 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node,
bp_pack_value (&bp, node->force_output, 1);
bp_pack_value (&bp, node->forced_by_abi, 1);
bp_pack_value (&bp, node->unique_name, 1);
- bp_pack_value (&bp, node->body_removed, 1);
+ bp_pack_value (&bp, node->body_removed
+ || !lto_symtab_encoder_encode_initializer_p (encoder, node), 1);
bp_pack_value (&bp, node->implicit_section, 1);
bp_pack_value (&bp, node->writeonly, 1);
bp_pack_value (&bp, node->definition, 1);
@@ -910,8 +911,11 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{
if (!lto_symtab_encoder_encode_initializer_p (encoder,
vnode)
- && (vnode->ctor_useable_for_folding_p ()
- || POINTER_BOUNDS_P (vnode->decl)))
+ && (((vnode->ctor_useable_for_folding_p ()
+ && (!DECL_VIRTUAL_P (vnode->decl)
+ || !flag_wpa
+ || flag_ltrans_devirtualize))
+ || POINTER_BOUNDS_P (vnode->decl))))
{
lto_set_symtab_encoder_encode_initializer (encoder, vnode);
create_references (encoder, vnode);
@@ -936,7 +940,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
}
}
/* Add all possible targets for late devirtualization. */
- if (flag_devirtualize)
+ if (flag_ltrans_devirtualize || !flag_wpa)
for (edge = node->indirect_calls; edge; edge = edge->next_callee)
if (edge->indirect_info->polymorphic)
{