summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-05 20:35:16 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-05 20:35:16 +0000
commit77e2262852254963e5590d5712ba02021c61c9ac (patch)
tree84631ddec5c254cfb91584af8ddd1582c2014cfd /gcc
parent57f34440cbcb8cd80cb0f26fcbed68934cbaea45 (diff)
downloadgcc-77e2262852254963e5590d5712ba02021c61c9ac.tar.gz
PR middle-end/47610
* varasm.c (default_section_type_flags): If decl is NULL, and name is .data.rel.ro or .data.rel.ro.local, set SECTION_RELRO bit. * gcc.dg/pr47610.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169855 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr47610.c8
-rw-r--r--gcc/varasm.c7
4 files changed, 26 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de08bab31e9..ecabe7c3356 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/47610
+ * varasm.c (default_section_type_flags): If decl is NULL,
+ and name is .data.rel.ro or .data.rel.ro.local, set SECTION_RELRO
+ bit.
+
2011-02-05 Jie Zhang <jie@codesourcery.com>
PR debug/42631
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 89053c20e6d..61110da51f2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/47610
+ * gcc.dg/pr47610.c: New test.
+
2011-02-05 Jie Zhang <jie@codesourcery.com>
PR debug/42631
diff --git a/gcc/testsuite/gcc.dg/pr47610.c b/gcc/testsuite/gcc.dg/pr47610.c
new file mode 100644
index 00000000000..906af74f920
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr47610.c
@@ -0,0 +1,8 @@
+/* PR middle-end/47610 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic" { target fpic } } */
+struct S { const char *s; };
+const struct S s[] = { "s" };
+extern void foo (void (*) (void));
+static void bar (void) {}
+void baz () { foo (bar); }
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 3a9fbae5901..76675cdeb0d 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -6060,7 +6060,12 @@ default_section_type_flags (tree decl, const char *name, int reloc)
flags = SECTION_WRITE;
}
else
- flags = SECTION_WRITE;
+ {
+ flags = SECTION_WRITE;
+ if (strcmp (name, ".data.rel.ro") == 0
+ || strcmp (name, ".data.rel.ro.local") == 0)
+ flags |= SECTION_RELRO;
+ }
if (decl && DECL_ONE_ONLY (decl))
flags |= SECTION_LINKONCE;