Patchwork Minor gimple_get_virt_method_for_binfo tweek

login
register
mail settings
Submitter Jan Hubicka
Date Aug. 26, 2013, 3:45 p.m.
Message ID <20130826154529.GB6539@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/269915/
State New
Headers show

Comments

Jan Hubicka - Aug. 26, 2013, 3:45 p.m.
Hi,
any time we look for constructor of a given readonly static var, we should use
ctor_for_folding that knows about interposition rules and knows how to walk
aliases.
gimple_get_virt_method_for_binfo is hopefully last place I forgot to update.

Bootstrapped/regtested ppc64-linux, committed.
	* gimple-fold.c (gimple_get_virt_method_for_binfo): Use ctor_for_folding.

Patch

Index: gimple-fold.c
===================================================================
--- gimple-fold.c	(revision 202000)
+++ gimple-fold.c	(working copy)
@@ -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_W
   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;