Commit 715a4e08 by Alan Modra Committed by Alan Modra

re PR middle-end/42344 (ICE in rs6000.md with ipa-sra for 252.eon)

	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
parent ad3b056c
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> 2010-02-19 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/43121 PR bootstrap/43121
......
...@@ -86,6 +86,7 @@ The callgraph: ...@@ -86,6 +86,7 @@ The callgraph:
#include "value-prof.h" #include "value-prof.h"
#include "except.h" #include "except.h"
#include "diagnostic.h" #include "diagnostic.h"
#include "rtl.h"
static void cgraph_node_remove_callers (struct cgraph_node *node); static void cgraph_node_remove_callers (struct cgraph_node *node);
static inline void cgraph_edge_remove_caller (struct cgraph_edge *e); 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) ...@@ -2190,6 +2191,42 @@ cgraph_node_can_be_local_p (struct cgraph_node *node)
|| !node->local.externally_visible)); || !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. */ /* Bring NODE local. */
void void
cgraph_make_node_local (struct cgraph_node *node) cgraph_make_node_local (struct cgraph_node *node)
...@@ -2198,19 +2235,11 @@ 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)) if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
{ {
struct cgraph_node *alias; struct cgraph_node *alias;
DECL_COMDAT (node->decl) = 0; cgraph_make_decl_local (node->decl);
DECL_COMDAT_GROUP (node->decl) = 0;
TREE_PUBLIC (node->decl) = 0;
DECL_WEAK (node->decl) = 0;
DECL_EXTERNAL (node->decl) = 0;
for (alias = node->same_body; alias; alias = alias->next) for (alias = node->same_body; alias; alias = alias->next)
{ cgraph_make_decl_local (alias->decl);
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;
}
node->local.externally_visible = false; node->local.externally_visible = false;
node->local.local = true; node->local.local = true;
gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL); gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL);
......
...@@ -565,6 +565,7 @@ void dump_varpool_node (FILE *, struct varpool_node *); ...@@ -565,6 +565,7 @@ void dump_varpool_node (FILE *, struct varpool_node *);
void varpool_finalize_decl (tree); void varpool_finalize_decl (tree);
bool decide_is_variable_needed (struct varpool_node *, tree); bool decide_is_variable_needed (struct varpool_node *, tree);
enum availability cgraph_variable_initializer_availability (struct varpool_node *); enum availability cgraph_variable_initializer_availability (struct varpool_node *);
void cgraph_make_decl_local (tree);
void cgraph_make_node_local (struct cgraph_node *); void cgraph_make_node_local (struct cgraph_node *);
bool cgraph_node_can_be_local_p (struct cgraph_node *); bool cgraph_node_can_be_local_p (struct cgraph_node *);
......
...@@ -2110,11 +2110,7 @@ cgraph_function_versioning (struct cgraph_node *old_version_node, ...@@ -2110,11 +2110,7 @@ cgraph_function_versioning (struct cgraph_node *old_version_node,
that is not weak also. that is not weak also.
??? We cannot use COMDAT linkage because there is no ??? We cannot use COMDAT linkage because there is no
ABI support for this. */ ABI support for this. */
DECL_EXTERNAL (new_version_node->decl) = 0; cgraph_make_decl_local (new_version_node->decl);
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;
DECL_VIRTUAL_P (new_version_node->decl) = 0; DECL_VIRTUAL_P (new_version_node->decl) = 0;
new_version_node->local.externally_visible = 0; new_version_node->local.externally_visible = 0;
new_version_node->local.local = 1; new_version_node->local.local = 1;
......
...@@ -400,9 +400,7 @@ function_and_variable_visibility (bool whole_program) ...@@ -400,9 +400,7 @@ function_and_variable_visibility (bool whole_program)
&& !DECL_EXTERNAL (node->decl)) && !DECL_EXTERNAL (node->decl))
{ {
gcc_assert (whole_program || !TREE_PUBLIC (node->decl)); gcc_assert (whole_program || !TREE_PUBLIC (node->decl));
TREE_PUBLIC (node->decl) = 0; cgraph_make_decl_local (node->decl);
DECL_COMDAT (node->decl) = 0;
DECL_WEAK (node->decl) = 0;
} }
node->local.local = (cgraph_only_called_directly_p (node) node->local.local = (cgraph_only_called_directly_p (node)
&& node->analyzed && node->analyzed
...@@ -431,8 +429,7 @@ function_and_variable_visibility (bool whole_program) ...@@ -431,8 +429,7 @@ function_and_variable_visibility (bool whole_program)
if (!vnode->externally_visible) if (!vnode->externally_visible)
{ {
gcc_assert (whole_program || !TREE_PUBLIC (vnode->decl)); gcc_assert (whole_program || !TREE_PUBLIC (vnode->decl));
TREE_PUBLIC (vnode->decl) = 0; cgraph_make_decl_local (vnode->decl);
DECL_COMMON (vnode->decl) = 0;
} }
gcc_assert (TREE_STATIC (vnode->decl)); gcc_assert (TREE_STATIC (vnode->decl));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment