Hi,
this patch fixes the partitioner WRT inlined thunks. When thunk is offline, we
must place it into the same unit as its target (because ASM thunk output 
machinery
is not designed for non-local calls). However when thunk is inlined it behave
like other functions and in particular we do not want to drag inline clone into
an unit where it is defined.

I hope this fixed the xalancbmk ICE reported, but I did not double check since
I do not have build tree handy.  It fixed Firefox ICE at sameplace that appears
after applying the previous patch.

Bootstrapped/regtested x86_64-linux, will commit it tomorrow.

        * lto-cgraph.c (compute_ltrans_boundary, output_symtab): Fix handling
        of inline thunks

        * lto-partition.c (add_symbol_to_partition_1): Likewise.
Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c        (revision 236211)
+++ lto-cgraph.c        (working copy)
@@ -972,7 +972,7 @@ compute_ltrans_boundary (lto_symtab_enco
       if (node->alias && node->analyzed)
        create_references (encoder, node);
       if (cnode
-         && cnode->thunk.thunk_p)
+         && cnode->thunk.thunk_p && !cnode->global.inlined_to)
        add_node_to (encoder, cnode->callees->callee, false);
       while (node->transparent_alias && node->analyzed)
        {
@@ -1028,7 +1028,7 @@ output_symtab (void)
     {
       node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder, i));
       if (node
-         && (node->thunk.thunk_p
+         && ((node->thunk.thunk_p && !node->global.inlined_to)
              || lto_symtab_encoder_in_partition_p (encoder, node)))
        {
          output_outgoing_cgraph_edges (node->callees, ob, encoder);
Index: lto/lto-partition.c
===================================================================
--- lto/lto-partition.c (revision 236211)
+++ lto/lto-partition.c (working copy)
@@ -163,7 +163,7 @@ add_symbol_to_partition_1 (ltrans_partit
 
       /* Add all thunks associated with the function.  */
       for (e = cnode->callers; e; e = e->next_caller)
-       if (e->caller->thunk.thunk_p)
+       if (e->caller->thunk.thunk_p && !e->caller->global.inlined_to)
          add_symbol_to_partition_1 (part, e->caller);
 
       /* Instrumented version is actually the same function.

Reply via email to