aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJozef Lawrynowicz <jozef.l@somniumtech.com>2017-06-15 13:38:52 +0000
committerNick Clifton <nickc@gcc.gnu.org>2017-06-15 13:38:52 +0000
commit61f5d85294a6a2757a1ab870c6f335e092c0c83a (patch)
treec687e904fefd96cf91a4784dfa2a87fc8ed968e4
parent0948d23fffba754853cc93984e106d2aaf9a3897 (diff)
downloadgcc-61f5d85294a6a2757a1ab870c6f335e092c0c83a.zip
gcc-61f5d85294a6a2757a1ab870c6f335e092c0c83a.tar.gz
gcc-61f5d85294a6a2757a1ab870c6f335e092c0c83a.tar.bz2
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/msp430/msp430.c23
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c16
-rw-r--r--gcc/testsuite/gcc.target/msp430/pr78818-auto.c5
-rw-r--r--gcc/testsuite/gcc.target/msp430/pr78818-data-region.c6
-rw-r--r--gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c7
-rw-r--r--gcc/testsuite/gcc.target/msp430/pr78818-real.c9
8 files changed, 80 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fc9554f..3f2f344 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2017-06-15 Jozef Lawrynowicz <jozef.l@somniumtech.com>
+
+ 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 <ebotcazou@adacore.com>
PR rtl-optimization/80474
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index dd53dea..6acab1e 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 4b7433e..3677d15 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2017-06-15 Jozef Lawrynowicz <jozef.l@somniumtech.com>
+
+ 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 <thomas.preudhomme@arm.com>
* 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 0000000..3dba361
--- /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 0000000..1fb0b28
--- /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 0000000..22b1fa2
--- /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 0000000..6367e01
--- /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 0000000..504ed4a
--- /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;
+}