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/varasm.c | |
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/varasm.c')
-rw-r--r-- | gcc/varasm.c | 16 |
1 files changed, 14 insertions, 2 deletions
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)); |