]> Savannah Git Hosting - gnulib.git/commitdiff
jit/cache-tests: New module.
authorMarc Nieper-Wißkirchen <marc@nieper-wisskirchen.de>
Sat, 25 Nov 2023 17:14:55 +0000 (18:14 +0100)
committerBruno Haible <bruno@clisp.org>
Sat, 25 Nov 2023 20:12:18 +0000 (21:12 +0100)
* tests/jit/test-cache.c: New file.
* modules/jit/cache-tests: New file.  Mark the test as unportable
for now.

ChangeLog
modules/jit/cache-tests [new file with mode: 0644]
tests/jit/test-cache.c [new file with mode: 0644]

index 6fab60c4f00d5ad0c3f92224ddcff95db82befa4..8cc61bb26bc85db3e8ba2d45159a9130b04f6f9a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2023-11-25  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
+
+       jit/cache-tests: New module.
+       * tests/jit/test-cache.c: New file.
+       * modules/jit/cache-tests: New file.  Mark the test as unportable
+       for now.
+
 2023-11-25  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
 
        jit/cache: Fix configure error.
diff --git a/modules/jit/cache-tests b/modules/jit/cache-tests
new file mode 100644 (file)
index 0000000..eff8288
--- /dev/null
@@ -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 (file)
index 0000000..47c81a8
--- /dev/null
@@ -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;
+}