From: Georg-Johann Lay Date: Mon, 4 Jul 2011 12:48:04 +0000 (+0000) Subject: re PR target/34734 ([avr] attribute((progmem)) not handled properly in C++) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a648cfe8b3e10819f1a88ccc6912ca1529454024;p=gcc.git 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 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 70806e1acfa..21bab4d45ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2011-07-04 Georg-Johann Lay + + 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 PR tree-optimization/49615 diff --git a/gcc/testsuite/gcc.target/avr/avr.exp b/gcc/testsuite/gcc.target/avr/avr.exp index 90aeed41e1f..a552a968560 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 00000000000..cf7df203a95 --- /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 00000000000..cf53cc8e92b --- /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 00000000000..cf53cc8e92b --- /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 00000000000..67af05fe5b3 --- /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 00000000000..d5e86c9fe3c --- /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 355b3ad88bd..e2f83d6689b 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 00000000000..790c676c911 --- /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 00000000000..a1df9e78e72 --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp @@ -0,0 +1,2 @@ +/* { dg-do run } */ +#include "progmem-1.c"