Patchwork Ping #1: [testsuite, AVR]: Add some progmem test cases

login
register
mail settings
Submitter Georg-Johann Lay
Date July 4, 2011, 10:16 a.m.
Message ID <4E119306.1070402@gjlay.de>
Download mbox | patch
Permalink /patch/103081/
State New
Headers show

Comments

Georg-Johann Lay - July 4, 2011, 10:16 a.m.
Georg-Johann Lay wrote:
> Some runtime and checks for error/warning for C/C++.

Note that some tests fail because of pending

http://gcc.gnu.org/ml/gcc-patches/2011-06/msg02318.html

Johann

testsuite/
	* 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.
Denis Chertykov - July 4, 2011, 11:07 a.m.
2011/7/4 Georg-Johann Lay <avr@gjlay.de>:
> Georg-Johann Lay wrote:
>> Some runtime and checks for error/warning for C/C++.
>
> Note that some tests fail because of pending
>
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg02318.html
>
> Johann
>
> testsuite/
>        * 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.

I don't know who must approve tests.
If me then Approved

Denis.
Mike Stump - July 4, 2011, 6 p.m.
On Jul 4, 2011, at 4:07 AM, Denis Chertykov <chertykov@gmail.com> wrote:
>> 
>> testsuite/

>>        * gcc.target/avr/torture/progmem-1.cpp: New file.
> 
> I don't know who must approve tests.
> If me then Approved

You!   If there are ugly details more related to the test suite framework, feel free to kick it up.

Patch

Index: gcc.target/avr/avr.exp
===================================================================
--- gcc.target/avr/avr.exp	(revision 175628)
+++ gcc.target/avr/avr.exp	(working copy)
@@ -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.
Index: gcc.target/avr/torture/avr-torture.exp
===================================================================
--- gcc.target/avr/torture/avr-torture.exp	(revision 175628)
+++ gcc.target/avr/torture/avr-torture.exp	(working copy)
@@ -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
Index: gcc.target/avr/torture/progmem-1.c
===================================================================
--- gcc.target/avr/torture/progmem-1.c	(revision 0)
+++ gcc.target/avr/torture/progmem-1.c	(revision 0)
@@ -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;
+}
Index: gcc.target/avr/torture/progmem-1.cpp
===================================================================
--- gcc.target/avr/torture/progmem-1.cpp	(revision 0)
+++ gcc.target/avr/torture/progmem-1.cpp	(revision 0)
@@ -0,0 +1,2 @@ 
+/* { dg-do run } */
+#include "progmem-1.c"
Index: gcc.target/avr/exit-abort.h
===================================================================
--- gcc.target/avr/exit-abort.h	(revision 0)
+++ gcc.target/avr/exit-abort.h	(revision 0)
@@ -0,0 +1,8 @@ 
+#ifdef __cplusplus
+extern "C" {
+#endif
+  extern void exit (int);
+  extern void abort (void);
+#ifdef __cplusplus
+}
+#endif
Index: gcc.target/avr/progmem-warning-1.c
===================================================================
--- gcc.target/avr/progmem-warning-1.c	(revision 0)
+++ gcc.target/avr/progmem-warning-1.c	(revision 0)
@@ -0,0 +1,6 @@ 
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized" } */
+
+#include "progmem.h"
+
+const char c PROGMEM; /* { dg-warning "uninitialized variable 'c' put into program memory area" } */
Index: gcc.target/avr/progmem-error-1.c
===================================================================
--- gcc.target/avr/progmem-error-1.c	(revision 0)
+++ gcc.target/avr/progmem-error-1.c	(revision 0)
@@ -0,0 +1,5 @@ 
+/* { dg-do compile } */
+
+#include "progmem.h"
+
+char str[] PROGMEM = "Hallo"; /* { dg-error "must be const" } */
Index: gcc.target/avr/progmem-error-1.cpp
===================================================================
--- gcc.target/avr/progmem-error-1.cpp	(revision 0)
+++ gcc.target/avr/progmem-error-1.cpp	(revision 0)
@@ -0,0 +1,5 @@ 
+/* { dg-do compile } */
+
+#include "progmem.h"
+
+char str[] PROGMEM = "Hallo"; /* { dg-error "must be const" } */
Index: gcc.target/avr/progmem.h
===================================================================
--- gcc.target/avr/progmem.h	(revision 0)
+++ gcc.target/avr/progmem.h	(revision 0)
@@ -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; }))