aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-06-13 12:00:04 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-06-13 10:00:04 +0000
commite5b962d0ccb213b6ad1f2ba4d6a0b84c9e94b046 (patch)
tree56d91bbff9c3f0ae370755a4ad8ff8b876842047
parenta8355e51785ca09eadc0e56afd0778c4ce076e2f (diff)
downloadgcc-e5b962d0ccb213b6ad1f2ba4d6a0b84c9e94b046.zip
gcc-e5b962d0ccb213b6ad1f2ba4d6a0b84c9e94b046.tar.gz
gcc-e5b962d0ccb213b6ad1f2ba4d6a0b84c9e94b046.tar.bz2
ipa.c (cgraph_externally_visible_p, [...]): Local comdats are not externally visible.
* ipa.c (cgraph_externally_visible_p, varpool_externally_visible_p): Local comdats are not externally visible. * symtab.c (dump_symtab_base): Dump externally visible. (verify_symtab_base): Verify back links in the symtab hash. From-SVN: r200064
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa.c7
-rw-r--r--gcc/symtab.c11
3 files changed, 21 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 587c9b1..c374686 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-06-13 Jan Hubicka <jh@suse.cz>
+
+ * ipa.c (cgraph_externally_visible_p, varpool_externally_visible_p):
+ Local comdats are not externally visible.
+ * symtab.c (dump_symtab_base): Dump externally visible.
+ (verify_symtab_base): Verify back links in the symtab hash.
+
2013-06-13 Bin Cheng <bin.cheng@arm.com>
* fold-const.c (operand_equal_p): Consider NOP_EXPR and
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 98a7b07..0f2a5c8 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -606,9 +606,8 @@ cgraph_externally_visible_p (struct cgraph_node *node,
{
if (!node->symbol.definition)
return false;
- if (!DECL_COMDAT (node->symbol.decl)
- && (!TREE_PUBLIC (node->symbol.decl)
- || DECL_EXTERNAL (node->symbol.decl)))
+ if (!TREE_PUBLIC (node->symbol.decl)
+ || DECL_EXTERNAL (node->symbol.decl))
return false;
/* Do not try to localize built-in functions yet. One of problems is that we
@@ -667,7 +666,7 @@ varpool_externally_visible_p (struct varpool_node *vnode)
if (DECL_EXTERNAL (vnode->symbol.decl))
return true;
- if (!DECL_COMDAT (vnode->symbol.decl) && !TREE_PUBLIC (vnode->symbol.decl))
+ if (!TREE_PUBLIC (vnode->symbol.decl))
return false;
/* If linker counts on us, we must preserve the function. */
diff --git a/gcc/symtab.c b/gcc/symtab.c
index c9f32d5..85d47a8 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -508,6 +508,8 @@ dump_symtab_base (FILE *f, symtab_node node)
fprintf (f, " force_output");
if (node->symbol.forced_by_abi)
fprintf (f, " forced_by_abi");
+ if (node->symbol.externally_visible)
+ fprintf (f, " externally_visible");
if (node->symbol.resolution != LDPR_UNKNOWN)
fprintf (f, " %s",
ld_plugin_symbol_resolution_names[(int)node->symbol.resolution]);
@@ -655,6 +657,15 @@ verify_symtab_base (symtab_node node)
error ("node not found in symtab decl hashtable");
error_found = true;
}
+ if (hashed_node != node
+ && (!is_a <cgraph_node> (node)
+ || !dyn_cast <cgraph_node> (node)->clone_of
+ || dyn_cast <cgraph_node> (node)->clone_of->symbol.decl
+ != node->symbol.decl))
+ {
+ error ("node differs from symtab decl hashtable");
+ error_found = true;
+ }
}
if (assembler_name_hash)
{