Commit f7dceb4e by Jan Hubicka

Fix cgraph_node::function_symbol availability compuattion [PR94202]

this fixes ICE in inliner cache sanity check which is caused by very old
bug in visibility calculation in cgraph_node::function_symbol and
cgraph_node::function_or_virtual_thunk_symbol.

In the testcase there is indirect call to a thunk. At begining we correctly
see that its body as AVAIL_AVAILABLE but later we inline into the thunk and
this turns it to AVAIL_INTERPOSABLE.

This is because function_symbol incorrectly overwrites availability parameter
by availability of the alias used in the call within thunk, which is a local
alias.

gcc/ChangeLog:

2020-03-19  Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/94202
	* cgraph.c (cgraph_node::function_symbol): Fix availability computation.
	(cgraph_node::function_or_virtual_thunk_symbol): Likewise.

gcc/testsuite/ChangeLog:

2020-03-19  Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/94202
	* g++.dg/torture/pr94202.C: New test.
parent 9def91e9
2020-03-19 Jan Hubicka <hubicka@ucw.cz> 2020-03-19 Jan Hubicka <hubicka@ucw.cz>
PR ipa/94202
* cgraph.c (cgraph_node::function_symbol): Fix availability computation.
(cgraph_node::function_or_virtual_thunk_symbol): Likewise.
2020-03-19 Jan Hubicka <hubicka@ucw.cz>
PR ipa/92372 PR ipa/92372
* cgraphunit.c (process_function_and_variable_attributes): warn * cgraphunit.c (process_function_and_variable_attributes): warn
for flatten attribute on alias. for flatten attribute on alias.
......
...@@ -3788,16 +3788,13 @@ cgraph_node::function_symbol (enum availability *availability, ...@@ -3788,16 +3788,13 @@ cgraph_node::function_symbol (enum availability *availability,
while (node->thunk.thunk_p) while (node->thunk.thunk_p)
{ {
enum availability a;
ref = node; ref = node;
node = node->callees->callee; node = node->callees->callee;
if (availability) node = node->ultimate_alias_target (availability ? &a : NULL, ref);
{ if (availability && a < *availability)
enum availability a; *availability = a;
a = node->get_availability (ref);
if (a < *availability)
*availability = a;
}
node = node->ultimate_alias_target (availability, ref);
} }
return node; return node;
} }
...@@ -3818,16 +3815,13 @@ cgraph_node::function_or_virtual_thunk_symbol ...@@ -3818,16 +3815,13 @@ cgraph_node::function_or_virtual_thunk_symbol
while (node->thunk.thunk_p && !node->thunk.virtual_offset_p) while (node->thunk.thunk_p && !node->thunk.virtual_offset_p)
{ {
enum availability a;
ref = node; ref = node;
node = node->callees->callee; node = node->callees->callee;
if (availability) node = node->ultimate_alias_target (availability ? &a : NULL, ref);
{ if (availability && a < *availability)
enum availability a; *availability = a;
a = node->get_availability (ref);
if (a < *availability)
*availability = a;
}
node = node->ultimate_alias_target (availability, ref);
} }
return node; return node;
} }
......
2020-03-19 Jan Hubicka <hubicka@ucw.cz>
PR ipa/94202
* g++.dg/torture/pr94202.C: New test.
2020-03-19 Jakub Jelinek <jakub@redhat.com> 2020-03-19 Jakub Jelinek <jakub@redhat.com>
PR gcov-profile/94029 PR gcov-profile/94029
......
// { dg-additional-options "-w" }
struct S1 {
virtual ~S1();
virtual void v();
};
struct S2: S1 {};
struct S3: S1, S2 { void v(); };
struct S4: S3 { void v(); };
void S4::v() { S3::v(); }
struct R {
S1 * m;
void f(S2 * x) {
static_cast<S1 *>(x)->v();
x->v();
m = x;
}
};
void f() {
R r;
r.f(new S4);
r.f(new S3);
}
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