diff options
| -rw-r--r-- | gcc/ChangeLog | 13 | ||||
| -rw-r--r-- | gcc/config/i386/i386.c | 3 | ||||
| -rw-r--r-- | gcc/output.h | 1 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/i386/pr65248-1.c | 17 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/i386/pr65248-2.c | 17 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/i386/pr65248-3.c | 17 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/i386/pr65248-4.c | 17 | ||||
| -rw-r--r-- | gcc/varasm.c | 18 |
9 files changed, 108 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0fb06d6..d8221f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-03-27 H.J. Lu <hongjiu.lu@intel.com> + + 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. + 2015-03-27 Jakub Jelinek <jakub@redhat.com> PR target/65593 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 862bda5..744642c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -51900,6 +51900,9 @@ ix86_initialize_bounds (tree var, tree lb, tree ub, tree *stmts) #if TARGET_MACHO #undef TARGET_BINDS_LOCAL_P #define TARGET_BINDS_LOCAL_P darwin_binds_local_p +#else +#undef TARGET_BINDS_LOCAL_P +#define TARGET_BINDS_LOCAL_P default_binds_local_p_2 #endif #if TARGET_DLLIMPORT_DECL_ATTRIBUTES #undef TARGET_BINDS_LOCAL_P diff --git a/gcc/output.h b/gcc/output.h index 217d979..53e47d0 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -586,6 +586,7 @@ extern void default_asm_output_anchor (rtx); extern bool default_use_anchors_for_symbol_p (const_rtx); extern bool default_binds_local_p (const_tree); extern bool default_binds_local_p_1 (const_tree, int); +extern bool default_binds_local_p_2 (const_tree); extern void default_globalize_label (FILE *, const char *); extern void default_globalize_decl_name (FILE *, tree); extern void default_emit_unwind_label (FILE *, tree, int, int); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4fb0e22..de043af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-03-27 H.J. Lu <hongjiu.lu@intel.com> + + 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. + 2015-03-27 Jakub Jelinek <jakub@redhat.com> PR target/65593 diff --git a/gcc/testsuite/gcc.target/i386/pr65248-1.c b/gcc/testsuite/gcc.target/i386/pr65248-1.c new file mode 100644 index 0000000..735adde --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr65248-1.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fpic" } */ + +/* Common symbol with -fpic. */ +__attribute__((visibility("protected"))) +int xxx; + +int +foo () +{ + return xxx; +} + +/* { dg-final { scan-assembler-not "xxx\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "xxx@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "xxx@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler "xxx@GOT\\(" { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr65248-2.c b/gcc/testsuite/gcc.target/i386/pr65248-2.c new file mode 100644 index 0000000..af264f3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr65248-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fpic" } */ + +/* Weak common symbol with -fpic. */ +__attribute__((weak, visibility("protected"))) +int xxx; + +int +foo () +{ + return xxx; +} + +/* { dg-final { scan-assembler-not "xxx\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "xxx@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "xxx@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler "xxx@GOT\\(" { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr65248-3.c b/gcc/testsuite/gcc.target/i386/pr65248-3.c new file mode 100644 index 0000000..e7a05ea --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr65248-3.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fpic" } */ + +/* Initialized symbol with -fpic. */ +__attribute__((visibility("protected"))) +int xxx = -1; + +int +foo () +{ + return xxx; +} + +/* { dg-final { scan-assembler-not "xxx\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "xxx@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "xxx@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler "xxx@GOT\\(" { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr65248-4.c b/gcc/testsuite/gcc.target/i386/pr65248-4.c new file mode 100644 index 0000000..db818fc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr65248-4.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fpic" } */ + +/* Weak initialized symbol with -fpic. */ +__attribute__((weak, visibility("protected"))) +int xxx = -1; + +int +foo () +{ + return xxx; +} + +/* { dg-final { scan-assembler-not "xxx\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "xxx@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "xxx@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler "xxx@GOT\\(" { target ia32 } } } */ 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 |
