Hello Bruno,

Here is my attempt at a simple unit test for your new cache module.

I have tested it on an x86 box (where the instruction cache is always in
sync) and on an Armv8 Raspberry, both running GNU/Linux.  Commenting out
the call to `clear_cache' shows that `clear_cache' is not a NOP on Arm and
that the test is actually doing a non-trivial test.

Best,

Marc

Am Mo., 13. Nov. 2023 um 14:33 Uhr schrieb Bruno Haible <br...@clisp.org>:

> >       * m4/valgrind-helper.m4: New file.
>
> Oops, that file was incomplete. Fixed like this:
>
>
> 2023-11-13  Bruno Haible  <br...@clisp.org>
>
>         jit/cache: Fix configure test.
>         * m4/valgrind-helper.m4 (gl_VALGRIND_HELPER): Check already at
> configure
>         time whether <valgrind/valgrind.h> exists. Fix AC_DEFINE_UNQUOTED
>         invocation.
>
> diff --git a/m4/valgrind-helper.m4 b/m4/valgrind-helper.m4
> index b3d70a7ad9..99c31030b9 100644
> --- a/m4/valgrind-helper.m4
> +++ b/m4/valgrind-helper.m4
> @@ -1,4 +1,4 @@
> -# valgrind-helper.m4 serial 1
> +# valgrind-helper.m4 serial 2
>  dnl Copyright (C) 2023 Free Software Foundation, Inc.
>  dnl This file is free software; the Free Software Foundation
>  dnl gives unlimited permission to copy and/or distribute it,
> @@ -18,5 +18,13 @@ AC_DEFUN_ONCE([gl_VALGRIND_HELPER]
>         support_valgrind=0
>       fi
>      ])
> -  AC_DEFINE_UNQUOTED([ENABLE_VALGRIND_SUPPORT], [$support_valgrind])
> +  if test $support_valgrind = 1; then
> +    AC_CHECK_HEADERS([valgrind/valgrind.h])
> +    if test $ac_cv_header_valgrind_valgrind_h != yes; then
> +      AC_MSG_ERROR([cannot enable valgrind support: <valgrind/valgrind.h>
> not found])
> +    fi
> +  fi
> +  AC_DEFINE_UNQUOTED([ENABLE_VALGRIND_SUPPORT], [$support_valgrind],
> +    [Define to 1 to include support for running the binaries under
> valgrind,
> +     or to 0 otherwise.])
>  ])
>
>
>
>
From 335cc8f54e4510d4a9025a401cc67a7d32ce1f56 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Nieper-Wi=C3=9Fkirchen?= <m...@nieper-wisskirchen.de>
Date: Sat, 25 Nov 2023 18:14:55 +0100
Subject: [PATCH] jit/cache-tests: New module.

* m4/valgrind-helper.m4: Unconditionally set support_valgrind to
fix configure error.
* modules/jit/cache-tests: New file.  Mark the test as unportable
for now.
* tests/jit/test-cache.c: New file.
---
 ChangeLog               |  9 +++++
 m4/valgrind-helper.m4   |  3 +-
 modules/jit/cache-tests | 20 +++++++++++
 tests/jit/test-cache.c  | 77 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 108 insertions(+), 1 deletion(-)
 create mode 100644 modules/jit/cache-tests
 create mode 100644 tests/jit/test-cache.c

diff --git a/ChangeLog b/ChangeLog
index 1834acd9da..89419032b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2023-11-25  Marc Nieper-Wißkirchen  <m...@nieper-wisskirchen.de>
+
+	jit/cache-tests: New module.
+	* m4/valgrind-helper.m4: Unconditionally set support_valgrind to
+	fix configure error.
+	* modules/jit/cache-tests: New file.  Mark the test as unportable
+	for now.
+	* tests/jit/test-cache.c: New file.
+
 2023-11-24  Bruno Haible  <br...@clisp.org>
 
 	floorf, ceilf tests: Strengthen against compiler optimizations.
diff --git a/m4/valgrind-helper.m4 b/m4/valgrind-helper.m4
index 99c31030b9..90637e6745 100644
--- a/m4/valgrind-helper.m4
+++ b/m4/valgrind-helper.m4
@@ -17,7 +17,8 @@ AC_DEFUN_ONCE([gl_VALGRIND_HELPER],
      else
        support_valgrind=0
      fi
-    ])
+    ],
+    [support_valgrind=0])
   if test $support_valgrind = 1; then
     AC_CHECK_HEADERS([valgrind/valgrind.h])
     if test $ac_cv_header_valgrind_valgrind_h != yes; then
diff --git a/modules/jit/cache-tests b/modules/jit/cache-tests
new file mode 100644
index 0000000000..eff828890d
--- /dev/null
+++ b/modules/jit/cache-tests
@@ -0,0 +1,20 @@
+Files:
+tests/jit/test-cache.c
+tests/macros.h
+
+Status:
+unportable-test
+
+Depends-on:
+getpagesize
+pagealign_alloc
+stdint
+
+configure.ac:
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-cache
+check_PROGRAMS += test-cache
+test_cache_SOURCES = jit/test-cache.c
diff --git a/tests/jit/test-cache.c b/tests/jit/test-cache.c
new file mode 100644
index 0000000000..47c81a8b1e
--- /dev/null
+++ b/tests/jit/test-cache.c
@@ -0,0 +1,77 @@
+/* Test clear_cache.
+
+   Copyright 2023 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <jit/cache.h>
+
+#include <pagealign_alloc.h>
+#include <string.h>
+#include <unistd.h>
+
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# include <sys/mman.h>
+#endif
+
+#include "macros.h"
+
+/* This test assumes that the code generated by the compiler for the
+   procedures `return1' and `return2' is position independent.  It
+   also assumes that function pointers are compatible with data
+   pointers and that these are bit-compatible to integers.  */
+
+static int
+return1 (void)
+{
+  return 1;
+}
+
+static int
+return2 (void)
+{
+  return 2;
+}
+
+int
+main ()
+{
+#if !(HAVE_SYS_MMAN_H && HAVE_SYS_MMAN_H)
+  return 77;
+#endif
+
+  int const pagesize = getpagesize ();
+  unsigned char *start = pagealign_xalloc (pagesize);
+  unsigned char *end = start + pagesize;
+
+  /* We have to call `mprotect' before the tests because on some
+     platforms `mprotect' invalidates the caches.  */
+  mprotect (start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC);
+
+  int (*f) (void) = (void *) start;
+
+  /* We assume that the code is not longer than 64 bytes and that we
+     can access the full 64 bytes for reading.  */
+  memcpy (start, return1, 64);
+  clear_cache (start, end);
+  ASSERT (f () == 1);
+
+  memcpy (start, return2, 64);
+  clear_cache (start, end);
+  ASSERT (f () == 2);
+
+  return 0;
+}
-- 
2.40.1

Reply via email to