From: Jozef Lawrynowicz Date: Thu, 15 Jun 2017 13:38:52 +0000 (+0000) Subject: Fix problems with the MSP430 port's handling of persistent data. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=61f5d85294a6a2757a1ab870c6f335e092c0c83a;p=gcc.git Fix problems with the MSP430 port's handling of persistent data. PR target/78818 gcc * config/msp430/msp430.c (msp430_data_attr): Check that it's possible for a variable to have a section before checking if the section has a name. Set section to.persistent if persistent attribute is set. Warn if .persistent attribute is used on an automatic variable. tests * gcc.target/msp430/pr78818-real.c: New template for tests. * gcc.target/msp430/pr78818-auto.c: New test. * gcc.target/msp430/pr78818-data-region.c: New test. * gcc.target/msp430/pr78818-data-sec.c: New test. * gcc.target/msp430/pr78818-auto-warn.c: New test. From-SVN: r249222 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc9554f0142..3f2f34417c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-06-15 Jozef Lawrynowicz + + PR target/78818 + * config/msp430/msp430.c (msp430_data_attr): Check that it's possible + for a variable to have a section before checking if the section has a + name. + Set section to.persistent if persistent attribute is set. + Warn if .persistent attribute is used on an automatic variable. + 2017-06-15 Eric Botcazou PR rtl-optimization/80474 diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index dd53dea685b..6acab1e70cb 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -40,6 +40,7 @@ #include "expr.h" #include "langhooks.h" #include "builtins.h" +#include "intl.h" /* This file should be included last. */ #include "target-def.h" @@ -1993,10 +1994,24 @@ msp430_data_attr (tree * node, gcc_assert (args == NULL); if (TREE_CODE (* node) != VAR_DECL) - message = "%qE attribute only applies to variables"; - - if (DECL_SECTION_NAME (* node)) - message = "%qE attribute cannot be applied to variables with specific sections"; + message = G_("%qE attribute only applies to variables"); + + /* Check that it's possible for the variable to have a section. */ + if ((TREE_STATIC (* node) || DECL_EXTERNAL (* node) || in_lto_p) + && DECL_SECTION_NAME (* node)) + message = G_("%qE attribute cannot be applied to variables with specific sections"); + + if (!message && TREE_NAME_EQ (name, ATTR_PERSIST) && !TREE_STATIC (* node) + && !TREE_PUBLIC (* node) && !DECL_EXTERNAL (* node)) + message = G_("%qE attribute has no effect on automatic variables"); + + /* It's not clear if there is anything that can be set here to prevent the + front end placing the variable before the back end can handle it, in a + similar way to how DECL_COMMON is used below. + So just place the variable in the .persistent section now. */ + if ((TREE_STATIC (* node) || DECL_EXTERNAL (* node) || in_lto_p) + && TREE_NAME_EQ (name, ATTR_PERSIST)) + set_decl_section_name (* node, ".persistent"); /* If this var is thought to be common, then change this. Common variables are assigned to sections before the backend has a chance to process them. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b7433e2eda..3677d15c453 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2017-06-15 Jozef Lawrynowicz + + PR target/78818 + * gcc.target/msp430/pr78818-real.c: New template for tests. + * gcc.target/msp430/pr78818-auto.c: New test. + * gcc.target/msp430/pr78818-data-region.c: New test. + * gcc.target/msp430/pr78818-data-sec.c: New test. + * gcc.target/msp430/pr78818-auto-warn.c: New test. + 2017-06-15 Thomas Preud'homme * gcc.target/arm/its.c: Check that no IT blocks has more than 2 diff --git a/gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c b/gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c new file mode 100644 index 00000000000..3dba361071f --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +__attribute__((persistent)) int persistent_1_g = 1; +__attribute__((persistent)) int persistent_2_g = 0; +static __attribute__((persistent)) int persistent_3_g = 1; +static __attribute__((persistent)) int persistent_4_g = 0; + +int +main (void) +{ + __attribute__((persistent)) int persistent_1 = 1; /* { dg-warning "attribute has no effect on automatic" } */ + __attribute__((persistent)) int persistent_2 = 0; /* { dg-warning "attribute has no effect on automatic" } */ + static __attribute__((persistent)) int persistent_3 = 1; + static __attribute__((persistent)) int persistent_4 = 0; + return 0; +} diff --git a/gcc/testsuite/gcc.target/msp430/pr78818-auto.c b/gcc/testsuite/gcc.target/msp430/pr78818-auto.c new file mode 100644 index 00000000000..1fb0b28e64a --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr78818-auto.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ + +/* { dg-final { scan-assembler-not "\\.comm" } } */ + +#include "pr78818-real.c" diff --git a/gcc/testsuite/gcc.target/msp430/pr78818-data-region.c b/gcc/testsuite/gcc.target/msp430/pr78818-data-region.c new file mode 100644 index 00000000000..22b1fa272ad --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr78818-data-region.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-mdata-region=either" } */ + +/* { dg-final { scan-assembler-not "\\.either" } } */ + +#include "pr78818-real.c" diff --git a/gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c b/gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c new file mode 100644 index 00000000000..6367e01d948 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-fdata-sections" } */ + +/* { dg-final { scan-assembler-not "\\.data" } } */ +/* { dg-final { scan-assembler-not "\\.bss" } } */ + +#include "pr78818-real.c" diff --git a/gcc/testsuite/gcc.target/msp430/pr78818-real.c b/gcc/testsuite/gcc.target/msp430/pr78818-real.c new file mode 100644 index 00000000000..504ed4a6a79 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr78818-real.c @@ -0,0 +1,9 @@ +__attribute__((persistent)) int persistent_1 = 1; +__attribute__((persistent)) int persistent_2 = 0; +static __attribute__((persistent)) int persistent_3 = 1; +static __attribute__((persistent)) int persistent_4 = 0; + +int main (void) +{ + return 0; +}