* gimple-fold.c (gimple_get_virt_method_for_binfo): Use ctor_for_folding.
authorJan Hubicka <jh@suse.cz>
Mon, 26 Aug 2013 15:40:40 +0000 (17:40 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 26 Aug 2013 15:40:40 +0000 (15:40 +0000)
From-SVN: r202002

gcc/ChangeLog
gcc/gimple-fold.c

index 19ddd93..29a8d55 100644 (file)
@@ -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.
 
index df6aef5..e6baabf 100644 (file)
@@ -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;