re PR tree-optimization/46469 (ICE: verify_cgraph_node failed: inline clone is needed at -O)

PR tree-optmization/46469
	* ipa.c (function_and_variable_visibility): Clear needed flags on
	nodes with external decls; handle weakrefs merging correctly.

	* g++.dg/torture/pr46469.C: New testcase.

From-SVN: r168598
This commit is contained in:
Jan Hubicka 2011-01-08 17:33:57 +01:00 committed by Jan Hubicka
parent d5dc93f446
commit 8cb114b9a9
4 changed files with 51 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2011-01-07 Jan Hubicka <jh@suse.cz>
PR tree-optmization/46469
* ipa.c (function_and_variable_visibility): Clear needed flags on
nodes with external decls; handle weakrefs merging correctly.
2011-01-07 Joseph Myers <joseph@codesourcery.com>
* opts.c (finish_options): Set opts->x_flag_opts_finished to true,

View File

@ -844,16 +844,32 @@ function_and_variable_visibility (bool whole_program)
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p->decl)),
IDENTIFIER_POINTER (p->target));
if ((node = cgraph_node_for_asm (p->target)) != NULL)
if ((node = cgraph_node_for_asm (p->target)) != NULL
&& !DECL_EXTERNAL (node->decl))
{
/* Weakrefs alias symbols from other compilation unit. In the case
the destination of weakref became available because of LTO, we must
mark it as needed. */
if (in_lto_p
&& lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))
&& !node->needed)
cgraph_mark_needed_node (node);
gcc_assert (node->needed);
pointer_set_insert (aliased_nodes, node);
if (dump_file)
fprintf (dump_file, " node %s/%i",
cgraph_node_name (node), node->uid);
}
else if ((vnode = varpool_node_for_asm (p->target)) != NULL)
else if ((vnode = varpool_node_for_asm (p->target)) != NULL
&& !DECL_EXTERNAL (vnode->decl))
{
/* Weakrefs alias symbols from other compilation unit. In the case
the destination of weakref became available because of LTO, we must
mark it as needed. */
if (in_lto_p
&& lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))
&& !vnode->needed)
varpool_mark_needed_node (vnode);
gcc_assert (vnode->needed);
pointer_set_insert (aliased_vnodes, vnode);
if (dump_file)
@ -867,6 +883,8 @@ function_and_variable_visibility (bool whole_program)
for (node = cgraph_nodes; node; node = node->next)
{
int flags = flags_from_decl_or_type (node->decl);
/* Optimize away PURE and CONST constructors and destructors. */
if (optimize
&& (flags & (ECF_CONST | ECF_PURE))
&& !(flags & ECF_LOOPING_CONST_OR_PURE))
@ -875,6 +893,13 @@ function_and_variable_visibility (bool whole_program)
DECL_STATIC_DESTRUCTOR (node->decl) = 0;
}
/* Frontends and alias code marks nodes as needed before parsing is finished.
We may end up marking as node external nodes where this flag is meaningless
strip it. */
if (node->needed
&& (DECL_EXTERNAL (node->decl) || !node->analyzed))
node->needed = 0;
/* C++ FE on lack of COMDAT support create local COMDAT functions
(that ought to be shared but can not due to object format
limitations). It is neccesary to keep the flag to make rest of C++ FE

View File

@ -1,3 +1,8 @@
2011-01-08 Jan Hubicka <jh@suse.cz>
PR tree-optmization/46469
* g++.dg/torture/pr46469.C: New testcase.
2011-01-08 Iain Sandoe <iains@gcc.gnu.org>
* objc-obj-c++-shared/next-mapping.h: Move code and definitions for

View File

@ -0,0 +1,13 @@
extern "C" __inline __attribute__ ((__gnu_inline__)) int pthread_equal ()
{
}
static
__typeof
(pthread_equal)
__gthrw_pthread_equal __attribute__ ((__weakref__ ("pthread_equal")));
int identifierByPthreadHandle ()
{
pthread_equal ();
}