diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2015-05-07 17:51:01 +0200 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2015-05-07 17:51:01 +0200 |
commit | a3facd7c6cdc2d72a001603170a1602743b11803 (patch) | |
tree | c237d1d086b2ff3ac3a26e02f820dd718ddab7e9 /gcc | |
parent | 302f83f948e4bf516488f6d4a293251824b84fda (diff) | |
download | gcc-a3facd7c6cdc2d72a001603170a1602743b11803.zip gcc-a3facd7c6cdc2d72a001603170a1602743b11803.tar.gz gcc-a3facd7c6cdc2d72a001603170a1602743b11803.tar.bz2 |
re PR middle-end/192 (String literals don't obey -fdata-sections)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fdata-sections-2.c | 18 | ||||
-rw-r--r-- | gcc/varasm.c | 16 |
4 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78ba4b2..500f537 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5d2b0a9..1bacc3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..dda90ba7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fdata-sections-2.c @@ -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} } } */ diff --git a/gcc/varasm.c b/gcc/varasm.c index 62d5163..11cb2c5 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -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)); |