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 09:53:44 -0700 |
commit | ac4ec9009838c2d4bfaa1dff102dcd8e8efbf153 (patch) | |
tree | a4b59116fe1ff7509f86dfe2bc464b324d10018d | |
parent | 1bef2c185530fef303fea833d257ebf363285a0a (diff) | |
download | gcc-hjl/indbr/master.tar.gz |
Put local/global relocs in ro section for -fno-plthjl/indbr/master
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 82aed283882..91171db635b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9935,6 +9935,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 * @@ -52805,6 +52816,13 @@ ix86_operands_ok_for_move_multiple (rtx *operands, bool load, #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" } } */ |