From: Bruno Haible Date: Mon, 8 Jan 2024 21:48:46 +0000 (+0100) Subject: jit/cache tests: Fix for powerpc*, ia64, hppa* CPUs. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=f99f803290a9472c1ba5387183ae4823c0590111;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 9a94b76549..aa2c6c96a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2024-01-08 Bruno Haible + + 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 jit/cache tests: Port to native Windows. diff --git a/modules/jit/cache-tests b/modules/jit/cache-tests index d777684093..2b30831f1d 100644 --- a/modules/jit/cache-tests +++ b/modules/jit/cache-tests @@ -12,6 +12,7 @@ clean-temp-simple getpagesize host-cpu-c-abi stdint +xalloc configure.ac: AC_CHECK_HEADERS_ONCE([sys/mman.h]) diff --git a/tests/jit/test-cache.c b/tests/jit/test-cache.c index b19a25ec4f..86fe4c7aec 100644 --- a/tests/jit/test-cache.c +++ b/tests/jit/test-cache.c @@ -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);