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.
        * c-c++-common/attr-used-9.c: Likewise.
---
 gcc/testsuite/c-c++-common/attr-used-5.c |  1 +
 gcc/testsuite/c-c++-common/attr-used-6.c |  1 +
 gcc/testsuite/c-c++-common/attr-used-7.c |  1 +
 gcc/testsuite/c-c++-common/attr-used-8.c |  1 +
 gcc/testsuite/c-c++-common/attr-used-9.c | 28 ++++++++++++++++++++++++
 gcc/varasm.c                             | 22 ++++++++++++++++---
 6 files changed, 51 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/attr-used-9.c

diff --git a/gcc/testsuite/c-c++-common/attr-used-5.c 
b/gcc/testsuite/c-c++-common/attr-used-5.c
index 9fc0d3834e9..38ca8ef83f3 100644
--- a/gcc/testsuite/c-c++-common/attr-used-5.c
+++ b/gcc/testsuite/c-c++-common/attr-used-5.c
@@ -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 *-*-* } .-1 } */
 {
   if (!free_slotinfo (&(*elemp)->next))
     return 0;
diff --git a/gcc/testsuite/c-c++-common/attr-used-6.c 
b/gcc/testsuite/c-c++-common/attr-used-6.c
index 0cb82ade5a9..a4800f6d0f1 100644
--- a/gcc/testsuite/c-c++-common/attr-used-6.c
+++ b/gcc/testsuite/c-c++-common/attr-used-6.c
@@ -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 *-*-* } .-1 } */
 {
   free_slotinfo (&list);
 }
diff --git a/gcc/testsuite/c-c++-common/attr-used-7.c 
b/gcc/testsuite/c-c++-common/attr-used-7.c
index fba2706ffc1..39923cdde33 100644
--- a/gcc/testsuite/c-c++-common/attr-used-7.c
+++ b/gcc/testsuite/c-c++-common/attr-used-7.c
@@ -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 *-*-* } .-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 
} } } */
diff --git a/gcc/testsuite/c-c++-common/attr-used-8.c 
b/gcc/testsuite/c-c++-common/attr-used-8.c
index 4da4aabe573..032cdd20901 100644
--- a/gcc/testsuite/c-c++-common/attr-used-8.c
+++ b/gcc/testsuite/c-c++-common/attr-used-8.c
@@ -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 *-*-* } .-1 } */
 int __attribute__((used,section(".data.foo"))) foo2 = 2;
 
 /* { dg-final { scan-assembler ".data.foo,\"aw\"" { target R_flag_in_section } 
} } */
diff --git a/gcc/testsuite/c-c++-common/attr-used-9.c 
b/gcc/testsuite/c-c++-common/attr-used-9.c
new file mode 100644
index 00000000000..502c768c813
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/attr-used-9.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall -O2" } */
+
+struct dtv_slotinfo_list
+{
+  struct dtv_slotinfo_list *next;
+};
+
+extern struct dtv_slotinfo_list *list;
+
+static int __attribute__ ((used, section ("__libc_freeres_fn")))
+free_slotinfo (struct dtv_slotinfo_list **elemp)
+{
+  if (!free_slotinfo (&(*elemp)->next))
+    return 0;
+  return 1;
+}
+
+__attribute__ ((section ("__libc_freeres_fn")))
+static void free_mem (void)
+/* { dg-warning "defined but not used" "" { target *-*-* } .-1 } */
+{
+  free_slotinfo (&list);
+}
+
+/* { dg-final { scan-assembler-not "__libc_freeres_fn,\"ax\"" } }*/
+/* { dg-final { scan-assembler-not "__libc_freeres_fn\n" } } */
+/* { dg-final { scan-assembler "__libc_freeres_fn,\"axR\"" { target 
R_flag_in_section } } } */
diff --git a/gcc/varasm.c b/gcc/varasm.c
index c85d39813ec..025e0fb32fe 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7731,11 +7731,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;
-- 
2.28.0

Reply via email to