From ac4ec9009838c2d4bfaa1dff102dcd8e8efbf153 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 31 Aug 2015 09:37:50 -0700 Subject: Put local/global relocs in ro section for -fno-plt 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. --- gcc/config/i386/i386.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr67400-5.c | 11 +++++++++++ gcc/testsuite/gcc.target/i386/pr67400-6.c | 11 +++++++++++ 3 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr67400-5.c create mode 100644 gcc/testsuite/gcc.target/i386/pr67400-6.c 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" } } */ -- cgit v1.2.1