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: Allow cgraph nodes to change name


Jan Hubicka <hubicka@ucw.cz> writes:

> Hi,
> in hammer branch we run into testcase where function name changes in the
> middle of process totally messing up the cgraph hashtables.  The
> testcase does not reproduce on mainline as the function is no longer
> localized, but I guess the problem remains.  The attached patch fixes
> it.  OK?
> 
> Mon Aug 18 10:12:57 CEST 2003  Jan Hubicka   <jh@suse.cz>
> 	* cgraph.c (cgraph_set_decl_assembler_name): New function.
> 	* cgraph.h (cgraph_set_decl_assembler_name): Declare.
> 	* varasm.c (make_decl_rtl): Use it.

I think a better approach would be to ensure that function's assembler
names are set exactly once, rather than being set (to the wrong value)
and then changed later.  I fixed a bunch of places where this was done
recently, and so far as I know this is the last place.

> Index: cgraph.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/cgraph.c,v
> retrieving revision 1.20.2.2
> diff -c -3 -p -r1.20.2.2 cgraph.c
> *** cgraph.c	31 Jul 2003 16:53:07 -0000	1.20.2.2
> --- cgraph.c	18 Aug 2003 08:12:27 -0000
> *************** cgraph_varpool_assemble_pending_decls ()
> *** 520,524 ****
> --- 520,577 ----
>     return changed;
>   }
>   
> + /* Set the DECL_ASSEMBLER_NAME and update cgraph hashtables.  */
> + void
> + cgraph_set_decl_assembler_name (tree decl, tree name)
> + {
> +   struct cgraph_node *node = NULL;
> +   struct cgraph_varpool_node *vnode = NULL;
> +   void **slot;
> + 
> +   if (TREE_CODE (decl) == FUNCTION_DECL && cgraph_hash)
> +     {
> +       slot = 
> + 	htab_find_slot_with_hash (cgraph_hash, DECL_ASSEMBLER_NAME (decl),
> + 				  IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
> + 							 (decl)), 0);
> +       if (slot)
> + 	{
> + 	  node = *slot;
> + 	  htab_clear_slot (cgraph_hash, slot);
> + 	}
> +     }
> +   if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl) && cgraph_varpool_hash)
> +     {
> +       slot = 
> + 	htab_find_slot_with_hash (cgraph_varpool_hash,
> + 	    			  DECL_ASSEMBLER_NAME (decl),
> + 				  IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
> + 							 (decl)), 0);
> +       if (slot)
> + 	{
> + 	  vnode = *slot;
> + 	  htab_clear_slot (cgraph_varpool_hash, slot);
> + 	}
> +     }
> +   SET_DECL_ASSEMBLER_NAME (decl, name);
> +   if (node)
> +     {
> +       slot = 
> + 	htab_find_slot_with_hash (cgraph_hash, name,
> + 				  IDENTIFIER_HASH_VALUE (name), 1);
> +       if (*slot)
> + 	abort ();
> +       *slot = node;
> +     }
> +   if (vnode)
> +     {
> +       slot = 
> + 	htab_find_slot_with_hash (cgraph_varpool_hash, name,
> + 				  IDENTIFIER_HASH_VALUE (name), 1);
> +       if (*slot)
> + 	abort ();
> +       *slot = node;
> +     }
> + }
>   
>   #include "gt-cgraph.h"
> Index: cgraph.h
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/cgraph.h,v
> retrieving revision 1.14.2.1
> diff -c -3 -p -r1.14.2.1 cgraph.h
> *** cgraph.h	12 Jul 2003 23:08:16 -0000	1.14.2.1
> --- cgraph.h	18 Aug 2003 08:12:27 -0000
> *************** struct cgraph_varpool_node *cgraph_varpo
> *** 170,175 ****
> --- 170,176 ----
>   void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *);
>   void cgraph_varpool_finalize_decl (tree);
>   bool cgraph_varpool_assemble_pending_decls (void);
> + void cgraph_set_decl_assembler_name (tree decl, tree name);
>   
>   /* In cgraphunit.c  */
>   void cgraph_finalize_function		PARAMS ((tree, tree));
> Index: varasm.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/varasm.c,v
> retrieving revision 1.318.2.12
> diff -c -3 -p -r1.318.2.12 varasm.c
> *** varasm.c	14 Aug 2003 13:20:17 -0000	1.318.2.12
> --- varasm.c	18 Aug 2003 08:12:28 -0000
> *************** make_decl_rtl (decl, asmspec)
> *** 925,931 ****
>   
>     if (name != new_name)
>       {
> !       SET_DECL_ASSEMBLER_NAME (decl, get_identifier (new_name));
>         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>       }
>   
> --- 925,931 ----
>   
>     if (name != new_name)
>       {
> !       cgraph_set_decl_assembler_name (decl, get_identifier (new_name));
>         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>       }
>   
> 

-- 
- Geoffrey Keating <geoffk@geoffk.org>


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