avr.c (avr_asm_init_sections): Remove setup of progmem_swtable_section.
authorSenthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
Thu, 16 Jun 2016 16:50:40 +0000 (16:50 +0000)
committerDenis Chertykov <denisc@gcc.gnu.org>
Thu, 16 Jun 2016 16:50:40 +0000 (19:50 +0300)
gcc/ChangeLog:
        * config/avr/avr.c (avr_asm_init_sections): Remove setup of
progmem_swtable_section.
        (progmem_swtable_section): Remove.
        (avr_asm_function_rodata_section): Remove.
        (TARGET_ASM_FUNCTION_RODATA_SECTION): Remove.
        * config/avr/avr.h (JUMP_TABLES_IN_TEXT_SECTION: Define to 1.

gcc/testsuite/ChangeLog:
        * gcc.target/avr/pr71151-1.c: New test.
        * gcc.target/avr/pr71151-2.c: New test.
        * gcc.target/avr/pr71151-3.c: New test.
        * gcc.target/avr/pr71151-4.c: New test.
        * gcc.target/avr/pr71151-5.c: New test.
        * gcc.target/avr/pr71151-6.c: New test.
        * gcc.target/avr/pr71151-7.c: New test.
        * gcc.target/avr/pr71151-8.c: New test.
        * gcc.target/avr/pr71151-common.h: New test.

From-SVN: r237536

13 files changed:
gcc/ChangeLog
gcc/config/avr/avr.c
gcc/config/avr/avr.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/avr/pr71151-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/avr/pr71151-common.h [new file with mode: 0644]

index 5215b801a6b20b440841422b74c2c4cba508b167..eb0ca9117cb95b68a3042a564f6753fce083112b 100644 (file)
@@ -1,3 +1,12 @@
+2016-06-16  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       * config/avr/avr.c (avr_asm_init_sections): Remove setup of
+       progmem_swtable_section.
+       (progmem_swtable_section): Remove.
+       (avr_asm_function_rodata_section): Remove.
+       (TARGET_ASM_FUNCTION_RODATA_SECTION): Remove.
+       * config/avr/avr.h (JUMP_TABLES_IN_TEXT_SECTION: Define to 1.
+
 2016-06-16  Jocelyn Mayer  <l_indien@magic.fr>
 
        * config/i386/driver-i386.c (host_detect_local_cpu): Set
index b3276243902501ab9a38a14457c48e773e16f959..d13f4fddcd58b75e6fa4b9ac93b27b49f3d3aa4c 100644 (file)
@@ -203,9 +203,6 @@ static GTY(()) rtx xstring_e;
 /* Current architecture.  */
 const avr_arch_t *avr_arch;
 
-/* Section to put switch tables in.  */
-static GTY(()) section *progmem_swtable_section;
-
 /* Unnamed sections associated to __attribute__((progmem)) aka. PROGMEM
    or to address space __flash* or __memx.  Only used as singletons inside
    avr_asm_select_section, but it must not be local there because of GTY.  */
@@ -9461,24 +9458,6 @@ avr_output_progmem_section_asm_op (const void *data)
 static void
 avr_asm_init_sections (void)
 {
-  /* Set up a section for jump tables.  Alignment is handled by
-     ASM_OUTPUT_BEFORE_CASE_LABEL.  */
-
-  if (AVR_HAVE_JMP_CALL)
-    {
-      progmem_swtable_section
-        = get_unnamed_section (0, output_section_asm_op,
-                               "\t.section\t.progmem.gcc_sw_table"
-                               ",\"a\",@progbits");
-    }
-  else
-    {
-      progmem_swtable_section
-        = get_unnamed_section (SECTION_CODE, output_section_asm_op,
-                               "\t.section\t.progmem.gcc_sw_table"
-                               ",\"ax\",@progbits");
-    }
-
   /* Override section callbacks to keep track of `avr_need_clear_bss_p'
      resp. `avr_need_copy_data_p'.  */
 
@@ -9488,65 +9467,6 @@ avr_asm_init_sections (void)
 }
 
 
-/* Implement `TARGET_ASM_FUNCTION_RODATA_SECTION'.  */
-
-static section*
-avr_asm_function_rodata_section (tree decl)
-{
-  /* If a function is unused and optimized out by -ffunction-sections
-     and --gc-sections, ensure that the same will happen for its jump
-     tables by putting them into individual sections.  */
-
-  unsigned int flags;
-  section * frodata;
-
-  /* Get the frodata section from the default function in varasm.c
-     but treat function-associated data-like jump tables as code
-     rather than as user defined data.  AVR has no constant pools.  */
-  {
-    int fdata = flag_data_sections;
-
-    flag_data_sections = flag_function_sections;
-    frodata = default_function_rodata_section (decl);
-    flag_data_sections = fdata;
-    flags = frodata->common.flags;
-  }
-
-  if (frodata != readonly_data_section
-      && flags & SECTION_NAMED)
-    {
-      /* Adjust section flags and replace section name prefix.  */
-
-      unsigned int i;
-
-      static const char* const prefix[] =
-        {
-          ".rodata",          ".progmem.gcc_sw_table",
-          ".gnu.linkonce.r.", ".gnu.linkonce.t."
-        };
-
-      for (i = 0; i < sizeof (prefix) / sizeof (*prefix); i += 2)
-        {
-          const char * old_prefix = prefix[i];
-          const char * new_prefix = prefix[i+1];
-          const char * name = frodata->named.name;
-
-          if (STR_PREFIX_P (name, old_prefix))
-            {
-              const char *rname = ACONCAT ((new_prefix,
-                                            name + strlen (old_prefix), NULL));
-              flags &= ~SECTION_CODE;
-              flags |= AVR_HAVE_JMP_CALL ? 0 : SECTION_CODE;
-
-              return get_section (rname, flags, frodata->named.decl);
-            }
-        }
-    }
-
-  return progmem_swtable_section;
-}
-
-
 /* Implement `TARGET_ASM_NAMED_SECTION'.  */
 /* Track need of __do_clear_bss, __do_copy_data for named sections.  */
 
@@ -13747,9 +13667,6 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
 #undef  TARGET_FOLD_BUILTIN
 #define TARGET_FOLD_BUILTIN avr_fold_builtin
 
-#undef  TARGET_ASM_FUNCTION_RODATA_SECTION
-#define TARGET_ASM_FUNCTION_RODATA_SECTION avr_asm_function_rodata_section
-
 #undef  TARGET_SCALAR_MODE_SUPPORTED_P
 #define TARGET_SCALAR_MODE_SUPPORTED_P avr_scalar_mode_supported_p
 
index 01da70867e4670517a8a45c073b5acb876e7447f..ab5e465114887628750cd0c7459c374b8707b0bf 100644 (file)
@@ -391,7 +391,7 @@ typedef struct avr_args
 
 #define SUPPORTS_INIT_PRIORITY 0
 
-#define JUMP_TABLES_IN_TEXT_SECTION 0
+#define JUMP_TABLES_IN_TEXT_SECTION 1
 
 #define ASM_COMMENT_START " ; "
 
index 3dfb452358db71cd1dbe7f164a4147e93895eadf..b62a0f9468e2e8652edd6cdfef050442fc1c3b4e 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-16  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       * gcc.target/avr/pr71151-1.c: New test.
+       * gcc.target/avr/pr71151-2.c: New test.
+       * gcc.target/avr/pr71151-3.c: New test.
+       * gcc.target/avr/pr71151-4.c: New test.
+       * gcc.target/avr/pr71151-5.c: New test.
+       * gcc.target/avr/pr71151-6.c: New test.
+       * gcc.target/avr/pr71151-7.c: New test.
+       * gcc.target/avr/pr71151-8.c: New test.
+       * gcc.target/avr/pr71151-common.h: New test.
+
 2016-06-16  Martin Liska  <mliska@suse.cz>
 
        * gfortran.dg/predict-1.f90: New test.
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-1.c b/gcc/testsuite/gcc.target/avr/pr71151-1.c
new file mode 100644 (file)
index 0000000..615dce8
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -ffunction-sections -fdata-sections" } */
+
+/* { dg-final { scan-assembler-not ".section   .progmem.gcc_sw_table.foo.str1.1" } } */
+/* { dg-final { scan-assembler ".section       .rodata.foo.str1.1,\"aMS\"" } } */
+
+
+extern void bar(const char*);
+void foo(void)
+{
+  bar("BBBBBBBBBB");
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-2.c b/gcc/testsuite/gcc.target/avr/pr71151-2.c
new file mode 100644 (file)
index 0000000..e523ce0
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections" } */
+
+/* Make sure jumptables work properly if placed below 64 KB i.e. 2 byte
+   flash address for loading jump table entry, 2 byte entry, after
+   removing the special section placement hook. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-3.c b/gcc/testsuite/gcc.target/avr/pr71151-3.c
new file mode 100644 (file)
index 0000000..ce0ba59
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -mno-relax -fdata-sections -Wl,--section-start=.foo=0x10000" } */
+
+/* Make sure jumptables work properly if placed above 64 KB and below 128 KB,
+   i.e. 3 byte flash address for loading jump table entry and 2 byte jump table
+   entry, with relaxation disabled, after removing the special section
+   placement hook. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-4.c b/gcc/testsuite/gcc.target/avr/pr71151-4.c
new file mode 100644 (file)
index 0000000..51250b0
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections -mrelax -Wl,--section-start=.foo=0x10000" } */
+
+/* Make sure jumptables work properly if placed above 64 KB and below 128 KB,
+   i.e. 3 byte flash address for loading jump table entry and 2 byte jump
+   table entry, with relaxation enabled, after removing the special section
+   placement hook. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-5.c b/gcc/testsuite/gcc.target/avr/pr71151-5.c
new file mode 100644 (file)
index 0000000..47030dc
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections -mno-relax -Wl,--section-start=.foo=0x20000" } */
+
+/* Make sure jumptables work properly if placed above 128 KB, i.e. 3 byte
+   flash address for loading jump table entry and a jump table entry
+   that is a stub, with relaxation disabled, after removing the special
+   section placement hook. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       /* Not meant for devices with flash <= 128K */
+#if defined (__AVR_2_BYTE_PC__)
+       exit(0);
+#else
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+#endif
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-6.c b/gcc/testsuite/gcc.target/avr/pr71151-6.c
new file mode 100644 (file)
index 0000000..815aa13
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections -mrelax -Wl,--section-start=.foo=0x20000" } */
+
+/* Make sure jumptables work properly if placed above 128 KB, i.e. 3 byte
+   flash address for loading jump table entry and a jump table entry
+   that is a stub, with relaxation enabled, after removing the special
+   section placement hook. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       /* Not meant for devices with flash <= 128K */
+#if defined (__AVR_2_BYTE_PC__)
+       exit(0);
+#else
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+#endif
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-7.c b/gcc/testsuite/gcc.target/avr/pr71151-7.c
new file mode 100644 (file)
index 0000000..cdc7ea9
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections -mno-relax -Wl,--section-start=.foo=0x1fffa" } */
+
+/* Make sure jumptables work properly if placed straddling 128 KB i.e
+   some entries below 128 KB and some above it, with relaxation disabled. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       /* Not meant for devices with flash <= 128K */
+#if defined (__AVR_2_BYTE_PC__)
+       exit(0);
+#else
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+#endif
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-8.c b/gcc/testsuite/gcc.target/avr/pr71151-8.c
new file mode 100644 (file)
index 0000000..0b7bf6a
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fno-tree-switch-conversion -ffunction-sections -fdata-sections -mrelax -Wl,--section-start=.foo=0x1fffa" } */
+
+/* Make sure jumptables work properly if placed straddling 128 KB i.e
+   some entries below 128 KB and some above it, with relaxation disabled. */
+
+#include "exit-abort.h"
+#include "pr71151-common.h"
+
+int main()
+{
+       /* Not meant for devices with flash <= 128K */
+#if defined (__AVR_2_BYTE_PC__)
+       exit(0);
+#else
+       foo(5);
+       if (y != 37)
+               abort();
+
+       foo(0);
+       if (y != 67)
+               abort();
+
+       foo(7);
+       if (y != 98)
+               abort();
+#endif
+}
diff --git a/gcc/testsuite/gcc.target/avr/pr71151-common.h b/gcc/testsuite/gcc.target/avr/pr71151-common.h
new file mode 100644 (file)
index 0000000..0df1783
--- /dev/null
@@ -0,0 +1,27 @@
+volatile char y;
+volatile char g;
+
+__attribute__((section(".foo")))
+void foo(char x) 
+{
+       switch (x)
+       {
+               case 0:
+                       y = 67; break;
+               case 1:
+                       y = 20; break;
+               case 2:
+                       y = 109; break;
+               case 3:
+                       y = 33; break;
+               case 4:
+                       y = 44; break;
+               case 5:
+                       y = 37; break;
+               case 6:
+                       y = 10; break;
+               case 7:
+                       y = 98; break;
+       }
+       y = y + g;
+}