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

Reply via email to