aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/symtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/symtab.c')
-rw-r--r--gcc-4.9/gcc/symtab.c40
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");