]> Savannah Git Hosting - gnulib.git/commitdiff
jit/cache tests: Fix for powerpc*, ia64, hppa* CPUs.
authorBruno Haible <bruno@clisp.org>
Mon, 8 Jan 2024 21:48:46 +0000 (22:48 +0100)
committerBruno Haible <bruno@clisp.org>
Thu, 18 Jan 2024 08:28:36 +0000 (09:28 +0100)
* modules/jit/cache-tests (Depends-on): Add xalloc.
* tests/jit/test-cache.c: Include xalloc.h.
(FUNCPTR_POINTS_TO_CODE, COPY_FUNCPTR): New macros.
(xcopy_funcptr): New function.
(main): Create a copy of the function pointer return1, so as not to
destructively modify return1. Fix memcpy argument.

ChangeLog
modules/jit/cache-tests
tests/jit/test-cache.c

index 9a94b76549289488c0d78254d72a69d37d2e7533..aa2c6c96a8ad4f8a8dc5d79b10f64857de32242c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2024-01-08  Bruno Haible  <bruno@clisp.org>
+
+       jit/cache tests: Fix for powerpc*, ia64, hppa* CPUs.
+       * modules/jit/cache-tests (Depends-on): Add xalloc.
+       * tests/jit/test-cache.c: Include xalloc.h.
+       (FUNCPTR_POINTS_TO_CODE, COPY_FUNCPTR): New macros.
+       (xcopy_funcptr): New function.
+       (main): Create a copy of the function pointer return1, so as not to
+       destructively modify return1. Fix memcpy argument.
+
 2024-01-08  Bruno Haible  <bruno@clisp.org>
 
        jit/cache tests: Port to native Windows.
index d7776840939bd6cc7b321a5b521823eeff0fbbfa..2b30831f1d978884e67066fd603b72704c8b2a9c 100644 (file)
@@ -12,6 +12,7 @@ clean-temp-simple
 getpagesize
 host-cpu-c-abi
 stdint
+xalloc
 
 configure.ac:
 AC_CHECK_HEADERS_ONCE([sys/mman.h])
index b19a25ec4f8dc4fa029061bfe6c86bbae8597851..86fe4c7aecc2dc863d1ba92de97a0212b7b12bac 100644 (file)
@@ -36,6 +36,7 @@
 # include "clean-temp-simple.h"
 #endif
 
+#include "xalloc.h"
 #include "macros.h"
 
 /*  On most platforms, function pointers are just a pointer to the
@@ -43,7 +44,6 @@
     however, is not universally true, see:
     https://git.savannah.gnu.org/gitweb/?p=libffcall.git;a=blob;f=porting-tools/abis/function-pointer.txt.  */
 
-#define CODE(fn) (((struct func *) (fn))->code_address)
 #if ((defined __powerpc__ || defined __powerpc64__) && defined _AIX) || (defined __powerpc64__ && defined __linux__)
 struct func
 {
@@ -84,8 +84,22 @@ struct func
 };
 # endif
 #else
-# undef CODE
-# define CODE(fn) ((*(void **) (&fn)))
+# define FUNCPTR_POINTS_TO_CODE
+#endif
+#ifdef FUNCPTR_POINTS_TO_CODE
+/* A function pointer points directly to the code.  */
+# define COPY_FUNCPTR(funcptr) funcptr
+# define CODE(funcptr) (funcptr)
+#else
+/* A function pointer points to a 'struct func'.  */
+static struct func *xcopy_funcptr (struct func *orig_funcptr)
+{
+  struct func *copy = (struct func *) xmalloc (sizeof (struct func));
+  *copy = *orig_funcptr;
+  return copy;
+}
+# define COPY_FUNCPTR(funcptr) (void *) xcopy_funcptr ((struct func *)(funcptr))
+# define CODE(funcptr) (((struct func *)(funcptr))->code_address)
 #endif
 
 /* This test assumes that the code generated by the compiler for the
@@ -188,16 +202,16 @@ main ()
     end = start + mapping_size;
   }
 
-  int (*f) (void) = return1;
+  int (*f) (void) = COPY_FUNCPTR (return1);
   CODE (f) = 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_rw, return1, 64);
+  memcpy (start_rw, CODE (return1), 64);
   clear_cache (start, end);
   ASSERT (f () == 1);
 
-  memcpy (start_rw, return2, 64);
+  memcpy (start_rw, CODE (return2), 64);
   clear_cache (start, end);
   ASSERT (f () == 2);