Hi, This patch fixes a problem with fmerge-all-constants and the progmem attribute - on trunk, the below testcase errors out with a section conflict error.
When avr_asm_select_section renames .rodata.xyz section to .progmem.xyz and calls get_section, it passes in the same flags in sect. If the flags include SECTION_DECLARED, get_section barfs with a section conflict error - the section flag comparison logic strips off SECTION_DECLARED from existing section flags before comparing it with the new incoming flags. With -fmerge-all-constants, default_elf_select_section always returns .rodata.strx.x. varasm switches to that section when writing out the non progmem string literal, and that sets SECTION_DECLARED. The first call to get_section with the section name transformed to .progmem.data.strx.x then includes SECTION_DECLARED, but because this is a new section, the section flag conflict logic doesn't kick in. The second call to get_section, again including SECTION_DECLARED, triggers the section flag conflict logic and causes the error. Stripping off SECTION_DECLARED before calling get_section fixes the problem - the flag is supposed to be set by switch_section anyway. Reg testing showed no new regressions. Ok for trunk and backport to 6.x? Regards Senthil gcc/testsuite/ChangeLog: 2016-07-05 Senthil Kumar Selvaraj <senthil_kumar.selva...@atmel.com> PR target/50739 * gcc.target/avr/pr50739.c: New test. gcc/ChangeLog: 2016-07-05 Senthil Kumar Selvaraj <senthil_kumar.selva...@atmel.com> PR target/50739 * config/avr/avr.c (avr_asm_select_section): diff --git gcc/config/avr/avr.c gcc/config/avr/avr.c index 18ed766..9b7b392 100644 --- gcc/config/avr/avr.c +++ gcc/config/avr/avr.c @@ -9641,7 +9641,7 @@ avr_asm_select_section (tree decl, int reloc, unsigned HOST_WIDE_INT align) { const char *sname = ACONCAT ((new_prefix, name + strlen (old_prefix), NULL)); - return get_section (sname, sect->common.flags, sect->named.decl); + return get_section (sname, sect->common.flags & ~SECTION_DECLARED, sect->named.decl); } } diff --git gcc/testsuite/gcc.target/avr/pr50739.c gcc/testsuite/gcc.target/avr/pr50739.c new file mode 100644 index 0000000..a6850b7 --- /dev/null +++ gcc/testsuite/gcc.target/avr/pr50739.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-fmerge-all-constants" } */ + +char *ca = "123"; + +const char a[] __attribute__((__progmem__))= "a"; +const char b[] __attribute__((__progmem__))= "b"; -- 2.7.4