re PR middle-end/192 (String literals don't obey -fdata-sections)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 7 May 2015 15:51:01 +0000 (17:51 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 7 May 2015 15:51:01 +0000 (17:51 +0200)
PR middle-end/192
PR middle-end/54303
* varasm.c (function_mergeable_rodata_prefix): New function.
(mergeable_string_section): Use it.
(mergeable_constant_section): Use it.

gcc/testsuite/
* gcc.dg/fdata-sections-2.c: New file.

From-SVN: r222880

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fdata-sections-2.c [new file with mode: 0644]
gcc/varasm.c

index 78ba4b2eac3845dffa26d347e4d2eb2c5268cc71..500f537d8456978516b58da542baed6c67c48721 100644 (file)
@@ -1,3 +1,11 @@
+2015-05-07  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR middle-end/192
+       PR middle-end/54303
+       * varasm.c (function_mergeable_rodata_prefix): New function.
+       (mergeable_string_section): Use it.
+       (mergeable_constant_section): Use it.
+
 2015-05-07  Jeff Law  <law@redhat.com>
 
        * match.pd (bit_and (plus/minus (convert @0) (convert @1) mask): New
index 5d2b0a9267ac428f9daada536c5c6cf8c9c7a1eb..1bacc3e6d8e20005b72277bd74e717dbadbec05f 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-07  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR middle-end/192
+       PR middle-end/54303
+       * gcc.dg/fdata-sections-2.c: New file.
+
 2015-05-07  Marek Polacek  <polacek@redhat.com>
 
        PR testsuite/66046
diff --git a/gcc/testsuite/gcc.dg/fdata-sections-2.c b/gcc/testsuite/gcc.dg/fdata-sections-2.c
new file mode 100644 (file)
index 0000000..dda90ba
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR middle-end/192 */
+/* PR middle-end/54303 */
+
+/* This checks that string constants are put in per-function rodata
+   sections, so that they can be garbage collected.  */
+
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O -ffunction-sections -fdata-sections" } */
+
+const char *f1(void) { return "falderalde"; }
+const char *f2(void) { return "a"; }
+const char *f3(void) { return "falderalde"; }
+const char *f4(void) { return "eralde"; }
+
+/* { dg-final { scan-assembler {\.rodata\.f1\.str} } } */
+/* { dg-final { scan-assembler {\.rodata\.f2\.str} } } */
+/* { dg-final { scan-assembler-not {\.rodata\.f3\.str} } } */
+/* { dg-final { scan-assembler {\.rodata\.f4\.str} } } */
index 62d516303c21dc0359f5bafb05b06015c7f6285b..11cb2c5ee209275b6816698543d2503355c9c105 100644 (file)
@@ -783,6 +783,18 @@ default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
   return readonly_data_section;
 }
 
+/* A subroutine of mergeable_string_section and mergeable_constant_section.  */
+
+static const char *
+function_mergeable_rodata_prefix (void)
+{
+  section *s = targetm.asm_out.function_rodata_section (current_function_decl);
+  if (SECTION_STYLE (s) == SECTION_NAMED)
+    return s->named.name;
+  else
+    return targetm.asm_out.mergeable_rodata_prefix;
+}
+
 /* Return the section to use for string merging.  */
 
 static section *
@@ -804,7 +816,7 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
       const char *str;
       HOST_WIDE_INT i;
       int j, unit;
-      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
+      const char *prefix = function_mergeable_rodata_prefix ();
       char *name = (char *) alloca (strlen (prefix) + 30);
 
       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
@@ -857,7 +869,7 @@ mergeable_constant_section (machine_mode mode ATTRIBUTE_UNUSED,
       && align <= 256
       && (align & (align - 1)) == 0)
     {
-      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
+      const char *prefix = function_mergeable_rodata_prefix ();
       char *name = (char *) alloca (strlen (prefix) + 30);
 
       sprintf (name, "%s.cst%d", prefix, (int) (align / 8));