aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-08-26 17:40:40 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-08-26 15:40:40 +0000
commit2aa3da06e03332d488613e98b4f1f523117ecce5 (patch)
treeff56072d31d229f2d2389528ce1022a398eafae2 /gcc
parent0987ffe7c18bf1bf5830364e405009ed8f4a61bb (diff)
downloadgcc-2aa3da06e03332d488613e98b4f1f523117ecce5.zip
gcc-2aa3da06e03332d488613e98b4f1f523117ecce5.tar.gz
gcc-2aa3da06e03332d488613e98b4f1f523117ecce5.tar.bz2
* gimple-fold.c (gimple_get_virt_method_for_binfo): Use ctor_for_folding.
From-SVN: r202002
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/gimple-fold.c20
2 files changed, 19 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19ddd93..29a8d55 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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.
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index df6aef5..e6baabf 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -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;