On Sun, Jun 12, 2011 at 8:01 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Jun 12, 2011 at 7:54 AM, Jan Hubicka <hubi...@ucw.cz> wrote: >>> >>> This also pretty much destroyed C++ for ia32: >>> >>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49378 >>> http://gcc.gnu.org/ml/gcc-regression/2011-06/msg00159.html >> >> Hi, >> It seems somewhat amazing that we hit kernel sensitive miscompilation here. >> The problem most probably is the fact that thunks and functions with thunks >> can become >> local. This is correct since thunks are represented as direct calls now, but >> this >> makes i386 to use local ABI when calling or compiling them. >> >> Does the following patch help? We may also need to look for the presence of >> thunk >> callers. >> >> Index: ipa.c >> =================================================================== >> --- ipa.c (revision 174958) >> +++ ipa.c (working copy) >> @@ -120,6 +120,7 @@ static bool >> cgraph_non_local_node_p_1 (struct cgraph_node *node, void *data >> ATTRIBUTE_UNUSED) >> { >> return !(cgraph_only_called_directly_or_aliased_p (node) >> + && !ipa_ref_has_aliases_p (&node->ref_list) >> && node->analyzed >> && !DECL_EXTERNAL (node->decl) >> && !node->local.externally_visible >> @@ -132,7 +133,11 @@ cgraph_non_local_node_p_1 (struct cgraph >> static bool >> cgraph_local_node_p (struct cgraph_node *node) >> { >> - return !cgraph_for_node_and_aliases (cgraph_function_or_thunk_node >> (node, NULL), >> + struct cgraph_node *n = cgraph_function_or_thunk_node (node, NULL); >> + >> + if (n->thunk.thunk_p) >> + return false; >> + return !cgraph_for_node_and_aliases (n, >> cgraph_non_local_node_p_1, NULL, >> true); >> >> } >> > > I am testing it now. Will know the results in 2 hours. >
Yes, it fixes C++ regressions. Thanks. -- H.J.