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 12:48:02 -0700
commit05be23eaef08a560f3a56dbe130f6b6eef1084cf (patch)
tree2256c5937f2a99b3cd354cc81b0e72e78fdaf4b2
parent2f7e7c8b0a4a3237329fd5b3ddd44d80fad0f0a4 (diff)
downloadgcc-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.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 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" } } */