OSDN Git Service

* cgraph.c (hash_node, eq_node, cgraph_node, cgraph_remove_node)
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 2004 01:28:56 +0000 (01:28 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 2004 01:28:56 +0000 (01:28 +0000)
(cgraph_varpool_hash_node, eq_cgraph_varpool_node)
(cgraph_varpool_node):
Use DECL_UID for the key, not DECL_ASSEMBLER_NAME.
(cgraph_function_possibly_inlined_p): Use the decl itself for
the key, not DECL_ASSEMBLER_NAME.
(change_decl_assembler_name): No need to muck with the hash tables.
(cgraph_node_for_identifier, cgraph_varpool_node_for_identifier):
Delete.
* cgraphunit.c (cgraph_mark_inline_edge): Use the decl itself
for the key, not DECL_ASSEMBLER_NAME.
* cgraph.h: Remove prototypes of deleted functions.
* varasm.c (mark_referenced): Just set TREE_SYMBOL_REFERENCED.
(mark_decl_referenced): New function.
* tree.h: Prototype mark_decl_referenced.
* final.c (output_addr_const) <case SYMBOL_REF>: Call
mark_decl_referenced before assemble_name.
* c-decl.c (finish_decl): Use mark_decl_referenced.
cp:
* decl.c (cp_finish_decl): Use mark_decl_referenced.
* decl2.c (maybe_make_one_only): Likewise.
* method.c (use_thunk): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82015 138bc75d-0d04-0410-961f-82ee72b054a4

12 files changed:
gcc/ChangeLog
gcc/c-decl.c
gcc/cgraph.c
gcc/cgraph.h
gcc/cgraphunit.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/method.c
gcc/final.c
gcc/tree.h
gcc/varasm.c

index 06df3c2..74e1c53 100644 (file)
@@ -1,3 +1,24 @@
+2004-05-18  Zack Weinberg  <zack@codesourcery.com>
+
+       * cgraph.c (hash_node, eq_node, cgraph_node, cgraph_remove_node)
+       (cgraph_varpool_hash_node, eq_cgraph_varpool_node)
+       (cgraph_varpool_node):
+       Use DECL_UID for the key, not DECL_ASSEMBLER_NAME.
+       (cgraph_function_possibly_inlined_p): Use the decl itself for
+       the key, not DECL_ASSEMBLER_NAME.
+       (change_decl_assembler_name): No need to muck with the hash tables.
+       (cgraph_node_for_identifier, cgraph_varpool_node_for_identifier):
+       Delete.
+       * cgraphunit.c (cgraph_mark_inline_edge): Use the decl itself
+       for the key, not DECL_ASSEMBLER_NAME.
+       * cgraph.h: Remove prototypes of deleted functions.
+       * varasm.c (mark_referenced): Just set TREE_SYMBOL_REFERENCED.
+       (mark_decl_referenced): New function.
+       * tree.h: Prototype mark_decl_referenced.
+       * final.c (output_addr_const) <case SYMBOL_REF>: Call
+       mark_decl_referenced before assemble_name.
+       * c-decl.c (finish_decl): Use mark_decl_referenced.
+
 2004-05-18  Andrew Pinski  <pinskia@physics.uc.edu>
            Jeff Law <law@redhat.com>
 
index 8ca5b08..e2c5a97 100644 (file)
@@ -2981,7 +2981,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
 
   /* If this was marked 'used', be sure it will be output.  */
   if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
-    mark_referenced (DECL_ASSEMBLER_NAME (decl));
+    mark_decl_referenced (decl);
 
   if (TREE_CODE (decl) == TYPE_DECL)
     {
index 5669edd..5e44b55 100644 (file)
@@ -99,8 +99,9 @@ The varpool data structure:
 /* Hash table used to convert declarations into nodes.  */
 static GTY((param_is (struct cgraph_node))) htab_t cgraph_hash;
 
-/* We destructively update callgraph during inlining and thus we need to
-   keep information on whether inlining happened separately.  */
+/* We destructively update the callgraph during inlining, thus we need to
+   keep a separate table with information on whether inlining happened.
+   ??? Do this with a bit in the DECL instead of a hash table.  */
 htab_t cgraph_inline_hash;
 
 /* The linked list of cgraph nodes.  */
@@ -138,9 +139,7 @@ static int eq_node (const void *, const void *);
 static hashval_t
 hash_node (const void *p)
 {
-  return ((hashval_t)
-         IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
-                                (((struct cgraph_node *) p)->decl)));
+  return ((hashval_t) DECL_UID (((struct cgraph_node *) p)->decl));
 }
 
 /* Returns nonzero if P1 and P2 are equal.  */
@@ -148,8 +147,7 @@ hash_node (const void *p)
 static int
 eq_node (const void *p1, const void *p2)
 {
-  return ((DECL_ASSEMBLER_NAME (((struct cgraph_node *) p1)->decl)) ==
-         (tree) p2);
+  return (DECL_UID (((struct cgraph_node *) p1)->decl) == (unsigned int)p2);
 }
 
 /* Allocate new callgraph node and insert it into basic data structures.  */
@@ -183,9 +181,10 @@ cgraph_node (tree decl)
     cgraph_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
 
   slot = (struct cgraph_node **)
-    htab_find_slot_with_hash (cgraph_hash, DECL_ASSEMBLER_NAME (decl),
-                             IDENTIFIER_HASH_VALUE
-                               (DECL_ASSEMBLER_NAME (decl)), INSERT);
+    htab_find_slot_with_hash (cgraph_hash,
+                             (void *)DECL_UID (decl),
+                             (hashval_t)DECL_UID (decl),
+                             INSERT);
   if (*slot)
     return *slot;
 
@@ -218,26 +217,6 @@ cgraph_edge (struct cgraph_node *node, tree call_expr)
   return e;
 }
 
-/* Try to find existing function for identifier ID.  */
-struct cgraph_node *
-cgraph_node_for_identifier (tree id)
-{
-  struct cgraph_node **slot;
-
-  if (TREE_CODE (id) != IDENTIFIER_NODE)
-    abort ();
-
-  if (!cgraph_hash)
-    return NULL;
-
-  slot = (struct cgraph_node **)
-    htab_find_slot_with_hash (cgraph_hash, id,
-                             IDENTIFIER_HASH_VALUE (id), NO_INSERT);
-  if (!slot)
-    return NULL;
-  return *slot;
-}
-
 /* Create edge from CALLER to CALLEE in the cgraph.  */
 
 struct cgraph_edge *
@@ -347,9 +326,10 @@ cgraph_remove_node (struct cgraph_node *node)
   if (node->next)
     node->next->previous = node->previous;
   slot = 
-    htab_find_slot_with_hash (cgraph_hash, DECL_ASSEMBLER_NAME (node->decl),
-                             IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
-                                                    (node->decl)), NO_INSERT);
+    htab_find_slot_with_hash (cgraph_hash,
+                             (void *)DECL_UID (node->decl),
+                             (hashval_t)DECL_UID (node->decl),
+                             NO_INSERT);
   if (*slot == node)
     {
       if (node->next_clone)
@@ -552,9 +532,7 @@ dump_cgraph (FILE *f)
 static hashval_t
 cgraph_varpool_hash_node (const void *p)
 {
-  return ((hashval_t)
-         IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
-                                (((struct cgraph_varpool_node *) p)->decl)));
+  return ((hashval_t) DECL_UID (((struct cgraph_varpool_node *) p)->decl));
 }
 
 /* Returns nonzero if P1 and P2 are equal.  */
@@ -562,8 +540,9 @@ cgraph_varpool_hash_node (const void *p)
 static int
 eq_cgraph_varpool_node (const void *p1, const void *p2)
 {
-  return ((DECL_ASSEMBLER_NAME (((struct cgraph_varpool_node *) p1)->decl)) ==
-         (tree) p2);
+  return (DECL_UID (((struct cgraph_varpool_node *) p1)->decl)
+         == (unsigned int) p2);
+
 }
 
 /* Return cgraph_varpool node assigned to DECL.  Create new one when needed.  */
@@ -580,8 +559,9 @@ cgraph_varpool_node (tree decl)
     cgraph_varpool_hash = htab_create_ggc (10, cgraph_varpool_hash_node,
                                           eq_cgraph_varpool_node, NULL);
   slot = (struct cgraph_varpool_node **)
-    htab_find_slot_with_hash (cgraph_varpool_hash, DECL_ASSEMBLER_NAME (decl),
-                             IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME (decl)),
+    htab_find_slot_with_hash (cgraph_varpool_hash,
+                             (void *)DECL_UID (decl),
+                             (hashval_t)DECL_UID (decl),
                              INSERT);
   if (*slot)
     return *slot;
@@ -597,10 +577,6 @@ cgraph_varpool_node (tree decl)
 void
 change_decl_assembler_name (tree decl, tree name)
 {
-  struct cgraph_node *node = NULL;
-  struct cgraph_varpool_node *vnode = NULL;
-  void **slot;
-
   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
     {
       SET_DECL_ASSEMBLER_NAME (decl, name);
@@ -613,83 +589,7 @@ change_decl_assembler_name (tree decl, tree name)
       && DECL_RTL_SET_P (decl))
     warning ("%D renamed after being referenced in assembly", decl);
 
-  if (TREE_CODE (decl) == FUNCTION_DECL && cgraph_hash)
-    {
-      /* Take a look whether declaration is in the cgraph structure.  */
-      slot = 
-       htab_find_slot_with_hash (cgraph_hash, DECL_ASSEMBLER_NAME (decl),
-                                  IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
-                                                         (decl)), NO_INSERT);
-      if (slot)
-       node = *slot;
-
-      /* It is, verify that we are the canonical node for this decl.  */
-      if (node && node->decl == decl)
-       {
-         node = *slot;
-         htab_clear_slot (cgraph_hash, slot);
-        }
-       else
-        node = NULL;
-    }
-  if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl) && cgraph_varpool_hash)
-    {
-      /* Take a look whether declaration is in the cgraph structure.  */
-      slot = 
-       htab_find_slot_with_hash (cgraph_varpool_hash, DECL_ASSEMBLER_NAME (decl),
-                                  IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME
-                                                         (decl)), NO_INSERT);
-      if (slot)
-       vnode = *slot;
-
-      /* It is, verify that we are the canonical vnode for this decl.  */
-      if (vnode && vnode->decl == decl)
-       {
-         vnode = *slot;
-         htab_clear_slot (cgraph_varpool_hash, slot);
-        }
-       else
-        vnode = NULL;
-    }
   SET_DECL_ASSEMBLER_NAME (decl, name);
-  if (node)
-    {
-      slot = 
-       htab_find_slot_with_hash (cgraph_hash, name,
-                                 IDENTIFIER_HASH_VALUE (name), INSERT);
-      if (*slot)
-       abort ();
-      *slot = node;
-    }
-  if (vnode)
-    {
-      slot = 
-       htab_find_slot_with_hash (cgraph_varpool_hash, name,
-                                 IDENTIFIER_HASH_VALUE (name), INSERT);
-      if (*slot)
-       abort ();
-      *slot = vnode;
-    }
-}
-
-/* Try to find existing function for identifier ID.  */
-struct cgraph_varpool_node *
-cgraph_varpool_node_for_identifier (tree id)
-{
-  struct cgraph_varpool_node **slot;
-
-  if (TREE_CODE (id) != IDENTIFIER_NODE)
-    abort ();
-
-  if (!cgraph_varpool_hash)
-    return NULL;
-
-  slot = (struct cgraph_varpool_node **)
-    htab_find_slot_with_hash (cgraph_varpool_hash, id,
-                             IDENTIFIER_HASH_VALUE (id), NO_INSERT);
-  if (!slot)
-    return NULL;
-  return *slot;
 }
 
 /* Notify finalize_compilation_unit that given node is reachable
@@ -767,8 +667,7 @@ cgraph_function_possibly_inlined_p (tree decl)
     return (DECL_INLINE (decl) && !flag_really_no_inline);
   if (!cgraph_inline_hash)
     return false;
-  return (htab_find_slot (cgraph_inline_hash, DECL_ASSEMBLER_NAME (decl),
-                         NO_INSERT) != NULL);
+  return (htab_find_slot (cgraph_inline_hash, decl, NO_INSERT) != NULL);
 }
 
 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
index c76b5dc..3530279 100644 (file)
@@ -164,7 +164,6 @@ struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
                                        tree);
 struct cgraph_node *cgraph_node (tree decl);
 struct cgraph_edge *cgraph_edge (struct cgraph_node *, tree call_expr);
-struct cgraph_node *cgraph_node_for_identifier (tree id);
 bool cgraph_calls_p (tree, tree);
 struct cgraph_local_info *cgraph_local_info (tree);
 struct cgraph_global_info *cgraph_global_info (tree);
@@ -174,7 +173,6 @@ struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_node
 struct cgraph_node * cgraph_clone_node (struct cgraph_node *);
 
 struct cgraph_varpool_node *cgraph_varpool_node (tree decl);
-struct cgraph_varpool_node *cgraph_varpool_node_for_identifier (tree id);
 void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *);
 void cgraph_varpool_finalize_decl (tree);
 bool cgraph_varpool_assemble_pending_decls (void);
index c079e40..fcd85b4 100644 (file)
@@ -1076,9 +1076,8 @@ cgraph_mark_inline_edge (struct cgraph_edge *e)
       if (!cgraph_inline_hash)
         cgraph_inline_hash = htab_create_ggc (42, htab_hash_pointer,
                                              htab_eq_pointer, NULL);
-      slot = htab_find_slot (cgraph_inline_hash,
-                            DECL_ASSEMBLER_NAME (e->callee->decl), INSERT);
-      *slot = DECL_ASSEMBLER_NAME (e->callee->decl);
+      slot = htab_find_slot (cgraph_inline_hash, e->callee->decl, INSERT);
+      *slot = e->callee->decl;
     }
   e->callee->global.inlined = true;
 
index ec73835..89c1922 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-18  Zack Weinberg  <zack@codesourcery.com>
+
+       * decl.c (cp_finish_decl): Use mark_decl_referenced.
+       * decl2.c (maybe_make_one_only): Likewise.
+       * method.c (use_thunk): Likewise.
+
 2004-05-18  Jason Merrill  <jason@redhat.com>
 
        * class.c (build_base_path): Tidy a bit.
index 21f8254..6407aed 100644 (file)
@@ -4912,7 +4912,7 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
 
   /* If this was marked 'used', be sure it will be output.  */
   if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
-    mark_referenced (DECL_ASSEMBLER_NAME (decl));
+    mark_decl_referenced (decl);
 }
 
 /* This is here for a midend callback from c-common.c.  */
index 4c36eb5..dfe4b0d 100644 (file)
@@ -1450,7 +1450,7 @@ maybe_make_one_only (tree decl)
        {
          DECL_COMDAT (decl) = 1;
          /* Mark it needed so we don't forget to emit it.  */
-         mark_referenced (DECL_ASSEMBLER_NAME (decl));
+         mark_decl_referenced (decl);
        }
     }
 }
index d1ce575..efd0e06 100644 (file)
@@ -353,7 +353,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
      this translation unit.  */
   TREE_ADDRESSABLE (function) = 1;
   mark_used (function);
-  mark_referenced (DECL_ASSEMBLER_NAME (function));
+  mark_decl_referenced (function);
   if (!emit_p)
     return;
 
@@ -495,7 +495,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
 
       /* Since we want to emit the thunk, we explicitly mark its name as
         referenced.  */
-      mark_referenced (DECL_ASSEMBLER_NAME (thunk_fndecl));
+      mark_decl_referenced (thunk_fndecl);
 
       /* But we don't want debugging information about it.  */
       DECL_IGNORED_P (thunk_fndecl) = 1;
index 281b161..ef1eeb2 100644 (file)
@@ -3252,6 +3252,8 @@ output_addr_const (FILE *file, rtx x)
       break;
 
     case SYMBOL_REF:
+      if (SYMBOL_REF_DECL (x))
+       mark_decl_referenced (SYMBOL_REF_DECL (x));
 #ifdef ASM_OUTPUT_SYMBOL_REF
       ASM_OUTPUT_SYMBOL_REF (file, x);
 #else
index d753f02..da881a2 100644 (file)
@@ -3654,6 +3654,7 @@ extern void variable_section (tree, int);
 enum tls_model decl_tls_model (tree);
 extern void resolve_unique_section (tree, int, int);
 extern void mark_referenced (tree);
+extern void mark_decl_referenced (tree);
 extern void notice_global_symbol (tree);
 
 /* In stmt.c */
index 4b59129..96d264a 100644 (file)
@@ -1685,29 +1685,25 @@ assemble_label (const char *name)
   ASM_OUTPUT_LABEL (asm_out_file, name);
 }
 
-/* Set the symbol_referenced flag for ID and notify callgraph code.  */
+/* Set the symbol_referenced flag for ID.  */
 void
 mark_referenced (tree id)
 {
-  if (!TREE_SYMBOL_REFERENCED (id))
-    {
-      struct cgraph_node *node;
-      struct cgraph_varpool_node *vnode;
-
-      if (!cgraph_global_info_ready)
-       {
-         node = cgraph_node_for_identifier (id);
-         if (node)
-           cgraph_mark_needed_node (node);
-       }
-
-      vnode = cgraph_varpool_node_for_identifier (id);
-      if (vnode)
-       cgraph_varpool_mark_needed_node (vnode);
-    }
   TREE_SYMBOL_REFERENCED (id) = 1;
 }
 
+/* Set the symbol_referenced flag for DECL and notify callgraph.  */
+void
+mark_decl_referenced (tree decl)
+{
+  if (TREE_CODE (decl) == FUNCTION_DECL)
+    cgraph_mark_needed_node (cgraph_node (decl));
+  else if (TREE_CODE (decl) == VAR_DECL)
+    cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
+  /* else do nothing - we can get various sorts of CST nodes here,
+     which do not need to be marked.  */
+}
+
 /* Output to FILE a reference to the assembler name of a C-level name NAME.
    If NAME starts with a *, the rest of NAME is output verbatim.
    Otherwise NAME is transformed in an implementation-defined way