Commit ee22ecbd11f52f8de1adbb2a6561aee2125a576a

Hans 2022-09-18T01:56:25

Add MSYS configuration files (#728) * Add MSYS configuration files MSYS behaves very similiar to Cygwin, e.g. also __CYGWIN__ is defined. Now 'make check' passes on MSYS without extra patches. * Fix warning extra tokens at end of #endif in closures.c Extra tokens converted into a comment. Also nearby indentations corrected. * Fix missing prototype warning mkostemp() on Cygwin Cygwin requires also _GNU_SOURCE to be defined to enable mkostemp() prototype. * Fix warning label ‘out’ defined but not used in ffi functions Define same preprocessor conditions for goto and label visibility. * Fix warning label ‘out’ defined but not used and related indentations. Define same preprocessor conditions for goto and label visibility. Correct also related indentations. Co-authored-by: Hannes Müller <>

diff --git a/configure.ac b/configure.ac
index 75cc455..fba64d5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -391,7 +391,7 @@ AC_ARG_ENABLE(exec-static-tramp,
 
 if test "$enable_exec_static_tramp" != no; then
 case "$target" in
-     *-cygwin*)
+     *-cygwin* | *-msys*)
        # Only define static trampolines if we are using the cygwin runtime.
        # Will this need to be changed for mingw?
        if test "x$GCC" = "xyes"; then
diff --git a/configure.host b/configure.host
index 5cd5fc4..f23716f 100644
--- a/configure.host
+++ b/configure.host
@@ -6,7 +6,7 @@
 # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
 # Most of the time we can define all the variables all at once...
 case "${host}" in
-  aarch64*-*-cygwin* | aarch64*-*-mingw* | aarch64*-*-win* )
+  aarch64*-*-cygwin* | aarch64*-*-msys* | aarch64*-*-mingw* | aarch64*-*-win* )
 	TARGET=ARM_WIN64; TARGETDIR=aarch64
 	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
 	  MSVC=1
@@ -30,7 +30,7 @@ case "${host}" in
 	SOURCES="ffi.c arcompact.S"
 	;;
 
-  arm*-*-cygwin* | arm*-*-mingw* | arm*-*-win* )
+  arm*-*-cygwin* | arm*-*-msys* | arm*-*-mingw* | arm*-*-win* )
 	TARGET=ARM_WIN32; TARGETDIR=arm
 	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
 	  MSVC=1
@@ -83,8 +83,8 @@ case "${host}" in
 	TARGET=X86_FREEBSD; TARGETDIR=x86
 	;;
 
-  i?86-*-cygwin* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \
-  | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* )
+  i?86-*-cygwin* | i?86-*-msys* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \
+  | x86_64-*-cygwin* | x86_64-*-msys* | x86_64-*-mingw* | x86_64-*-win* )
 	TARGETDIR=x86
 	if test $ac_cv_sizeof_size_t = 4; then
 	  TARGET=X86_WIN32
diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
index 76d2938..83e5653 100644
--- a/src/aarch64/ffi.c
+++ b/src/aarch64/ffi.c
@@ -832,14 +832,14 @@ ffi_prep_closure_loc (ffi_closure *closure,
     start = ffi_closure_SYSV;
 
 #if FFI_EXEC_TRAMPOLINE_TABLE
-#ifdef __MACH__
-#ifdef HAVE_PTRAUTH
+# ifdef __MACH__
+#  ifdef HAVE_PTRAUTH
   codeloc = ptrauth_auth_data(codeloc, ptrauth_key_function_pointer, 0);
-#endif
+#  endif
   void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE);
   config[0] = closure;
   config[1] = start;
-#endif
+# endif
 #else
   static const unsigned char trampoline[16] = {
     0x90, 0x00, 0x00, 0x58,	/* ldr	x16, tramp+16	*/
@@ -848,7 +848,7 @@ ffi_prep_closure_loc (ffi_closure *closure,
   };
   char *tramp = closure->tramp;
 
-#if defined(FFI_EXEC_STATIC_TRAMP)
+# if defined(FFI_EXEC_STATIC_TRAMP)
   if (ffi_tramp_is_present(closure))
     {
       /* Initialize the static trampoline's parameters. */
@@ -859,7 +859,7 @@ ffi_prep_closure_loc (ffi_closure *closure,
       ffi_tramp_set_parms (closure->ftramp, start, closure);
       goto out;
     }
-#endif
+# endif
 
   /* Initialize the dynamic trampoline. */
   memcpy (tramp, trampoline, sizeof(trampoline));
@@ -869,15 +869,17 @@ ffi_prep_closure_loc (ffi_closure *closure,
   ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE);
 
   /* Also flush the cache for code mapping.  */
-#ifdef _WIN32
+# ifdef _WIN32
   // Not using dlmalloc.c for Windows ARM64 builds
   // so calling ffi_data_to_code_pointer() isn't necessary
   unsigned char *tramp_code = tramp;
-  #else
+# else
   unsigned char *tramp_code = ffi_data_to_code_pointer (tramp);
-  #endif
+# endif
   ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE);
+# if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+# endif
 #endif
 
   closure->cif = cif;
diff --git a/src/arm/ffi.c b/src/arm/ffi.c
index 985dbee..cfd3e9d 100644
--- a/src/arm/ffi.c
+++ b/src/arm/ffi.c
@@ -626,7 +626,7 @@ ffi_prep_closure_loc (ffi_closure * closure,
   config[1] = closure_func;
 #else
 
-#if defined(FFI_EXEC_STATIC_TRAMP)
+# if defined(FFI_EXEC_STATIC_TRAMP)
   if (ffi_tramp_is_present(closure))
     {
       /* Initialize the static trampoline's parameters. */
@@ -637,31 +637,33 @@ ffi_prep_closure_loc (ffi_closure * closure,
       ffi_tramp_set_parms (closure->ftramp, closure_func, closure);
       goto out;
     }
-#endif
+# endif
 
   /* Initialize the dynamic trampoline. */
-#ifndef _WIN32
+# ifndef _WIN32
   memcpy(closure->tramp, ffi_arm_trampoline, 8);
-#else
+# else
   // cast away function type so MSVC doesn't set the lower bit of the function pointer
   memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET);
-#endif
+# endif
 
-#if defined(__QNX__)
+# if defined(__QNX__)
   msync (closure->tramp, 8, MS_INVALIDATE_ICACHE);	/* clear data map */
   msync (codeloc, 8, MS_INVALIDATE_ICACHE);		/* clear insn map */
-#elif defined(_WIN32)
+# elif defined(_WIN32)
   FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE);
-#else
+# else
   __clear_cache(closure->tramp, closure->tramp + 8);	/* clear data map */
   __clear_cache(codeloc, codeloc + 8);			/* clear insn map */
-#endif
-#ifdef _WIN32
+# endif
+# ifdef _WIN32
   *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func;
-#else
+# else
   *(void (**)(void))(closure->tramp + 8) = closure_func;
-#endif
+# endif
+# if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+# endif
 #endif
 
   closure->cif = cif;
diff --git a/src/closures.c b/src/closures.c
index e2bc651..3b7a0ac 100644
--- a/src/closures.c
+++ b/src/closures.c
@@ -27,7 +27,7 @@
    DEALINGS IN THE SOFTWARE.
    ----------------------------------------------------------------------- */
 
-#if defined __linux__ && !defined _GNU_SOURCE
+#if (defined __linux__ || defined __CYGWIN__) && !defined _GNU_SOURCE
 #define _GNU_SOURCE 1
 #endif
 
@@ -142,17 +142,17 @@ ffi_tramp_is_present (__attribute__((unused)) void *ptr)
 #endif
 
 #if FFI_MMAP_EXEC_WRIT && defined(__linux__) && !defined(__ANDROID__)
-#  if !defined FFI_MMAP_EXEC_SELINUX
-/*   When defined to 1 check for SELinux and if SELinux is active,
-     don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
-     might cause audit messages.  */
-#    define FFI_MMAP_EXEC_SELINUX 1
+# if !defined FFI_MMAP_EXEC_SELINUX
+/* When defined to 1 check for SELinux and if SELinux is active,
+   don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
+   might cause audit messages.  */
+#  define FFI_MMAP_EXEC_SELINUX 1
 # endif /* !defined FFI_MMAP_EXEC_SELINUX */
 # if !defined FFI_MMAP_PAX
-/*   Also check for PaX MPROTECT */
-#   define FFI_MMAP_PAX 1
+/* Also check for PaX MPROTECT */
+#  define FFI_MMAP_PAX 1
 # endif /* !defined FFI_MMAP_PAX */
-#endif FFI_MMAP_EXEC_WRIT && defined(__linux__) && !defined(__ANDROID__)
+#endif /* FFI_MMAP_EXEC_WRIT && defined(__linux__) && !defined(__ANDROID__) */
 
 #if FFI_CLOSURES
 
diff --git a/src/loongarch64/ffi.c b/src/loongarch64/ffi.c
index ed9c15f..140be3b 100644
--- a/src/loongarch64/ffi.c
+++ b/src/loongarch64/ffi.c
@@ -538,7 +538,9 @@ ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif,
 
   __builtin___clear_cache (codeloc, codeloc + FFI_TRAMPOLINE_SIZE);
 
+#if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+#endif
   closure->cif = cif;
   closure->fun = fun;
   closure->user_data = user_data;
diff --git a/src/x86/ffi.c b/src/x86/ffi.c
index 3da6716..b82d8c0 100644
--- a/src/x86/ffi.c
+++ b/src/x86/ffi.c
@@ -614,7 +614,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
   tramp[9] = 0xe9;
   *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14);
 
+#if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+#endif
   closure->cif = cif;
   closure->fun = fun;
   closure->user_data = user_data;
diff --git a/src/x86/ffi64.c b/src/x86/ffi64.c
index 22d43f5..6a8e37f 100644
--- a/src/x86/ffi64.c
+++ b/src/x86/ffi64.c
@@ -799,7 +799,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
   memcpy (tramp, trampoline, sizeof(trampoline));
   *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
 
+#if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+#endif
   closure->cif = cif;
   closure->fun = fun;
   closure->user_data = user_data;
diff --git a/src/x86/ffiw64.c b/src/x86/ffiw64.c
index 263aa5b..8271658 100644
--- a/src/x86/ffiw64.c
+++ b/src/x86/ffiw64.c
@@ -263,7 +263,9 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
   memcpy (tramp, trampoline, sizeof(trampoline));
   *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64;
 
+#if defined(FFI_EXEC_STATIC_TRAMP)
 out:
+#endif
   closure->cif = cif;
   closure->fun = fun;
   closure->user_data = user_data;
diff --git a/testsuite/lib/target-libpath.exp b/testsuite/lib/target-libpath.exp
index 6b7beba..e33a656 100644
--- a/testsuite/lib/target-libpath.exp
+++ b/testsuite/lib/target-libpath.exp
@@ -175,7 +175,7 @@ proc set_ld_library_path_env_vars { } {
   } else {
     setenv DYLD_LIBRARY_PATH "$ld_library_path"
   }
-  if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
+  if { [istarget *-*-cygwin*] || [ istarget *-*-msys* ] || [istarget *-*-mingw*] } {
     if { $orig_path_saved } {
       setenv PATH "$ld_library_path:$orig_path"
     } else {
@@ -271,7 +271,7 @@ proc get_shlib_extension { } {
 
     if { [ istarget *-*-darwin* ] } {
 	set shlib_ext "dylib"
-    } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } {
+    } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-msys* ] || [ istarget *-*-mingw* ] } {
 	set shlib_ext "dll"
     } elseif { [ istarget hppa*-*-hpux* ] } {
 	set shlib_ext "sl"