Commit 2aa3da06 by Jan Hubicka Committed by Jan Hubicka

* gimple-fold.c (gimple_get_virt_method_for_binfo): Use ctor_for_folding.

From-SVN: r202002
parent 0987ffe7
2013-08-26 Jan Hubicka <jh@suse.cz>
* gimple-fold.c (gimple_get_virt_method_for_binfo): Use ctor_for_folding.
2013-08-26 Jan Hubicka <jh@suse.cz>
* ipa.c (comdat_can_be_unshared_p_1): C++ constructors and destructors
can be unshared.
......
......@@ -3097,7 +3097,7 @@ tree
gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo)
{
unsigned HOST_WIDE_INT offset, size;
tree v, fn, vtable;
tree v, fn, vtable, init;
vtable = v = BINFO_VTABLE (known_binfo);
/* If there is no virtual methods table, leave the OBJ_TYPE_REF alone. */
......@@ -3117,14 +3117,24 @@ gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo)
v = TREE_OPERAND (v, 0);
if (TREE_CODE (v) != VAR_DECL
|| !DECL_VIRTUAL_P (v)
|| !DECL_INITIAL (v)
|| DECL_INITIAL (v) == error_mark_node)
|| !DECL_VIRTUAL_P (v))
return NULL_TREE;
init = ctor_for_folding (v);
/* The virtual tables should always be born with constructors.
and we always should assume that they are avaialble for
folding. At the moment we do not stream them in all cases,
but it should never happen that ctor seem unreachable. */
gcc_assert (init);
if (init == error_mark_node)
{
gcc_assert (in_lto_p);
return NULL_TREE;
}
gcc_checking_assert (TREE_CODE (TREE_TYPE (v)) == ARRAY_TYPE);
size = tree_low_cst (TYPE_SIZE (TREE_TYPE (TREE_TYPE (v))), 1);
offset += token * size;
fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), DECL_INITIAL (v),
fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), init,
offset, size, vtable);
if (!fn || integer_zerop (fn))
return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment