aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-10-18 20:23:26 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-10-18 18:23:26 +0000
commit7ba6eb1e5cca6b0da36fa791d1f6d7ab68cc12a2 (patch)
treebd299a6803bcee24bd4658236478e615f218c27f /gcc
parente426b47b65aca8b12aff9697e769c98c03af7691 (diff)
downloadgcc-7ba6eb1e5cca6b0da36fa791d1f6d7ab68cc12a2.zip
gcc-7ba6eb1e5cca6b0da36fa791d1f6d7ab68cc12a2.tar.gz
gcc-7ba6eb1e5cca6b0da36fa791d1f6d7ab68cc12a2.tar.bz2
ipa.c (cgraph_externally_visible_p, [...]): Revert accidental commit.
* ipa.c (cgraph_externally_visible_p, varpool_externally_visible_p, function_and_variable_visibility): Revert accidental commit. From-SVN: r165655
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa.c107
2 files changed, 29 insertions, 83 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2d8514c..677a1ac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-18 Jan Hubicka <jh@suse.cz>
+
+ * ipa.c (cgraph_externally_visible_p, varpool_externally_visible_p,
+ function_and_variable_visibility): Revert accidental commit.
+
2010-10-18 Nicola Pero <nicola.pero@meta-innovation.com>
Merge from 'apple/trunk' branch on FSF servers.
diff --git a/gcc/ipa.c b/gcc/ipa.c
index af71330..fccfb6a 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -593,7 +593,6 @@ ipa_discover_readonly_nonaddressable_vars (void)
static bool
cgraph_externally_visible_p (struct cgraph_node *node, bool whole_program, bool aliased)
{
- struct cgraph_node *alias;
if (!node->local.finalized)
return false;
if (!DECL_COMDAT (node->decl)
@@ -608,23 +607,6 @@ cgraph_externally_visible_p (struct cgraph_node *node, bool whole_program, bool
/* If linker counts on us, we must preserve the function. */
if (cgraph_used_from_object_file_p (node))
return true;
- if (DECL_PRESERVE_P (node->decl))
- return true;
- if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (node->decl)))
- return true;
-
- /* See if we have linker information about symbol not being used or
- if we need to make guess based on the declaration.
-
- Even if the linker clams the symbol is unused, never bring internal
- symbols that are declared by user as used or externally visible.
- This is needed for i.e. references from asm statements. */
- for (alias = node->same_body; alias; alias = alias->next)
- if (alias->resolution != LDPR_PREVAILING_DEF_IRONLY)
- break;
- if (!alias && node->resolution == LDPR_PREVAILING_DEF_IRONLY)
- return false;
-
/* When doing link time optimizations, hidden symbols become local. */
if (in_lto_p
&& (DECL_VISIBILITY (node->decl) == VISIBILITY_HIDDEN
@@ -656,70 +638,11 @@ cgraph_externally_visible_p (struct cgraph_node *node, bool whole_program, bool
return true;
}
}
-
- if (MAIN_NAME_P (DECL_NAME (node->decl)))
- return true;
-
- return false;
-}
-
-/* Return true when variable VNODE should be considered externally visible. */
-
-static bool
-varpool_externally_visible_p (struct varpool_node *vnode, bool aliased)
-{
- struct varpool_node *alias;
- if (!DECL_COMDAT (vnode->decl) && !TREE_PUBLIC (vnode->decl))
- return false;
-
- /* Do not even try to be smart about aliased nodes. Until we properly
- represent everything by same body alias, these are just evil. */
- if (aliased)
- return true;
-
- /* If linker counts on us, we must preserve the function. */
- if (varpool_used_from_object_file_p (vnode))
- return true;
-
- if (DECL_PRESERVE_P (vnode->decl))
- return true;
- if (lookup_attribute ("externally_visible",
- DECL_ATTRIBUTES (vnode->decl)))
- return true;
-
- /* See if we have linker information about symbol not being used or
- if we need to make guess based on the declaration.
-
- Even if the linker clams the symbol is unused, never bring internal
- symbols that are declared by user as used or externally visible.
- This is needed for i.e. references from asm statements. */
- if (varpool_used_from_object_file_p (vnode))
+ if (DECL_PRESERVE_P (node->decl))
return true;
- for (alias = vnode->extra_name; alias; alias = alias->next)
- if (alias->resolution != LDPR_PREVAILING_DEF_IRONLY)
- break;
- if (!alias && vnode->resolution == LDPR_PREVAILING_DEF_IRONLY)
- return false;
-
- /* When doing link time optimizations, hidden symbols become local. */
- if (in_lto_p
- && (DECL_VISIBILITY (vnode->decl) == VISIBILITY_HIDDEN
- || DECL_VISIBILITY (vnode->decl) == VISIBILITY_INTERNAL)
- /* Be sure that node is defined in IR file, not in other object
- file. In that case we don't set used_from_other_object_file. */
- && vnode->finalized)
- ;
- else if (!flag_whole_program)
+ if (MAIN_NAME_P (DECL_NAME (node->decl)))
return true;
-
- /* Do not attempt to privatize COMDATS by default.
- This would break linking with C++ libraries sharing
- inline definitions.
-
- FIXME: We can do so for readonly vars with no address taken and
- possibly also for vtables since no direct pointer comparsion is done.
- It might be interesting to do so to reduce linking overhead. */
- if (DECL_COMDAT (vnode->decl) || DECL_WEAK (vnode->decl))
+ if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (node->decl)))
return true;
return false;
}
@@ -875,9 +798,27 @@ function_and_variable_visibility (bool whole_program)
if (!vnode->finalized)
continue;
if (vnode->needed
- && varpool_externally_visible_p
- (vnode,
- pointer_set_contains (aliased_vnodes, vnode)))
+ && (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl))
+ && (((!whole_program
+ /* We can privatize comdat readonly variables whose address is
+ not taken, but doing so is not going to bring us
+ optimization oppurtunities until we start reordering
+ datastructures. */
+ || DECL_COMDAT (vnode->decl)
+ || DECL_WEAK (vnode->decl))
+ /* When doing linktime optimizations, all hidden symbols will
+ become local. */
+ && (!in_lto_p
+ || (DECL_VISIBILITY (vnode->decl) != VISIBILITY_HIDDEN
+ && DECL_VISIBILITY (vnode->decl) != VISIBILITY_INTERNAL)
+ /* We can get prevailing decision in other object file.
+ In this case we do not sed used_from_object_file. */
+ || !vnode->finalized))
+ || DECL_PRESERVE_P (vnode->decl)
+ || varpool_used_from_object_file_p (vnode)
+ || pointer_set_contains (aliased_vnodes, vnode)
+ || lookup_attribute ("externally_visible",
+ DECL_ATTRIBUTES (vnode->decl))))
vnode->externally_visible = true;
else
vnode->externally_visible = false;