Warn used and not used symbols in section with the same name

When SECTION_RETAIN is used, issue a warning when a symbol without used
attribute and a symbol with used attribute are placed in the section with
the same name, like

int __attribute__((used,section(".data.foo"))) foo2 = 2;
int __attribute__((section(".data.foo"))) foo1 = 1;

since assembler will put them in different sections with the same section
name.

gcc/

	PR target/98146
	* varasm.c (switch_to_section): Warn when a symbol without used
	attribute and a symbol with used attribute are placed in the
	section with the same name.

gcc/testsuite/

	PR target/98146
	* c-c++-common/attr-used-5.c: Updated.
	* c-c++-common/attr-used-6.c: Likewise.
	* c-c++-common/attr-used-7.c: Likewise.
	* c-c++-common/attr-used-8.c: Likewise.
This commit is contained in:
H.J. Lu 2020-12-03 15:39:59 -08:00
parent 6175383249
commit 2a97602060
5 changed files with 23 additions and 3 deletions

View File

@ -10,6 +10,7 @@ extern struct dtv_slotinfo_list *list;
static int __attribute__ ((section ("__libc_freeres_fn")))
free_slotinfo (struct dtv_slotinfo_list **elemp)
/* { dg-warning "'.*' without 'used' attribute and '.*' with 'used' attribute are placed in a section with the same name" "" { target R_flag_in_section } .-1 } */
{
if (!free_slotinfo (&(*elemp)->next))
return 0;

View File

@ -18,6 +18,7 @@ free_slotinfo (struct dtv_slotinfo_list **elemp)
__attribute__ ((section ("__libc_freeres_fn")))
void free_mem (void)
/* { dg-warning "'.*' without 'used' attribute and '.*' with 'used' attribute are placed in a section with the same name" "" { target R_flag_in_section } .-1 } */
{
free_slotinfo (&list);
}

View File

@ -3,6 +3,7 @@
int __attribute__((used,section(".data.foo"))) foo2 = 2;
int __attribute__((section(".data.foo"))) foo1 = 1;
/* { dg-warning "'.*' without 'used' attribute and '.*' with 'used' attribute are placed in a section with the same name" "" { target R_flag_in_section } .-1 } */
/* { dg-final { scan-assembler ".data.foo,\"aw\"" { target R_flag_in_section } } } */
/* { dg-final { scan-assembler ".data.foo,\"awR\"" { target R_flag_in_section } } } */

View File

@ -2,6 +2,7 @@
/* { dg-options "-Wall -O2" } */
int __attribute__((section(".data.foo"))) foo1 = 1;
/* { dg-warning "'.*' without 'used' attribute and '.*' with 'used' attribute are placed in a section with the same name" "" { target R_flag_in_section } .-1 } */
int __attribute__((used,section(".data.foo"))) foo2 = 2;
/* { dg-final { scan-assembler ".data.foo,\"aw\"" { target R_flag_in_section } } } */

View File

@ -7765,11 +7765,27 @@ switch_to_section (section *new_section, tree decl)
{
/* If the SECTION_RETAIN bit doesn't match, switch to a new
section. */
tree used_decl, no_used_decl;
if (DECL_PRESERVE_P (decl))
new_section->common.flags |= SECTION_RETAIN;
{
new_section->common.flags |= SECTION_RETAIN;
used_decl = decl;
no_used_decl = new_section->named.decl;
}
else
new_section->common.flags &= ~(SECTION_RETAIN
| SECTION_DECLARED);
{
new_section->common.flags &= ~(SECTION_RETAIN
| SECTION_DECLARED);
used_decl = new_section->named.decl;
no_used_decl = decl;
}
warning (OPT_Wattributes,
"%+qD without %<used%> attribute and %qD with "
"%<used%> attribute are placed in a section with "
"the same name", no_used_decl, used_decl);
inform (DECL_SOURCE_LOCATION (used_decl),
"%qD was declared here", used_decl);
}
else
return;