diff options
author | Jan Hubicka <jh@suse.cz> | 2013-08-26 17:40:40 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-08-26 15:40:40 +0000 |
commit | 2aa3da06e03332d488613e98b4f1f523117ecce5 (patch) | |
tree | ff56072d31d229f2d2389528ce1022a398eafae2 /gcc | |
parent | 0987ffe7c18bf1bf5830364e405009ed8f4a61bb (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 20 |
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; |