mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
d5dc93f446
commit
8cb114b9a9
|
|
@ -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>
|
2011-01-07 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* opts.c (finish_options): Set opts->x_flag_opts_finished to true,
|
* opts.c (finish_options): Set opts->x_flag_opts_finished to true,
|
||||||
|
|
|
||||||
29
gcc/ipa.c
29
gcc/ipa.c
|
|
@ -844,16 +844,32 @@ function_and_variable_visibility (bool whole_program)
|
||||||
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p->decl)),
|
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p->decl)),
|
||||||
IDENTIFIER_POINTER (p->target));
|
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);
|
gcc_assert (node->needed);
|
||||||
pointer_set_insert (aliased_nodes, node);
|
pointer_set_insert (aliased_nodes, node);
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
fprintf (dump_file, " node %s/%i",
|
fprintf (dump_file, " node %s/%i",
|
||||||
cgraph_node_name (node), node->uid);
|
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);
|
gcc_assert (vnode->needed);
|
||||||
pointer_set_insert (aliased_vnodes, vnode);
|
pointer_set_insert (aliased_vnodes, vnode);
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
|
|
@ -867,6 +883,8 @@ function_and_variable_visibility (bool whole_program)
|
||||||
for (node = cgraph_nodes; node; node = node->next)
|
for (node = cgraph_nodes; node; node = node->next)
|
||||||
{
|
{
|
||||||
int flags = flags_from_decl_or_type (node->decl);
|
int flags = flags_from_decl_or_type (node->decl);
|
||||||
|
|
||||||
|
/* Optimize away PURE and CONST constructors and destructors. */
|
||||||
if (optimize
|
if (optimize
|
||||||
&& (flags & (ECF_CONST | ECF_PURE))
|
&& (flags & (ECF_CONST | ECF_PURE))
|
||||||
&& !(flags & ECF_LOOPING_CONST_OR_PURE))
|
&& !(flags & ECF_LOOPING_CONST_OR_PURE))
|
||||||
|
|
@ -875,6 +893,13 @@ function_and_variable_visibility (bool whole_program)
|
||||||
DECL_STATIC_DESTRUCTOR (node->decl) = 0;
|
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
|
/* C++ FE on lack of COMDAT support create local COMDAT functions
|
||||||
(that ought to be shared but can not due to object format
|
(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
|
limitations). It is neccesary to keep the flag to make rest of C++ FE
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2011-01-08 Iain Sandoe <iains@gcc.gnu.org>
|
||||||
|
|
||||||
* objc-obj-c++-shared/next-mapping.h: Move code and definitions for
|
* objc-obj-c++-shared/next-mapping.h: Move code and definitions for
|
||||||
|
|
|
||||||
|
|
@ -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 ();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue