2014-08-22 16:36 GMT+04:00 Martin Liška <mli...@suse.cz>: > On 08/13/2014 02:25 PM, Ilya Enkovich wrote: >> Hi, >> >> This patch is to fix wrong refactoring for cgraph_node::function_symbol >> introduced by this patch: >> https://gcc.gnu.org/ml/gcc-cvs/2014-07/msg00805.html. Here is how function >> was refactored: >> >> -cgraph_function_node (struct cgraph_node *node, enum availability >> *availability) >> +cgraph_node * >> +cgraph_node::function_symbol (enum availability *availability) >> { >> + cgraph_node *node = NULL; >> + >> do >> { >> - node = cgraph_function_or_thunk_node (node, availability); >> + node = ultimate_alias_target (availability); >> if (node->thunk.thunk_p) >> { >> node = node->callees->callee; >> if (availability) >> { >> enum availability a; >> - a = cgraph_function_body_availability (node); >> + a = node->get_availability (); >> if (a < *availability) >> *availability = a; >> } >> - node = cgraph_function_or_thunk_node (node, availability); >> + node = node->ultimate_alias_target (availability); >> } >> } while (node && node->thunk.thunk_p); >> return node; >> } >> >> first ultimate_alias_target call always uses 'this' instead of 'node'. This >> causes infinite loop. >> >> Patch was bootstrapped and regtested on linux-x86_64. OK for trunk? > Hello. > Thank you for the fix. Unfortunately, there's no test case that would show me > the problem.
You should have have at least two thunks in a chain of aliases and thunks to fall into an infinite loop here. I do not know when such chains exist in regular cases. I hit this bug testing pointer bounds checker which transforms functions to thunks and therefore get longer chains of thunks. Thanks, Ilya > > Martin >> >> Thanks, >> Ilya >> -- >> >> 2014-08-13 Ilya Enkovich <ilya.enkov...@intel.com> >> >> * cgraph.c (cgraph_node::function_symbol): Fix wrong >> cgraph_function_node to cgraph_node::function_symbol >> refactoring. >> >> diff --git a/gcc/cgraph.c b/gcc/cgraph.c >> index 5a0b903..370a96a 100644 >> --- a/gcc/cgraph.c >> +++ b/gcc/cgraph.c >> @@ -3000,11 +3000,11 @@ cgraph_node::verify_cgraph_nodes (void) >> cgraph_node * >> cgraph_node::function_symbol (enum availability *availability) >> { >> - cgraph_node *node = NULL; >> + cgraph_node *node = this; >> >> do >> { >> - node = ultimate_alias_target (availability); >> + node = node->ultimate_alias_target (availability); >> if (node->thunk.thunk_p) >> { >> node = node->callees->callee; >