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
This commit is contained in:
parent
ad3b056c27
commit
715a4e08d0
@ -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
|
||||
|
53
gcc/cgraph.c
53
gcc/cgraph.c
@ -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);
|
||||
|
@ -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 *);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user