From c42c09fc413309bbf59e34f95f48071a9e739275 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Sat, 5 Feb 2011 21:35:16 +0100
Subject: [PATCH] re PR middle-end/47610 (cp-demangle.c:1970:1: error:
 cplus_demangle_builtin_types causes a section type conflict)

	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.

From-SVN: r169855
---
 gcc/ChangeLog                  | 7 +++++++
 gcc/testsuite/ChangeLog        | 5 +++++
 gcc/testsuite/gcc.dg/pr47610.c | 8 ++++++++
 gcc/varasm.c                   | 7 ++++++-
 4 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr47610.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de08bab31e92..ecabe7c33564 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 89053c20e6df..61110da51f24 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 000000000000..906af74f9207
--- /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 3a9fbae59011..76675cdeb0d6 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;
-- 
GitLab