mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-24 03:14:08 +08:00
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:
parent
6175383249
commit
2a97602060
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 } } } */
|
||||
|
@ -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 } } } */
|
||||
|
22
gcc/varasm.c
22
gcc/varasm.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user