Commit 3d8d0043 by Martin Jambor Committed by Martin Jambor

re PR ipa/59176 (ICE edge points to wrong declaration / verify_cgraph_node failed)

2014-03-21  Martin Jambor  <mjambor@suse.cz>

	PR ipa/59176
	* cgraph.h (symtab_node): New flag body_removed.
	* ipa.c (symtab_remove_unreachable_nodes): Set body_removed flag
	when removing bodies.
	* symtab.c (dump_symtab_base): Dump body_removed flag.
	* cgraph.c (verify_edge_corresponds_to_fndecl): Skip nodes which
	had their bodies removed.

testsuite/
        * g++.dg/torture/pr59176.C: New test.

From-SVN: r208748
parent d833415c
2014-03-21 Martin Jambor <mjambor@suse.cz> 2014-03-21 Martin Jambor <mjambor@suse.cz>
PR ipa/59176
* cgraph.h (symtab_node): New flag body_removed.
* ipa.c (symtab_remove_unreachable_nodes): Set body_removed flag
when removing bodies.
* symtab.c (dump_symtab_base): Dump body_removed flag.
* cgraph.c (verify_edge_corresponds_to_fndecl): Skip nodes which
had their bodies removed.
2014-03-21 Martin Jambor <mjambor@suse.cz>
PR ipa/60419 PR ipa/60419
* ipa.c (symtab_remove_unreachable_nodes): Clear thunk flag of nodes * ipa.c (symtab_remove_unreachable_nodes): Clear thunk flag of nodes
in the border. in the border.
......
...@@ -2604,8 +2604,13 @@ verify_edge_corresponds_to_fndecl (struct cgraph_edge *e, tree decl) ...@@ -2604,8 +2604,13 @@ verify_edge_corresponds_to_fndecl (struct cgraph_edge *e, tree decl)
node = cgraph_get_node (decl); node = cgraph_get_node (decl);
/* We do not know if a node from a different partition is an alias or what it /* We do not know if a node from a different partition is an alias or what it
aliases and therefore cannot do the former_clone_of check reliably. */ aliases and therefore cannot do the former_clone_of check reliably. When
if (!node || node->in_other_partition || e->callee->in_other_partition) body_removed is set, we have lost all information about what was alias or
thunk of and also cannot proceed. */
if (!node
|| node->body_removed
|| node->in_other_partition
|| e->callee->in_other_partition)
return false; return false;
node = cgraph_function_or_thunk_node (node, NULL); node = cgraph_function_or_thunk_node (node, NULL);
......
...@@ -91,7 +91,9 @@ public: ...@@ -91,7 +91,9 @@ public:
unsigned forced_by_abi : 1; unsigned forced_by_abi : 1;
/* True when the name is known to be unique and thus it does not need mangling. */ /* True when the name is known to be unique and thus it does not need mangling. */
unsigned unique_name : 1; unsigned unique_name : 1;
/* True when body and other characteristics have been removed by
symtab_remove_unreachable_nodes. */
unsigned body_removed : 1;
/*** WHOPR Partitioning flags. /*** WHOPR Partitioning flags.
These flags are used at ltrans stage when only part of the callgraph is These flags are used at ltrans stage when only part of the callgraph is
......
...@@ -484,6 +484,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) ...@@ -484,6 +484,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
{ {
if (file) if (file)
fprintf (file, " %s", node->name ()); fprintf (file, " %s", node->name ());
node->body_removed = true;
node->analyzed = false; node->analyzed = false;
node->definition = false; node->definition = false;
node->cpp_implicit_alias = false; node->cpp_implicit_alias = false;
...@@ -543,6 +544,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) ...@@ -543,6 +544,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
fprintf (file, " %s", vnode->name ()); fprintf (file, " %s", vnode->name ());
changed = true; changed = true;
} }
vnode->body_removed = true;
vnode->definition = false; vnode->definition = false;
vnode->analyzed = false; vnode->analyzed = false;
vnode->aux = NULL; vnode->aux = NULL;
......
...@@ -601,6 +601,8 @@ dump_symtab_base (FILE *f, symtab_node *node) ...@@ -601,6 +601,8 @@ dump_symtab_base (FILE *f, symtab_node *node)
? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME
(node->alias_target)) (node->alias_target))
: IDENTIFIER_POINTER (node->alias_target)); : IDENTIFIER_POINTER (node->alias_target));
if (node->body_removed)
fprintf (f, "\n Body removed by symtab_remove_unreachable_nodes");
fprintf (f, "\n Visibility:"); fprintf (f, "\n Visibility:");
if (node->in_other_partition) if (node->in_other_partition)
fprintf (f, " in_other_partition"); fprintf (f, " in_other_partition");
......
2014-03-21 Martin Jambor <mjambor@suse.cz> 2014-03-21 Martin Jambor <mjambor@suse.cz>
PR ipa/59176
* g++.dg/torture/pr59176.C: New test.
2014-03-21 Martin Jambor <mjambor@suse.cz>
PR ipa/60419 PR ipa/60419
* g++.dg/ipa/pr60419.C: New test. * g++.dg/ipa/pr60419.C: New test.
......
/* { dg-do compile } */
/* { dg-options "-O3" } */
template <class> class A {
protected:
void m_fn2();
~A() { m_fn2(); }
virtual void m_fn1();
};
class D : A<int> {};
template <class Key> void A<Key>::m_fn2() {
m_fn1();
m_fn1();
m_fn1();
}
#pragma interface
class B {
D m_cellsAlreadyProcessed;
D m_cellsNotToProcess;
public:
virtual ~B() {}
void m_fn1();
};
class C {
unsigned long m_fn1();
B m_fn2();
unsigned long m_fn3();
};
unsigned long C::m_fn1() {
CellHierarchy:
m_fn2().m_fn1();
}
unsigned long C::m_fn3() {
CellHierarchy:
m_fn2().m_fn1();
}
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