summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-08-31 09:37:50 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-08-31 09:53:44 -0700
commitac4ec9009838c2d4bfaa1dff102dcd8e8efbf153 (patch)
treea4b59116fe1ff7509f86dfe2bc464b324d10018d
parent1bef2c185530fef303fea833d257ebf363285a0a (diff)
downloadgcc-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.c18
-rw-r--r--gcc/testsuite/gcc.target/i386/pr67400-5.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr67400-6.c11
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" } } */