]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/42344 (ICE in rs6000.md with ipa-sra for 252.eon)
authorAlan Modra <amodra@gmail.com>
Fri, 19 Feb 2010 23:38:20 +0000 (10:08 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Fri, 19 Feb 2010 23:38:20 +0000 (10:08 +1030)
PR middle-end/42344
* cgraph.h (cgraph_make_decl_local): Declare.
* cgraph.c (cgraph_make_decl_local): New function.
(cgraph_make_node_local): Use it.
* cgraphunit.c (cgraph_function_versioning): Likewise.
* ipa.c (function_and_variable_visibility): Likewise.

From-SVN: r156914

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/cgraphunit.c
gcc/ipa.c

index 168efd014b4fb7005cffb85fc3d467dace80e234..93969c12cd2ffa68a1d4c0f8ca16a8a0e705029b 100644 (file)
@@ -1,3 +1,12 @@
+2010-02-20  Alan Modra  <amodra@gmail.com>
+
+       PR middle-end/42344
+       * cgraph.h (cgraph_make_decl_local): Declare.
+       * cgraph.c (cgraph_make_decl_local): New function.
+       (cgraph_make_node_local): Use it.
+       * cgraphunit.c (cgraph_function_versioning): Likewise.
+       * ipa.c (function_and_variable_visibility): Likewise.
+
 2010-02-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR bootstrap/43121
index baaf601c9676bc0338dd74902ac22fad5ac41a53..0e02bae140263f602ac325a6968c5eb9a0d710c7 100644 (file)
@@ -86,6 +86,7 @@ The callgraph:
 #include "value-prof.h"
 #include "except.h"
 #include "diagnostic.h"
+#include "rtl.h"
 
 static void cgraph_node_remove_callers (struct cgraph_node *node);
 static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
@@ -2190,6 +2191,42 @@ cgraph_node_can_be_local_p (struct cgraph_node *node)
              || !node->local.externally_visible));
 }
 
+/* Make DECL local.  FIXME: We shouldn't need to mess with rtl this early,
+   but other code such as notice_global_symbol generates rtl.  */
+void
+cgraph_make_decl_local (tree decl)
+{
+  rtx rtl, symbol;
+
+  if (TREE_CODE (decl) == VAR_DECL)
+    DECL_COMMON (decl) = 0;
+  else if (TREE_CODE (decl) == FUNCTION_DECL)
+    {
+      DECL_COMDAT (decl) = 0;
+      DECL_COMDAT_GROUP (decl) = 0;
+      DECL_WEAK (decl) = 0;
+      DECL_EXTERNAL (decl) = 0;
+    }
+  else
+    gcc_unreachable ();
+  TREE_PUBLIC (decl) = 0;
+  if (!DECL_RTL_SET_P (decl))
+    return;
+
+  /* Update rtl flags.  */
+  make_decl_rtl (decl);
+
+  rtl = DECL_RTL (decl);
+  if (!MEM_P (rtl))
+    return;
+
+  symbol = XEXP (rtl, 0);
+  if (GET_CODE (symbol) != SYMBOL_REF)
+    return;
+
+  SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
+}
+
 /* Bring NODE local.  */
 void
 cgraph_make_node_local (struct cgraph_node *node)
@@ -2198,19 +2235,11 @@ cgraph_make_node_local (struct cgraph_node *node)
   if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
     {
       struct cgraph_node *alias;
-      DECL_COMDAT (node->decl) = 0;
-      DECL_COMDAT_GROUP (node->decl) = 0;
-      TREE_PUBLIC (node->decl) = 0;
-      DECL_WEAK (node->decl) = 0;
-      DECL_EXTERNAL (node->decl) = 0;
+      cgraph_make_decl_local (node->decl);
+
       for (alias = node->same_body; alias; alias = alias->next)
-       {
-         DECL_COMDAT (alias->decl) = 0;
-         DECL_COMDAT_GROUP (alias->decl) = 0;
-         TREE_PUBLIC (alias->decl) = 0;
-         DECL_WEAK (alias->decl) = 0;
-         DECL_EXTERNAL (alias->decl) = 0;
-       }
+       cgraph_make_decl_local (alias->decl);
+
       node->local.externally_visible = false;
       node->local.local = true;
       gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL);
index 867a68aaf303276a29a5a57ff236c6acf7efc696..802b28038d9eb2023194a658435ac68495b2ae02 100644 (file)
@@ -565,6 +565,7 @@ void dump_varpool_node (FILE *, struct varpool_node *);
 void varpool_finalize_decl (tree);
 bool decide_is_variable_needed (struct varpool_node *, tree);
 enum availability cgraph_variable_initializer_availability (struct varpool_node *);
+void cgraph_make_decl_local (tree);
 void cgraph_make_node_local (struct cgraph_node *);
 bool cgraph_node_can_be_local_p (struct cgraph_node *);
 
index 37eee71231f79514ab88a7ca09215c16cdc08923..399912bfbd562126448e3e38133eb10a28e5a6be 100644 (file)
@@ -2110,11 +2110,7 @@ cgraph_function_versioning (struct cgraph_node *old_version_node,
      that is not weak also.
      ??? We cannot use COMDAT linkage because there is no
      ABI support for this.  */
-  DECL_EXTERNAL (new_version_node->decl) = 0;
-  DECL_COMDAT_GROUP (new_version_node->decl) = NULL_TREE;
-  TREE_PUBLIC (new_version_node->decl) = 0;
-  DECL_COMDAT (new_version_node->decl) = 0;
-  DECL_WEAK (new_version_node->decl) = 0;
+  cgraph_make_decl_local (new_version_node->decl);
   DECL_VIRTUAL_P (new_version_node->decl) = 0;
   new_version_node->local.externally_visible = 0;
   new_version_node->local.local = 1;
index 1230448ecbfe0ffa68cff5de2b0afcf7e37c6cd3..63de1d99d44feec5afc35e3078f2730357e4613a 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -400,9 +400,7 @@ function_and_variable_visibility (bool whole_program)
          && !DECL_EXTERNAL (node->decl))
        {
          gcc_assert (whole_program || !TREE_PUBLIC (node->decl));
-         TREE_PUBLIC (node->decl) = 0;
-         DECL_COMDAT (node->decl) = 0;
-         DECL_WEAK (node->decl) = 0;
+         cgraph_make_decl_local (node->decl);
        }
       node->local.local = (cgraph_only_called_directly_p (node)
                           && node->analyzed
@@ -431,8 +429,7 @@ function_and_variable_visibility (bool whole_program)
       if (!vnode->externally_visible)
        {
          gcc_assert (whole_program || !TREE_PUBLIC (vnode->decl));
-         TREE_PUBLIC (vnode->decl) = 0;
-         DECL_COMMON (vnode->decl) = 0;
+         cgraph_make_decl_local (vnode->decl);
        }
      gcc_assert (TREE_STATIC (vnode->decl));
     }