This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
IMA repairs: Don't use DECL_ASSEMBLER_NAME for a key in cgraph(take two)
- From: Zack Weinberg <zack at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 18 May 2004 18:27:08 -0700
- Subject: IMA repairs: Don't use DECL_ASSEMBLER_NAME for a key in cgraph(take two)
- References: <87brkm17e2.fsf@taltos.codesourcery.com>
This revised patch fixes the dwarf-die-5 failure. I had botched the
conversion of cgraph_possibly_inlined_p. (This property ought to be
expressed with a bit on the DECL but that's too invasive for me right
now.) The only other change is that I removed the #if 0 block from
mark_referenced, and the abort as well (it's redundant with the
checking in TREE_SYMBOL_REFERENCED).
bootstrapped i686-linux, committed.
zw
* 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.
cp:
* decl.c (cp_finish_decl): Use mark_decl_referenced.
* decl2.c (maybe_make_one_only): Likewise.
* method.c (use_thunk): Likewise.
===================================================================
Index: c-decl.c
--- c-decl.c 14 May 2004 02:29:19 -0000 1.500
+++ c-decl.c 19 May 2004 01:25:15 -0000
@@ -2981,7 +2981,7 @@ finish_decl (tree decl, tree init, 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: cgraph.c
--- cgraph.c 13 May 2004 06:39:32 -0000 1.49
+++ cgraph.c 19 May 2004 01:25:15 -0000
@@ -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
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, t
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 *
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, t
&& 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
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: cgraph.h
--- cgraph.h 13 May 2004 06:39:33 -0000 1.30
+++ cgraph.h 19 May 2004 01:25:15 -0000
@@ -164,7 +164,6 @@ struct cgraph_edge *cgraph_create_edge (
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_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: cgraphunit.c
--- cgraphunit.c 13 May 2004 06:39:33 -0000 1.60
+++ cgraphunit.c 19 May 2004 01:25:15 -0000
@@ -1076,9 +1076,8 @@ cgraph_mark_inline_edge (struct cgraph_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: final.c
--- final.c 13 May 2004 21:52:34 -0000 1.313
+++ final.c 19 May 2004 01:25:15 -0000
@@ -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: tree.h
--- tree.h 18 May 2004 02:53:55 -0000 1.493
+++ tree.h 19 May 2004 01:25:16 -0000
@@ -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: varasm.c
--- varasm.c 13 May 2004 06:39:52 -0000 1.424
+++ varasm.c 19 May 2004 01:25:16 -0000
@@ -1685,27 +1685,23 @@ 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.
===================================================================
Index: cp/decl.c
--- cp/decl.c 13 May 2004 06:40:16 -0000 1.1206
+++ cp/decl.c 19 May 2004 01:25:18 -0000
@@ -4912,7 +4912,7 @@ cp_finish_decl (tree decl, tree init, tr
/* 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: cp/decl2.c
--- cp/decl2.c 13 May 2004 06:40:17 -0000 1.707
+++ cp/decl2.c 19 May 2004 01:25:18 -0000
@@ -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: cp/method.c
--- cp/method.c 10 Apr 2004 14:44:14 -0000 1.281
+++ cp/method.c 19 May 2004 01:25:18 -0000
@@ -353,7 +353,7 @@ use_thunk (tree thunk_fndecl, bool emit_
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_
/* 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;