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);
        }
      }
  }

Reply via email to