re PR c++/52582 (g++ ICE when compiling qt-4.8.0 with -O2 on PPC (32bit))
authorRichard Guenther <rguenther@suse.de>
Wed, 14 Mar 2012 13:01:46 +0000 (13:01 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 14 Mar 2012 13:01:46 +0000 (13:01 +0000)
2012-03-14  Richard Guenther  <rguenther@suse.de>

PR middle-end/52582
* gimple-fold.c (canonicalize_constructor_val): Make sure
we have a cgraph node for a FUNCTION_DECL that comes from
a constructor.
(gimple_get_virt_method_for_binfo): Likewise.

From-SVN: r185381

gcc/ChangeLog
gcc/gimple-fold.c

index 3eaf56481858361f456a46a4917aa54c9d45d64d..eca4d0b50f9bfb7d841862f0b88d392053acdf8a 100644 (file)
@@ -1,3 +1,11 @@
+2012-03-14  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/52582
+       * gimple-fold.c (canonicalize_constructor_val): Make sure
+       we have a cgraph node for a FUNCTION_DECL that comes from
+       a constructor.
+       (gimple_get_virt_method_for_binfo): Likewise.
+
 2012-03-14  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/52571
index 5ba7178b0da8c622d178aa34e0c59b80f3b9f6ff..d4028398079e5a9a805a83aefbe96b3621604862 100644 (file)
@@ -131,18 +131,26 @@ canonicalize_constructor_val (tree cval)
   if (TREE_CODE (cval) == ADDR_EXPR)
     {
       tree base = get_base_address (TREE_OPERAND (cval, 0));
+      if (!base)
+       return NULL_TREE;
 
-      if (base
-         && (TREE_CODE (base) == VAR_DECL
-             || TREE_CODE (base) == FUNCTION_DECL)
+      if ((TREE_CODE (base) == VAR_DECL
+          || TREE_CODE (base) == FUNCTION_DECL)
          && !can_refer_decl_in_current_unit_p (base))
        return NULL_TREE;
-      if (base && TREE_CODE (base) == VAR_DECL)
+      if (TREE_CODE (base) == VAR_DECL)
        {
          TREE_ADDRESSABLE (base) = 1;
          if (cfun && gimple_referenced_vars (cfun))
            add_referenced_var (base);
        }
+      else if (TREE_CODE (base) == FUNCTION_DECL)
+       {
+         /* Make sure we create a cgraph node for functions we'll reference.
+            They can be non-existent if the reference comes from an entry
+            of an external vtable for example.  */
+         cgraph_get_create_node (base);
+       }
       /* Fixup types in global initializers.  */
       if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
        cval = build_fold_addr_expr (TREE_OPERAND (cval, 0));
@@ -3115,6 +3123,11 @@ gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo)
   if (!can_refer_decl_in_current_unit_p (fn))
     return NULL_TREE;
 
+  /* Make sure we create a cgraph node for functions we'll reference.
+     They can be non-existent if the reference comes from an entry
+     of an external vtable for example.  */
+  cgraph_get_create_node (fn);
+
   return fn;
 }