mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 03:30:27 +08:00
* 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. From-SVN: r82015
This commit is contained in:
parent
5b200ac2c7
commit
bb9a388dad
@ -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>
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
143
gcc/cgraph.c
143
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. */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
30
gcc/varasm.c
30
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user