avr.c (avr_asm_init_sections): Remove setup of progmem_swtable_section.

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
This commit is contained in:
Senthil Kumar Selvaraj 2016-06-16 16:50:40 +00:00 committed by Denis Chertykov
parent d3606ee3ea
commit 2d761a3733
13 changed files with 251 additions and 84 deletions

View 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

View 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

View 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 " ; "

View 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.

View File

@ -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");
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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;
}