> > 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); }