Skip to content

Commit 49de3ce

Browse files
committed
Check for supported libffi ABI
1 parent 2e8518f commit 49de3ce

File tree

3 files changed

+108
-5
lines changed

3 files changed

+108
-5
lines changed

ext/ffi/config.m4

+91
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,97 @@ if test "$PHP_FFI" != "no"; then
1717
AC_MSG_ERROR(FFI module requires libffi)
1818
])
1919

20+
AC_CACHE_CHECK([for fastcall calling convention], ac_cv_ffi_fastcall,
21+
[
22+
AC_COMPILE_IFELSE(
23+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
24+
[[return FFI_FASTCALL]])
25+
],
26+
[ac_cv_ffi_fastcall=yes], [ac_cv_ffi_fastcall=no])
27+
])
28+
29+
if test "$ac_cv_ffi_fastcall" = yes; then
30+
AC_DEFINE(HAVE_FFI_FASTCALL,1,[Whether libffi supports fastcall calling convention])
31+
fi
32+
33+
AC_CACHE_CHECK([for thiscall calling convention], ac_cv_ffi_thiscall,
34+
[
35+
AC_COMPILE_IFELSE(
36+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
37+
[[return FFI_THISCALL]])
38+
],
39+
[ac_cv_ffi_thiscall=yes], [ac_cv_ffi_thiscall=no])
40+
])
41+
42+
if test "$ac_cv_ffi_thiscall" = yes; then
43+
AC_DEFINE(HAVE_FFI_THISCALL,1,[Whether libffi supports thiscall calling convention])
44+
fi
45+
46+
AC_CACHE_CHECK([for stdcall calling convention], ac_cv_ffi_stdcall,
47+
[
48+
AC_COMPILE_IFELSE(
49+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
50+
[[return FFI_STDCALL]])
51+
],
52+
[ac_cv_ffi_stdcall=yes], [ac_cv_ffi_stdcall=no])
53+
])
54+
55+
if test "$ac_cv_ffi_stdcall" = yes; then
56+
AC_DEFINE(HAVE_FFI_STDCALL,1,[Whether libffi supports stdcall calling convention])
57+
fi
58+
59+
AC_CACHE_CHECK([for pascal calling convention], ac_cv_ffi_pascal,
60+
[
61+
AC_COMPILE_IFELSE(
62+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
63+
[[return FFI_PASCAL]])
64+
],
65+
[ac_cv_ffi_pascal=yes], [ac_cv_ffi_pascal=no])
66+
])
67+
68+
if test "$ac_cv_ffi_pascal" = yes; then
69+
AC_DEFINE(HAVE_FFI_PASCAL,1,[Whether libffi supports pascal calling convention])
70+
fi
71+
72+
AC_CACHE_CHECK([for register calling convention], ac_cv_ffi_register,
73+
[
74+
AC_COMPILE_IFELSE(
75+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
76+
[[return FFI_REGISTER]])
77+
],
78+
[ac_cv_ffi_register=yes], [ac_cv_ffi_register=no])
79+
])
80+
81+
if test "$ac_cv_ffi_register" = yes; then
82+
AC_DEFINE(HAVE_FFI_REGISTER,1,[Whether libffi supports register calling convention])
83+
fi
84+
85+
AC_CACHE_CHECK([for ms_cdecl calling convention], ac_cv_ffi_ms_cdecl,
86+
[
87+
AC_COMPILE_IFELSE(
88+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
89+
[[return FFI_MS_CDECL]])
90+
],
91+
[ac_cv_ffi_ms_cdecl=yes], [ac_cv_ffi_ms_cdecl=no])
92+
])
93+
94+
if test "$ac_cv_ffi_ms_cdecl" = yes; then
95+
AC_DEFINE(HAVE_FFI_MS_CDECL,1,[Whether libffi supports ms_cdecl calling convention])
96+
fi
97+
98+
AC_CACHE_CHECK([for sysv calling convention], ac_cv_ffi_sysv,
99+
[
100+
AC_COMPILE_IFELSE(
101+
[AC_LANG_PROGRAM([[#include <ffi.h>]],
102+
[[return FFI_SYSV]])
103+
],
104+
[ac_cv_ffi_sysv=yes], [ac_cv_ffi_sysv=no])
105+
])
106+
107+
if test "$ac_cv_ffi_sysv" = yes; then
108+
AC_DEFINE(HAVE_FFI_SYSV,1,[Whether libffi supports sysv calling convention])
109+
fi
110+
20111
PHP_NEW_EXTENSION(ffi, ffi.c ffi_parser.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
21112
PHP_SUBST(FFI_SHARED_LIBADD)
22113
fi

ext/ffi/config.w32

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ if (PHP_FFI != 'no') {
55
CHECK_LIB("libffi.lib", "ffi", PHP_FFI)) {
66
AC_DEFINE('HAVE_FFI', 1, 'ffi support enabled');
77

8+
if (!X64) {
9+
AC_DEFINE('HAVE_FFI_FASTCALL', 1 ,'libffi supports fastcall calling convention');
10+
AC_DEFINE('HAVE_FFI_THISCALL', 1 ,'libffi supports thiscall calling convention');
11+
AC_DEFINE('HAVE_FFI_STDCALL', 1 ,'libffi supports stdcall calling convention');
12+
AC_DEFINE('HAVE_FFI_MS_CDELC', 1 ,'libffi supports ms_cdecl calling convention');
13+
AC_DEFINE('HAVE_FFI_SYSV', 1 ,'libffi supports sysv calling convention');
14+
}
15+
816
EXTENSION('ffi', 'ffi.c ffi_parser.c', null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
917
} else {
1018
WARNING('ffi not enabled, headers or libraries not found');

ext/ffi/ffi.c

+9-5
Original file line numberDiff line numberDiff line change
@@ -5682,33 +5682,37 @@ void zend_ffi_make_func_type(zend_ffi_dcl *dcl, HashTable *args) /* {{{ */
56825682
case ZEND_FFI_ABI_CDECL:
56835683
type->func.abi = FFI_DEFAULT_ABI;
56845684
break;
5685-
#ifndef _WIN64
5685+
#ifdef HAVE_FFI_FASTCALL
56865686
case ZEND_FFI_ABI_FASTCALL:
56875687
type->func.abi = FFI_FASTCALL;
56885688
break;
5689+
#endif
5690+
#ifdef HAVE_FFI_THISCALL
56895691
case ZEND_FFI_ABI_THISCALL:
56905692
type->func.abi = FFI_THISCALL;
56915693
break;
5694+
#endif
5695+
#ifdef HAVE_FFI_STDCALL
56925696
case ZEND_FFI_ABI_STDCALL:
56935697
type->func.abi = FFI_STDCALL;
56945698
break;
56955699
#endif
5696-
#if 0
5700+
#ifdef HAVE_FFI_PASCAL
56975701
case ZEND_FFI_ABI_PASCAL:
56985702
type->func.abi = FFI_PASCAL;
56995703
break;
57005704
#endif
5701-
#if 0
5705+
#ifdef HAVE_FFI_REGISTER
57025706
case ZEND_FFI_ABI_REGISTER:
57035707
type->func.abi = FFI_REGISTER;
57045708
break;
57055709
#endif
5706-
#ifdef X86_WIN32
5710+
#ifdef HAVE_FFI_MS_CDELC
57075711
case ZEND_FFI_ABI_MS:
57085712
type->func.abi = FFI_MS_CDECL;
57095713
break;
57105714
#endif
5711-
#ifndef _WIN32
5715+
#ifdef HAVE_FFI_SYSV
57125716
case ZEND_FFI_ABI_SYSV:
57135717
type->func.abi = FFI_SYSV;
57145718
break;

0 commit comments

Comments
 (0)