Hi,
currently Mozilla does not build with undefined symbol on 
error: /tmp/cc0oq4BG.ltrans1.ltrans.o: requires dynamic R_X86_64_PC32 reloc
against '_ZN12SkAnnotationC1ER23SkFlattenableReadBuffer' which may overflow at
runtime; recompile with -fPIC

This is actually bug in Mozilla (the module is calling the function but it is 
not 
linked with the implementation). The call is however from dead virtual function 
and
is optimized even at -O0 without LTO.
What breaks is that currently we do symtab_remove_unreachable_nodes in 
post-inlining
mode only from cgraphunit path that is completely bypassed by WPA.

This is bug.  The cleanup is supposed to happen just before inlining functions
called once.  The patch also adds the cleanup to same place into
do_whole_program_analysis and updates cgraphclones.c so we do not ice when
removing offline copy of the function after inlining.

We really ought to do post-inlining cleanup from passmanager, too, but this
will require some bookeeping, so it is post 4.8 material.

Bootstrapped/regtested x86_64, lto-bootstrapped and tested with lto Mozilla.
Unforutnately there seems to be yet another undefined symbol problem as 
described
by Markus.

Honza

        PR lto/45375
        * ipa-inline.c (ipa_inline): Remove extern inlines and virtual 
functions.
        * cgraphclones.c (cgraph_clone_node): Cpoy also LTO file data.

        * lto.c (do_whole_program_analysis): Remove unreachable nodes after IPA.
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 195047)
+++ ipa-inline.c        (working copy)
@@ -1793,7 +1793,7 @@ ipa_inline (void)
     }
 
   inline_small_functions ();
-  symtab_remove_unreachable_nodes (true, dump_file);
+  symtab_remove_unreachable_nodes (false, dump_file);
   free (order);
 
   /* Inline functions with a property that after inlining into all callers the
Index: lto/lto.c
===================================================================
--- lto/lto.c   (revision 195047)
+++ lto/lto.c   (working copy)
@@ -3215,6 +3215,7 @@ do_whole_program_analysis (void)
   cgraph_state = CGRAPH_STATE_IPA_SSA;
 
   execute_ipa_pass_list (all_regular_ipa_passes);
+  symtab_remove_unreachable_nodes (false, dump_file);
 
   if (cgraph_dump_file)
     {
Index: cgraphclones.c
===================================================================
--- cgraphclones.c      (revision 195047)
+++ cgraphclones.c      (working copy)
@@ -184,6 +184,7 @@ cgraph_clone_node (struct cgraph_node *n
   new_node->symbol.decl = decl;
   symtab_register_node ((symtab_node)new_node);
   new_node->origin = n->origin;
+  new_node->symbol.lto_file_data = n->symbol.lto_file_data;
   if (new_node->origin)
     {
       new_node->next_nested = new_node->origin->nested;

Reply via email to