This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, avr] Fix PR 50739 - nameless error with -fmerge-all-constants


Senthil Kumar Selvaraj writes:

> 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
>

Added missing description in Changelog entry.

gcc/testsuite/ChangeLog:

2016-07-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>

	PR target/50739	
	* gcc.target/avr/pr50739.c: New test.


gcc/ChangeLog:

2016-07-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>

	PR target/50739	
	* config/avr/avr.c (avr_asm_select_section): Strip off
	SECTION_DECLARED from flags when calling get_section.

Regards
Senthil

>
> gcc/testsuite/ChangeLog:
>
> 2016-07-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
>
> 	PR target/50739	
> 	* gcc.target/avr/pr50739.c: New test.
>
>
> gcc/ChangeLog:
>
> 2016-07-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@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";


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]