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]

Symbol table 22/many: handle all aliases through the symtab


Hi,
so far we handled only aliases that looked sane by the new cgraph/varpool code.  This 
patch should complette the transition and we now handle all aliases this way.
It also adds an error into case we decided to not handle - the function<->variable
aliases.

Bootstrapped/regtested x86_64-linux, comitted.
I will followup with cleanups and removal of the new unreachable old alias handling code.
Honza

	* cgraphunit.c (handle_alias_pairs): Cleanup; handle all types of aliases.
Index: cgraphunit.c
===================================================================
*** cgraphunit.c	(revision 187678)
--- cgraphunit.c	(working copy)
*************** handle_alias_pairs (void)
*** 1030,1081 ****
  {
    alias_pair *p;
    unsigned i;
-   struct cgraph_node *target_node;
-   struct cgraph_node *src_node;
-   struct varpool_node *target_vnode;
    
    for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p);)
      {
!       if (TREE_CODE (p->decl) == FUNCTION_DECL
! 	  && (target_node = cgraph_node_for_asm (p->target)) != NULL)
! 	{
! 	  src_node = cgraph_get_node (p->decl);
! 	  if (src_node && src_node->local.finalized)
!             cgraph_reset_node (src_node);
! 	  /* Normally EXTERNAL flag is used to mark external inlines,
! 	     however for aliases it seems to be allowed to use it w/o
! 	     any meaning. See gcc.dg/attr-alias-3.c  
! 	     However for weakref we insist on EXTERNAL flag being set.
! 	     See gcc.dg/attr-alias-5.c  */
! 	  if (DECL_EXTERNAL (p->decl))
! 	    DECL_EXTERNAL (p->decl)
! 	      = lookup_attribute ("weakref",
! 				  DECL_ATTRIBUTES (p->decl)) != NULL;
! 	  cgraph_create_function_alias (p->decl, target_node->symbol.decl);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
! 	}
!       else if (TREE_CODE (p->decl) == VAR_DECL
! 	       && (target_vnode = varpool_node_for_asm (p->target)) != NULL)
! 	{
! 	  /* Normally EXTERNAL flag is used to mark external inlines,
! 	     however for aliases it seems to be allowed to use it w/o
! 	     any meaning. See gcc.dg/attr-alias-3.c  
! 	     However for weakref we insist on EXTERNAL flag being set.
! 	     See gcc.dg/attr-alias-5.c  */
! 	  if (DECL_EXTERNAL (p->decl))
! 	    DECL_EXTERNAL (p->decl)
! 	      = lookup_attribute ("weakref",
! 			          DECL_ATTRIBUTES (p->decl)) != NULL;
! 	  varpool_create_variable_alias (p->decl, target_vnode->symbol.decl);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
! 	}
        /* Weakrefs with target not defined in current unit are easy to handle; they
  	 behave just as external variables except we need to note the alias flag
  	 to later output the weakref pseudo op into asm file.  */
!       else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL
! 	       && (TREE_CODE (p->decl) == FUNCTION_DECL
! 		   ? (varpool_node_for_asm (p->target) == NULL)
! 		   : (cgraph_node_for_asm (p->target) == NULL)))
  	{
  	  if (TREE_CODE (p->decl) == FUNCTION_DECL)
  	    cgraph_get_create_node (p->decl)->alias = true;
--- 1030,1044 ----
  {
    alias_pair *p;
    unsigned i;
    
    for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p);)
      {
!       symtab_node target_node = symtab_node_for_asm (p->target);
! 
        /* Weakrefs with target not defined in current unit are easy to handle; they
  	 behave just as external variables except we need to note the alias flag
  	 to later output the weakref pseudo op into asm file.  */
!       if (!target_node && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL)
  	{
  	  if (TREE_CODE (p->decl) == FUNCTION_DECL)
  	    cgraph_get_create_node (p->decl)->alias = true;
*************** handle_alias_pairs (void)
*** 1083,1097 ****
  	    varpool_get_node (p->decl)->alias = true;
  	  DECL_EXTERNAL (p->decl) = 1;
  	  VEC_unordered_remove (alias_pair, alias_pairs, i);
  	}
!       else
  	{
! 	  if (dump_file)
! 	    fprintf (dump_file, "Unhandled alias %s->%s\n",
! 		     IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p->decl)),
! 		     IDENTIFIER_POINTER (p->target));
  
! 	  i++;
  	}
      }
  }
--- 1046,1092 ----
  	    varpool_get_node (p->decl)->alias = true;
  	  DECL_EXTERNAL (p->decl) = 1;
  	  VEC_unordered_remove (alias_pair, alias_pairs, i);
+ 	  continue;
  	}
!       else if (!target_node)
  	{
! 	  error ("%q+D aliased to undefined symbol %qE", p->decl, p->target);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
! 	  continue;
! 	}
  
!       /* Normally EXTERNAL flag is used to mark external inlines,
! 	 however for aliases it seems to be allowed to use it w/o
! 	 any meaning. See gcc.dg/attr-alias-3.c  
! 	 However for weakref we insist on EXTERNAL flag being set.
! 	 See gcc.dg/attr-alias-5.c  */
!       if (DECL_EXTERNAL (p->decl))
! 	DECL_EXTERNAL (p->decl)
! 	  = lookup_attribute ("weakref",
! 			      DECL_ATTRIBUTES (p->decl)) != NULL;
! 
!       if (TREE_CODE (p->decl) == FUNCTION_DECL
!           && target_node && symtab_function_p (target_node))
! 	{
! 	  struct cgraph_node *src_node = cgraph_get_node (p->decl);
! 	  if (src_node && src_node->local.finalized)
!             cgraph_reset_node (src_node);
! 	  cgraph_create_function_alias (p->decl, target_node->symbol.decl);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
! 	}
!       else if (TREE_CODE (p->decl) == VAR_DECL
! 	       && target_node && symtab_variable_p (target_node))
! 	{
! 	  varpool_create_variable_alias (p->decl, target_node->symbol.decl);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
! 	}
!       else
! 	{
! 	  error ("%q+D alias in between function and variable is not supported",
! 		 p->decl);
! 	  warning (0, "%q+D aliased declaration",
! 		   target_node->symbol.decl);
! 	  VEC_unordered_remove (alias_pair, alias_pairs, i);
  	}
      }
  }


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