diff options
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/c-decl.c | 2 | ||||
-rw-r--r-- | gcc/cgraph.c | 143 | ||||
-rw-r--r-- | gcc/cgraph.h | 2 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 5 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 2 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 2 | ||||
-rw-r--r-- | gcc/cp/method.c | 4 | ||||
-rw-r--r-- | gcc/final.c | 2 | ||||
-rw-r--r-- | gcc/tree.h | 1 | ||||
-rw-r--r-- | gcc/varasm.c | 30 |
12 files changed, 71 insertions, 149 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06df3c2..74e1c53 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 8ca5b08..e2c5a97 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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) { diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 5669edd..5e44b55 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -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. */ diff --git a/gcc/cgraph.h b/gcc/cgraph.h index c76b5dc..3530279 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -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); diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index c079e40..fcd85b4 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -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; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec73835..89c1922 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 21f8254..6407aed 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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. */ diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 4c36eb5..dfe4b0d 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); } } } diff --git a/gcc/cp/method.c b/gcc/cp/method.c index d1ce575..efd0e06 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -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; diff --git a/gcc/final.c b/gcc/final.c index 281b161..ef1eeb2 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -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 @@ -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 */ diff --git a/gcc/varasm.c b/gcc/varasm.c index 4b59129..96d264a 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -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 |