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-10-20 12:13:53 -0700 |
commit | a013bbe67f8a7062f717c93abbc713a33e07738c (patch) | |
tree | a12c750568ba477882a710a08a274076f37ec56d | |
parent | 2189fda46b7623c9ee8ff1f391fe7d1c6e08d79e (diff) | |
download | gcc-hjl/got/master.tar.gz |
Put local/global relocs in rw section for -freloc-rwhjl/got/master
Add an option, -freloc-rw, to put local and global relocations in a
read-write section.
gcc/
PR target/67400
* common.opt (freloc-rw): New option.
* targhooks.c (default_reloc_rw_mask): Return 3 for -freloc-rw.
gcc/testsuite/
PR target/67400
* gcc.target/i386/pr67400-5.c: New test.
* gcc.target/i386/pr67400-6.c: Likewise.
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/targhooks.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr67400-5.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr67400-6.c | 11 |
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/common.opt b/gcc/common.opt index 5bbf6190ec7..875dabec6cd 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2619,6 +2619,10 @@ fzero-initialized-in-bss Common Report Var(flag_zero_initialized_in_bss) Init(1) Put zero initialized data in the bss section +freloc-rw +Common Report Var(flag_reloc_rw) Init(0) +Put local and global relocations in a read-write section. + g Common JoinedOrMissing Generate debug information in default format diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 5077ec97de1..e2da61e9db5 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1019,7 +1019,7 @@ default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED, int default_reloc_rw_mask (void) { - return flag_pic ? 3 : 0; + return (flag_pic || flag_reloc_rw) ? 3 : 0; } /* By default, do no modification. */ 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..d3d602aba15 --- /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 -freloc-rw" } */ + +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..90ed3c43c86 --- /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 -freloc-rw" } */ + +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" } } */ |