[avr,committed] PR target/53372: Don't ignore section attribute with address-space

Message ID 69673087-0686-4642-adaf-70d40c08db6c@gjlay.de
State Accepted
Headers
Series [avr,committed] PR target/53372: Don't ignore section attribute with address-space |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Georg-Johann Lay Nov. 17, 2023, 12:21 p.m. UTC
  The address-spaces locate data in their attaches sections like
.progmem.data; but that should only be done if the user did not
specify a section attribute.

Johann

--

PR target/53372: Don't ignore section attribute with address-space.

gcc/
	PR target/53372
	* config/avr/avr.cc (avr_asm_named_section) [AVR_SECTION_PROGMEM]:
	Only return some .progmem*.data section if the user did not
	specify a section attribute.
	(avr_section_type_flags) [avr_progmem_p]: Unset SECTION_NOTYPE
	in returned section flags.

gcc/testsuite/
	PR target/53372
	* gcc.target/avr/pr53372-1.c: New test.
	* gcc.target/avr/pr53372-2.c: New test.
  

Patch

diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 5e0217de36f..c3e0995dfc3 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -10873,7 +10873,12 @@  avr_asm_init_sections (void)
 static void
 avr_asm_named_section (const char *name, unsigned int flags, tree decl)
 {
-  if (flags & AVR_SECTION_PROGMEM)
+  if (flags & AVR_SECTION_PROGMEM
+      // Only use section .progmem*.data if there is no attribute section.
+      && ! (decl
+	    && DECL_SECTION_NAME (decl)
+	    && symtab_node::get (decl)
+	    && ! symtab_node::get (decl)->implicit_section))
     {
       addr_space_t as = (flags & AVR_SECTION_PROGMEM) / SECTION_MACH_DEP;
       const char *old_prefix = ".rodata";
@@ -10942,6 +10947,7 @@  avr_section_type_flags (tree decl, const char *name, int reloc)
       flags |= as * SECTION_MACH_DEP;
       flags &= ~SECTION_WRITE;
       flags &= ~SECTION_BSS;
+      flags &= ~SECTION_NOTYPE;
     }
 
   return flags;
diff --git a/gcc/testsuite/gcc.target/avr/pr53372-1.c b/gcc/testsuite/gcc.target/avr/pr53372-1.c
new file mode 100644
index 00000000000..7d3f193e79a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/pr53372-1.c
@@ -0,0 +1,10 @@ 
+/* { dg-do compile { target { ! avr_tiny } } } */
+/* { dg-options "-std=gnu99" } */
+
+__attribute__((__section__("fffsection")))
+const __flash char fff = 123;
+
+const __flash char ppp = 124;
+
+/* { dg-final { scan-assembler ".section	fffsection,\"a\",@progbits" } } */
+/* { dg-final { scan-assembler ".section	.progmem.data,\"a\",@progbits" } } */
diff --git a/gcc/testsuite/gcc.target/avr/pr53372-2.c b/gcc/testsuite/gcc.target/avr/pr53372-2.c
new file mode 100644
index 00000000000..79ef2b7bbdb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/pr53372-2.c
@@ -0,0 +1,10 @@ 
+/* { dg-do compile { target { ! avr_tiny } } } */
+/* { dg-options "-std=gnu99 -fdata-sections" } */
+
+__attribute__((__section__("fffsection")))
+const __flash char fff = 123;
+
+const __flash char ppp = 124;
+
+/* { dg-final { scan-assembler ".section	fffsection,\"a\",@progbits" } } */
+/* { dg-final { scan-assembler ".section	.progmem.data.ppp,\"a\",@progbits" } } */