aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2015-03-27 18:11:00 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2015-03-27 11:11:00 -0700
commita5eef8e9b024741b8d661c628643a9850616b813 (patch)
tree6f1f7fb2c72bb99e77499fa0b962b812dcc32188 /gcc/varasm.c
parentf21a589997d17031e4d5169e7ef24f10d59c9530 (diff)
downloadgcc-a5eef8e9b024741b8d661c628643a9850616b813.zip
gcc-a5eef8e9b024741b8d661c628643a9850616b813.tar.gz
gcc-a5eef8e9b024741b8d661c628643a9850616b813.tar.bz2
Add default_binds_local_p_2 and use it for x86
Protected data symbol means that it can't be pre-emptied. It doesn't mean its address won't be external. This is true for pointer to protected function. With copy relocation, address of protected data defined in the shared library may also be external. We only know that for sure at run-time. TARGET_BINDS_LOCAL_P should return false on protected data symbol. gcc/ PR target/65248 * output.h (default_binds_local_p_2): New. * varasm.c (default_binds_local_p_2): Renamed to ... (default_binds_local_p_3): This. Don't return true on protected data symbol if protected data may be external. (default_binds_local_p): Use default_binds_local_p_3. (default_binds_local_p_1): Likewise. (default_binds_local_p_2): New. * config/i386/i386.c (TARGET_BINDS_LOCAL_P): Set to default_binds_local_p_2 if TARGET_MACHO is undefined. gcc/testsuite/ PR target/65248 * gcc.target/i386/pr65248-1.c: New file. * gcc.target/i386/pr65248-2.c: Likewise. * gcc.target/i386/pr65248-3.c: Likewise. * gcc.target/i386/pr65248-4.c: Likewise. From-SVN: r221742
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 752dccf..537a64d 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -6809,7 +6809,8 @@ resolution_local_p (enum ld_plugin_symbol_resolution resolution)
}
static bool
-default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate)
+default_binds_local_p_3 (const_tree exp, bool shlib, bool weak_dominate,
+ bool extern_protected_data)
{
/* A non-decl is an entry in the constant pool. */
if (!DECL_P (exp))
@@ -6855,6 +6856,9 @@ default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate)
or if we have a definition for the symbol. We cannot infer visibility
for undefined symbols. */
if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT
+ && (TREE_CODE (exp) == FUNCTION_DECL
+ || !extern_protected_data
+ || DECL_VISIBILITY (exp) != VISIBILITY_PROTECTED)
&& (DECL_VISIBILITY_SPECIFIED (exp) || defined_locally))
return true;
@@ -6890,13 +6894,21 @@ default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate)
bool
default_binds_local_p (const_tree exp)
{
- return default_binds_local_p_2 (exp, flag_shlib != 0, true);
+ return default_binds_local_p_3 (exp, flag_shlib != 0, true, false);
+}
+
+/* Similar to default_binds_local_p, but protected data may be
+ external. */
+bool
+default_binds_local_p_2 (const_tree exp)
+{
+ return default_binds_local_p_3 (exp, flag_shlib != 0, true, true);
}
bool
default_binds_local_p_1 (const_tree exp, int shlib)
{
- return default_binds_local_p_2 (exp, shlib != 0, false);
+ return default_binds_local_p_3 (exp, shlib != 0, false, false);
}
/* Return true when references to DECL must bind to current definition in