Patchwork Fix undefined symbols in LTO Mozilla build

login
register
mail settings
Submitter Jan Hubicka
Date Jan. 9, 2013, 9:27 p.m.
Message ID <20130109212711.GA12286@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/210877/
State New
Headers show

Comments

Jan Hubicka - Jan. 9, 2013, 9:27 p.m.
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.

Patch

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;