diff options
-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" } } */ |