diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-31 09:37:50 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-31 12:48:02 -0700 |
commit | 05be23eaef08a560f3a56dbe130f6b6eef1084cf (patch) | |
tree | 2256c5937f2a99b3cd354cc81b0e72e78fdaf4b2 | |
parent | 2f7e7c8b0a4a3237329fd5b3ddd44d80fad0f0a4 (diff) | |
download | gcc-hjl/indbr/gcc-5-branch.tar.gz |
Put local/global relocs in ro section for -fno-plthjl/indbr/gcc-5-branch
We should place local and global relocs are always placed into readonly
memory when -fno-plt is used.
gcc/
PR target/67400
* config/i386/i386.c (ix86_reloc_rw_mask): New function.
(TARGET_ASM_RELOC_RW_MASK): New.
gcc/testsuite/
PR target/67400
* gcc.target/i386/pr67400-5.c: New test.
* gcc.target/i386/pr67400-6.c: Likewise.
-rw-r--r-- | gcc/config/i386/i386.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr67400-5.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr67400-6.c | 11 |
3 files changed, 40 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b8beb061274..deacdd153cd 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9832,6 +9832,17 @@ ix86_code_end (void) file_end_indicate_split_stack (); } +#if !TARGET_PECOFF && !TARGET_MACHO +/* Local and global relocs are always placed into readonly memory when + -fno-plt is used. */ + +static int +ix86_reloc_rw_mask (void) +{ + return (flag_pic || !flag_plt) ? 3 : 0; +} +#endif + /* Emit code for the SET_GOT patterns. */ const char * @@ -52524,6 +52535,13 @@ ix86_binds_local_p (const_tree exp) #undef TARGET_ASM_CODE_END #define TARGET_ASM_CODE_END ix86_code_end +#if !TARGET_PECOFF && !TARGET_MACHO +/* Local and global relocs can be placed always into readonly memory + when -fno-plt is used. */ +#undef TARGET_ASM_RELOC_RW_MASK +#define TARGET_ASM_RELOC_RW_MASK ix86_reloc_rw_mask +#endif + #undef TARGET_CONDITIONAL_REGISTER_USAGE #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage diff --git a/gcc/testsuite/gcc.target/i386/pr67400-5.c b/gcc/testsuite/gcc.target/i386/pr67400-5.c new file mode 100644 index 00000000000..91410cd44d6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67400-5.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fno-pic -fno-plt" } */ + +extern void foo (void); + +typedef void (*func_p) (void); + +const func_p p1 = &foo; + +/* { dg-final { scan-assembler ".data.rel.ro" } } */ +/* { dg-final { scan-assembler-not ".rodata" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr67400-6.c b/gcc/testsuite/gcc.target/i386/pr67400-6.c new file mode 100644 index 00000000000..0d4534cf357 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67400-6.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O2 -fno-pic -fno-plt" } */ + +extern void foo (void); + +typedef void (*func_p) (void); + +const func_p p1 __attribute__((visibility("hidden"))) = &foo; + +/* { dg-final { scan-assembler ".data.rel.ro" } } */ +/* { dg-final { scan-assembler-not ".rodata" } } */ |