This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Make lto-symtab to ignore conflicts in static functions


On Mon, 8 Apr 2013, Jan Hubicka wrote:

> Hi,
> currently lto-symtab is trying to resolve all duplicated declarations,
> including static variables where such duplicates should not happen.
> This conflicts with the plan to solve PR54095 by postponning renaming to
> the partitioning.  This patch adds lto_symtab_symbol_p that disable merging
> on statics and keeps duplicate entries for a given asm name.
> 
> Boostrapped/regtested x86_64-linux, OK?

Ok.

Thanks,
Richard.

> Honza
> 
> 	PR lto/54095
> 	lto-symtab.c (lto_symtab_symbol_p): New function.
> 	(lto_symtab_resolve_can_prevail_p, lto_symtab_resolve_symbols,
> 	lto_symtab_resolve_symbols, lto_symtab_merge_decls_2,
> 	lto_symtab_merge_decls_1, lto_symtab_merge_cgraph_nodes_1):
> 	Skip static symbols.
> 	
> Index: lto-symtab.c
> ===================================================================
> *** lto-symtab.c	(revision 197551)
> --- lto-symtab.c	(working copy)
> *************** lto_symtab_resolve_replaceable_p (symtab
> *** 226,237 ****
>     return false;
>   }
>   
>   /* Return true if the symtab entry E can be the prevailing one.  */
>   
>   static bool
>   lto_symtab_resolve_can_prevail_p (symtab_node e)
>   {
> !   if (!symtab_real_symbol_p (e))
>       return false;
>   
>     /* The C++ frontend ends up neither setting TREE_STATIC nor
> --- 226,249 ----
>     return false;
>   }
>   
> + /* Return true, if the symbol E should be resolved by lto-symtab.
> +    Those are all real symbols that are not static (we handle renaming
> +    of static later in partitioning).  */
> + 
> + static bool
> + lto_symtab_symbol_p (symtab_node e)
> + {
> +   if (!TREE_PUBLIC (e->symbol.decl))
> +     return false;
> +   return symtab_real_symbol_p (e);
> + }
> + 
>   /* Return true if the symtab entry E can be the prevailing one.  */
>   
>   static bool
>   lto_symtab_resolve_can_prevail_p (symtab_node e)
>   {
> !   if (!lto_symtab_symbol_p (e))
>       return false;
>   
>     /* The C++ frontend ends up neither setting TREE_STATIC nor
> *************** lto_symtab_resolve_symbols (symtab_node
> *** 261,267 ****
>   
>     /* Always set e->node so that edges are updated to reflect decl merging. */
>     for (e = first; e; e = e->symbol.next_sharing_asm_name)
> !     if (symtab_real_symbol_p (e)
>   	&& (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY
>   	    || e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
>   	    || e->symbol.resolution == LDPR_PREVAILING_DEF))
> --- 273,279 ----
>   
>     /* Always set e->node so that edges are updated to reflect decl merging. */
>     for (e = first; e; e = e->symbol.next_sharing_asm_name)
> !     if (lto_symtab_symbol_p (e)
>   	&& (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY
>   	    || e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
>   	    || e->symbol.resolution == LDPR_PREVAILING_DEF))
> *************** lto_symtab_resolve_symbols (symtab_node
> *** 275,281 ****
>       {
>         /* Assert it's the only one.  */
>         for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name)
> ! 	if (symtab_real_symbol_p (e)
>   	    && (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY
>   		|| e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
>   		|| e->symbol.resolution == LDPR_PREVAILING_DEF))
> --- 287,293 ----
>       {
>         /* Assert it's the only one.  */
>         for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name)
> ! 	if (lto_symtab_symbol_p (e)
>   	    && (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY
>   		|| e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
>   		|| e->symbol.resolution == LDPR_PREVAILING_DEF))
> *************** lto_symtab_resolve_symbols (symtab_node
> *** 310,317 ****
>     /* Do a second round choosing one from the replaceable prevailing decls.  */
>     for (e = first; e; e = e->symbol.next_sharing_asm_name)
>       {
> !       if (!lto_symtab_resolve_can_prevail_p (e)
> ! 	  || !symtab_real_symbol_p (e))
>   	continue;
>   
>         /* Choose the first function that can prevail as prevailing.  */
> --- 322,328 ----
>     /* Do a second round choosing one from the replaceable prevailing decls.  */
>     for (e = first; e; e = e->symbol.next_sharing_asm_name)
>       {
> !       if (!lto_symtab_resolve_can_prevail_p (e))
>   	continue;
>   
>         /* Choose the first function that can prevail as prevailing.  */
> *************** lto_symtab_merge_decls_2 (symtab_node fi
> *** 365,375 ****
>     /* Try to merge each entry with the prevailing one.  */
>     for (e = prevailing->symbol.next_sharing_asm_name;
>          e; e = e->symbol.next_sharing_asm_name)
> !     {
> !       if (!lto_symtab_merge (prevailing, e)
> ! 	  && !diagnosed_p)
> ! 	mismatches.safe_push (e->symbol.decl);
> !     }
>     if (mismatches.is_empty ())
>       return;
>   
> --- 376,387 ----
>     /* Try to merge each entry with the prevailing one.  */
>     for (e = prevailing->symbol.next_sharing_asm_name;
>          e; e = e->symbol.next_sharing_asm_name)
> !     if (TREE_PUBLIC (e->symbol.decl))
> !       {
> ! 	if (!lto_symtab_merge (prevailing, e)
> ! 	    && !diagnosed_p)
> ! 	  mismatches.safe_push (e->symbol.decl);
> !       }
>     if (mismatches.is_empty ())
>       return;
>   
> *************** lto_symtab_merge_decls_1 (symtab_node fi
> *** 411,417 ****
>         fprintf (cgraph_dump_file, "Merging nodes for %s. Candidates:\n",
>   	       symtab_node_asm_name (first));
>         for (e = first; e; e = e->symbol.next_sharing_asm_name)
> ! 	dump_symtab_node (cgraph_dump_file, e);
>       }
>   
>     /* Compute the symbol resolutions.  This is a no-op when using the
> --- 423,430 ----
>         fprintf (cgraph_dump_file, "Merging nodes for %s. Candidates:\n",
>   	       symtab_node_asm_name (first));
>         for (e = first; e; e = e->symbol.next_sharing_asm_name)
> ! 	if (TREE_PUBLIC (e->symbol.decl))
> ! 	  dump_symtab_node (cgraph_dump_file, e);
>       }
>   
>     /* Compute the symbol resolutions.  This is a no-op when using the
> *************** lto_symtab_merge_decls_1 (symtab_node fi
> *** 436,442 ****
>   	  for (e = prevailing->symbol.next_sharing_asm_name;
>   	       e; e = e->symbol.next_sharing_asm_name)
>   	    if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->symbol.decl))
> ! 		&& COMPLETE_TYPE_P (TREE_TYPE (e->symbol.decl)))
>   	      prevailing = e;
>   	}
>         /* For variables prefer the non-builtin if one is available.  */
> --- 449,456 ----
>   	  for (e = prevailing->symbol.next_sharing_asm_name;
>   	       e; e = e->symbol.next_sharing_asm_name)
>   	    if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->symbol.decl))
> ! 		&& COMPLETE_TYPE_P (TREE_TYPE (e->symbol.decl))
> ! 		&& lto_symtab_symbol_p (e))
>   	      prevailing = e;
>   	}
>         /* For variables prefer the non-builtin if one is available.  */
> *************** lto_symtab_merge_decls_1 (symtab_node fi
> *** 444,450 ****
>   	{
>   	  for (e = first; e; e = e->symbol.next_sharing_asm_name)
>   	    if (TREE_CODE (e->symbol.decl) == FUNCTION_DECL
> ! 		&& !DECL_BUILT_IN (e->symbol.decl))
>   	      {
>   		prevailing = e;
>   		break;
> --- 458,465 ----
>   	{
>   	  for (e = first; e; e = e->symbol.next_sharing_asm_name)
>   	    if (TREE_CODE (e->symbol.decl) == FUNCTION_DECL
> ! 		&& !DECL_BUILT_IN (e->symbol.decl)
> ! 		&& lto_symtab_symbol_p (e))
>   	      {
>   		prevailing = e;
>   		break;
> *************** lto_symtab_merge_decls_1 (symtab_node fi
> *** 461,466 ****
> --- 476,483 ----
>         if (TREE_CODE (prevailing->symbol.decl)
>   	  == TREE_CODE (e->symbol.decl))
>   	continue;
> +       if (!lto_symtab_symbol_p (e))
> + 	continue;
>   
>         switch (TREE_CODE (prevailing->symbol.decl))
>   	{
> *************** lto_symtab_merge_cgraph_nodes_1 (symtab_
> *** 530,536 ****
>       {
>         next = e->symbol.next_sharing_asm_name;
>   
> !       if (!symtab_real_symbol_p (e))
>   	continue;
>         cgraph_node *ce = dyn_cast <cgraph_node> (e);
>         if (ce && !DECL_BUILT_IN (e->symbol.decl))
> --- 547,553 ----
>       {
>         next = e->symbol.next_sharing_asm_name;
>   
> !       if (!lto_symtab_symbol_p (e))
>   	continue;
>         cgraph_node *ce = dyn_cast <cgraph_node> (e);
>         if (ce && !DECL_BUILT_IN (e->symbol.decl))
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]