aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2011-07-04 12:48:04 +0000
committerGeorg-Johann Lay <gjl@gcc.gnu.org>2011-07-04 12:48:04 +0000
commita648cfe8b3e10819f1a88ccc6912ca1529454024 (patch)
tree2cbe3891c85132880ac7daf51ebffe5758df74af
parentdb297e20845c258a8c02eeab220027d9717a3cd3 (diff)
downloadgcc-a648cfe8b3e10819f1a88ccc6912ca1529454024.zip
gcc-a648cfe8b3e10819f1a88ccc6912ca1529454024.tar.gz
gcc-a648cfe8b3e10819f1a88ccc6912ca1529454024.tar.bz2
re PR target/34734 ([avr] attribute((progmem)) not handled properly in C++)
PR target/34734 PR target/44643 * gcc.target/avr/avr.exp: Run over cpp files, too. * gcc.target/avr/torture/avr-torture.exp: Ditto. * gcc.target/avr/progmem.h: New file. * gcc.target/avr/exit-abort.h: New file. * gcc.target/avr/progmem-error-1.c: New file. * gcc.target/avr/progmem-error-1.cpp: New file. * gcc.target/avr/progmem-warning-1.c: New file. * gcc.target/avr/torture/progmem-1.c: New file. * gcc.target/avr/torture/progmem-1.cpp: New file. From-SVN: r175811
-rw-r--r--gcc/testsuite/ChangeLog14
-rw-r--r--gcc/testsuite/gcc.target/avr/avr.exp2
-rw-r--r--gcc/testsuite/gcc.target/avr/exit-abort.h8
-rw-r--r--gcc/testsuite/gcc.target/avr/progmem-error-1.c5
-rw-r--r--gcc/testsuite/gcc.target/avr/progmem-error-1.cpp5
-rw-r--r--gcc/testsuite/gcc.target/avr/progmem-warning-1.c7
-rw-r--r--gcc/testsuite/gcc.target/avr/progmem.h14
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/avr-torture.exp2
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/progmem-1.c30
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp2
10 files changed, 87 insertions, 2 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 70806e1..21bab4d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2011-07-04 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/34734
+ PR target/44643
+ * gcc.target/avr/avr.exp: Run over cpp files, too.
+ * gcc.target/avr/torture/avr-torture.exp: Ditto.
+ * gcc.target/avr/progmem.h: New file.
+ * gcc.target/avr/exit-abort.h: New file.
+ * gcc.target/avr/progmem-error-1.c: New file.
+ * gcc.target/avr/progmem-error-1.cpp: New file.
+ * gcc.target/avr/progmem-warning-1.c: New file.
+ * gcc.target/avr/torture/progmem-1.c: New file.
+ * gcc.target/avr/torture/progmem-1.cpp: New file.
+
2011-07-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49615
diff --git a/gcc/testsuite/gcc.target/avr/avr.exp b/gcc/testsuite/gcc.target/avr/avr.exp
index 90aeed4..a552a96 100644
--- a/gcc/testsuite/gcc.target/avr/avr.exp
+++ b/gcc/testsuite/gcc.target/avr/avr.exp
@@ -34,7 +34,7 @@ if ![info exists DEFAULT_CFLAGS] then {
dg-init
# Main loop.
-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{\[cCS\],cpp}]] \
"" $DEFAULT_CFLAGS
# All done.
diff --git a/gcc/testsuite/gcc.target/avr/exit-abort.h b/gcc/testsuite/gcc.target/avr/exit-abort.h
new file mode 100644
index 0000000..cf7df20
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/exit-abort.h
@@ -0,0 +1,8 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void exit (int);
+ extern void abort (void);
+#ifdef __cplusplus
+}
+#endif
diff --git a/gcc/testsuite/gcc.target/avr/progmem-error-1.c b/gcc/testsuite/gcc.target/avr/progmem-error-1.c
new file mode 100644
index 0000000..cf53cc8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/progmem-error-1.c
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+
+#include "progmem.h"
+
+char str[] PROGMEM = "Hallo"; /* { dg-error "must be const" } */
diff --git a/gcc/testsuite/gcc.target/avr/progmem-error-1.cpp b/gcc/testsuite/gcc.target/avr/progmem-error-1.cpp
new file mode 100644
index 0000000..cf53cc8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/progmem-error-1.cpp
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+
+#include "progmem.h"
+
+char str[] PROGMEM = "Hallo"; /* { dg-error "must be const" } */
diff --git a/gcc/testsuite/gcc.target/avr/progmem-warning-1.c b/gcc/testsuite/gcc.target/avr/progmem-warning-1.c
new file mode 100644
index 0000000..67af05f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/progmem-warning-1.c
@@ -0,0 +1,7 @@
+/* PR target/34734 */
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized" } */
+
+#include "progmem.h"
+
+const char c PROGMEM; /* { dg-warning "uninitialized variable 'c' put into program memory area" } */
diff --git a/gcc/testsuite/gcc.target/avr/progmem.h b/gcc/testsuite/gcc.target/avr/progmem.h
new file mode 100644
index 0000000..d5e86c9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/progmem.h
@@ -0,0 +1,14 @@
+#define PROGMEM __attribute__((progmem))
+
+#define PSTR(s) \
+ (__extension__({ \
+ static const char __c[] PROGMEM = (s); \
+ &__c[0];}))
+
+#define pgm_read_char(addr) \
+ (__extension__({ \
+ unsigned int __addr16 = (unsigned int)(addr); \
+ char __result; \
+ __asm__ ("lpm %0, %a1" \
+ : "=r" (__result) : "z" (__addr16)); \
+ __result; }))
diff --git a/gcc/testsuite/gcc.target/avr/torture/avr-torture.exp b/gcc/testsuite/gcc.target/avr/torture/avr-torture.exp
index 355b3ad..e2f83d6 100644
--- a/gcc/testsuite/gcc.target/avr/torture/avr-torture.exp
+++ b/gcc/testsuite/gcc.target/avr/torture/avr-torture.exp
@@ -52,7 +52,7 @@ set-torture-options $AVR_TORTURE_OPTIONS
# Main loop.
-gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] $DEFAULT_CFLAGS
+gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{\[cS\],cpp}]] $DEFAULT_CFLAGS
# Finalize use of torture lists.
torture-finish
diff --git a/gcc/testsuite/gcc.target/avr/torture/progmem-1.c b/gcc/testsuite/gcc.target/avr/torture/progmem-1.c
new file mode 100644
index 0000000..790c676
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/progmem-1.c
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+
+#include "../exit-abort.h"
+#include "../progmem.h"
+
+const char strA[] PROGMEM = "@A";
+const char strc PROGMEM = 'c';
+
+unsigned int volatile s = 2;
+
+int main()
+{
+ char c;
+
+ c = pgm_read_char (&strA[s-1]);
+ if (c != 'A')
+ abort();
+
+ c = pgm_read_char (&PSTR ("@@B")[s]);
+ if (c != 'B')
+ abort();
+
+ c = pgm_read_char (&strc);
+ if (c != 'c')
+ abort();
+
+ exit (0);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp b/gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp
new file mode 100644
index 0000000..a1df9e7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp
@@ -0,0 +1,2 @@
+/* { dg-do run } */
+#include "progmem-1.c"