]> granicus.if.org Git - php/commitdiff
Check for supported libffi ABI
authorDmitry Stogov <dmitry@zend.com>
Mon, 13 May 2019 12:15:51 +0000 (15:15 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 13 May 2019 12:15:51 +0000 (15:15 +0300)
ext/ffi/config.m4
ext/ffi/config.w32
ext/ffi/ffi.c

index b0872a302ace7fcbecae5a71c15ff2a6b3baba02..e5e5d27101ceddbc3354ba32a26382350581b42f 100644 (file)
@@ -17,6 +17,97 @@ if test "$PHP_FFI" != "no"; then
     AC_MSG_ERROR(FFI module requires libffi)
   ])
 
+  AC_CACHE_CHECK([for fastcall calling convention], ac_cv_ffi_fastcall,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_FASTCALL]])
+    ],
+    [ac_cv_ffi_fastcall=yes], [ac_cv_ffi_fastcall=no])
+  ])
+
+  if test "$ac_cv_ffi_fastcall" = yes; then
+    AC_DEFINE(HAVE_FFI_FASTCALL,1,[Whether libffi supports fastcall calling convention])
+  fi
+
+  AC_CACHE_CHECK([for thiscall calling convention], ac_cv_ffi_thiscall,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_THISCALL]])
+    ],
+    [ac_cv_ffi_thiscall=yes], [ac_cv_ffi_thiscall=no])
+  ])
+
+  if test "$ac_cv_ffi_thiscall" = yes; then
+    AC_DEFINE(HAVE_FFI_THISCALL,1,[Whether libffi supports thiscall calling convention])
+  fi
+
+  AC_CACHE_CHECK([for stdcall calling convention], ac_cv_ffi_stdcall,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_STDCALL]])
+    ],
+    [ac_cv_ffi_stdcall=yes], [ac_cv_ffi_stdcall=no])
+  ])
+
+  if test "$ac_cv_ffi_stdcall" = yes; then
+    AC_DEFINE(HAVE_FFI_STDCALL,1,[Whether libffi supports stdcall calling convention])
+  fi
+
+  AC_CACHE_CHECK([for pascal calling convention], ac_cv_ffi_pascal,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_PASCAL]])
+    ],
+    [ac_cv_ffi_pascal=yes], [ac_cv_ffi_pascal=no])
+  ])
+
+  if test "$ac_cv_ffi_pascal" = yes; then
+    AC_DEFINE(HAVE_FFI_PASCAL,1,[Whether libffi supports pascal calling convention])
+  fi
+
+  AC_CACHE_CHECK([for register calling convention], ac_cv_ffi_register,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_REGISTER]])
+    ],
+    [ac_cv_ffi_register=yes], [ac_cv_ffi_register=no])
+  ])
+
+  if test "$ac_cv_ffi_register" = yes; then
+    AC_DEFINE(HAVE_FFI_REGISTER,1,[Whether libffi supports register calling convention])
+  fi
+
+  AC_CACHE_CHECK([for ms_cdecl calling convention], ac_cv_ffi_ms_cdecl,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_MS_CDECL]])
+    ],
+    [ac_cv_ffi_ms_cdecl=yes], [ac_cv_ffi_ms_cdecl=no])
+  ])
+
+  if test "$ac_cv_ffi_ms_cdecl" = yes; then
+    AC_DEFINE(HAVE_FFI_MS_CDECL,1,[Whether libffi supports ms_cdecl calling convention])
+  fi
+
+  AC_CACHE_CHECK([for sysv calling convention], ac_cv_ffi_sysv,
+    [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[#include <ffi.h>]],
+        [[return FFI_SYSV]])
+    ],
+    [ac_cv_ffi_sysv=yes], [ac_cv_ffi_sysv=no])
+  ])
+
+  if test "$ac_cv_ffi_sysv" = yes; then
+    AC_DEFINE(HAVE_FFI_SYSV,1,[Whether libffi supports sysv calling convention])
+  fi
+
   PHP_NEW_EXTENSION(ffi, ffi.c ffi_parser.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
   PHP_SUBST(FFI_SHARED_LIBADD)
 fi
index 41398974c0bc2f600e1769de5231ce750495b883..25abb75122439b675b7a82b5e1547995a67038aa 100644 (file)
@@ -5,6 +5,14 @@ if (PHP_FFI != 'no') {
                CHECK_LIB("libffi.lib", "ffi", PHP_FFI)) {
                AC_DEFINE('HAVE_FFI', 1, 'ffi support enabled');
 
+               if (!X64) {
+                   AC_DEFINE('HAVE_FFI_FASTCALL', 1 ,'libffi supports fastcall calling convention');
+                   AC_DEFINE('HAVE_FFI_THISCALL', 1 ,'libffi supports thiscall calling convention');
+                   AC_DEFINE('HAVE_FFI_STDCALL', 1 ,'libffi supports stdcall calling convention');
+                   AC_DEFINE('HAVE_FFI_MS_CDELC', 1 ,'libffi supports ms_cdecl calling convention');
+                   AC_DEFINE('HAVE_FFI_SYSV', 1 ,'libffi supports sysv calling convention');
+               }
+
                EXTENSION('ffi', 'ffi.c ffi_parser.c', null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
        } else {
                WARNING('ffi not enabled, headers or libraries not found');
index 72ff4b8e5897e232f5849ad8b52c16ffa9036516..174ebb056c40cde55916e186b9548c2ded5f7746 100644 (file)
@@ -5682,33 +5682,37 @@ void zend_ffi_make_func_type(zend_ffi_dcl *dcl, HashTable *args) /* {{{ */
                case ZEND_FFI_ABI_CDECL:
                        type->func.abi = FFI_DEFAULT_ABI;
                        break;
-#ifndef _WIN64
+#ifdef HAVE_FFI_FASTCALL
                case ZEND_FFI_ABI_FASTCALL:
                        type->func.abi = FFI_FASTCALL;
                        break;
+#endif
+#ifdef HAVE_FFI_THISCALL
                case ZEND_FFI_ABI_THISCALL:
                        type->func.abi = FFI_THISCALL;
                        break;
+#endif
+#ifdef HAVE_FFI_STDCALL
                case ZEND_FFI_ABI_STDCALL:
                        type->func.abi = FFI_STDCALL;
                        break;
 #endif
-#if 0
+#ifdef HAVE_FFI_PASCAL
                case ZEND_FFI_ABI_PASCAL:
                        type->func.abi = FFI_PASCAL;
                        break;
 #endif
-#if 0
+#ifdef HAVE_FFI_REGISTER
                case ZEND_FFI_ABI_REGISTER:
                        type->func.abi = FFI_REGISTER;
                        break;
 #endif
-#ifdef X86_WIN32
+#ifdef HAVE_FFI_MS_CDELC
                case ZEND_FFI_ABI_MS:
                        type->func.abi = FFI_MS_CDECL;
                        break;
 #endif
-#ifndef _WIN32
+#ifdef HAVE_FFI_SYSV
                case ZEND_FFI_ABI_SYSV:
                        type->func.abi = FFI_SYSV;
                        break;