+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.
# include "clean-temp-simple.h"
#endif
+#include "xalloc.h"
#include "macros.h"
/* On most platforms, function pointers are just a pointer to the
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
{
};
# 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
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);