diff options
Diffstat (limited to 'gcc-4.9/gcc/symtab.c')
-rw-r--r-- | gcc-4.9/gcc/symtab.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/gcc-4.9/gcc/symtab.c b/gcc-4.9/gcc/symtab.c index 4db4870fa..c9b091180 100644 --- a/gcc-4.9/gcc/symtab.c +++ b/gcc-4.9/gcc/symtab.c @@ -92,7 +92,7 @@ eq_node (const void *p1, const void *p2) /* Hash asmnames ignoring the user specified marks. */ -static hashval_t +hashval_t decl_assembler_name_hash (const_tree asmname) { if (IDENTIFIER_POINTER (asmname)[0] == '*') @@ -123,7 +123,7 @@ hash_node_by_assembler_name (const void *p) /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */ -static bool +bool decl_assembler_name_equal (tree decl, const_tree asmname) { tree decl_asmname = DECL_ASSEMBLER_NAME (decl); @@ -189,7 +189,7 @@ eq_assembler_name (const void *p1, const void *p2) /* Insert NODE to assembler name hash. */ -static void +void insert_to_assembler_name_hash (symtab_node *node, bool with_clones) { if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->decl)) @@ -225,7 +225,7 @@ insert_to_assembler_name_hash (symtab_node *node, bool with_clones) /* Remove NODE from assembler name hash. */ -static void +void unlink_from_assembler_name_hash (symtab_node *node, bool with_clones) { if (assembler_name_hash) @@ -323,16 +323,11 @@ symtab_insert_node_to_hashtable (symtab_node *node) *slot = node; } -/* Remove node from symbol table. This function is not used directly, but via - cgraph/varpool node removal routines. */ +/* Remove NODE from same comdat group. */ void -symtab_unregister_node (symtab_node *node) +symtab_remove_from_same_comdat_group (symtab_node *node) { - void **slot; - ipa_remove_all_references (&node->ref_list); - ipa_remove_all_referring (&node->ref_list); - if (node->same_comdat_group) { symtab_node *prev; @@ -346,6 +341,19 @@ symtab_unregister_node (symtab_node *node) prev->same_comdat_group = node->same_comdat_group; node->same_comdat_group = NULL; } +} + +/* Remove node from symbol table. This function is not used directly, but via + cgraph/varpool node removal routines. */ + +void +symtab_unregister_node (symtab_node *node) +{ + void **slot; + ipa_remove_all_references (&node->ref_list); + ipa_remove_all_referring (&node->ref_list); + + symtab_remove_from_same_comdat_group (node); if (node->previous) node->previous->next = node->next; @@ -829,6 +837,16 @@ verify_symtab_base (symtab_node *node) error ("non-DECL_ONE_ONLY node in a same_comdat_group list"); error_found = true; } + if (DECL_COMDAT_GROUP (n->decl) != DECL_COMDAT_GROUP (node->same_comdat_group->decl)) + { + error ("same_comdat_group list across different groups"); + error_found = true; + } + if (!n->definition) + { + error ("Node has same_comdat_group but it is not a definition"); + error_found = true; + } if (n->type != node->type) { error ("mixing different types of symbol in same comdat groups is not supported"); |