@@ -24,6 +24,13 @@ PHP_ARG_WITH([capstone],,
2424 [ no] ,
2525 [ no] )
2626
27+ PHP_ARG_ENABLE([ opcache-jit-ir] ,
28+ [ whether to enable JIT based on IR framework] ,
29+ [ AS_HELP_STRING ( [ --disable-opcache-jit-ir] ,
30+ [ Disable JIT based on IR framework (use old JIT)] ) ] ,
31+ [ yes] ,
32+ [ no] )
33+
2734if test "$PHP_OPCACHE" != "no"; then
2835
2936 dnl Always build as shared extension
@@ -44,7 +51,7 @@ if test "$PHP_OPCACHE" != "no"; then
4451 esac
4552 fi
4653
47- if test "$PHP_OPCACHE_JIT" = "yes"; then
54+ if test "$PHP_OPCACHE_JIT" = "yes" -a "$PHP_OPCACHE_JIT_IR" = "no" ; then
4855 AC_DEFINE ( HAVE_JIT , 1 , [ Define to enable JIT] )
4956 ZEND_JIT_SRC="jit/zend_jit.c jit/zend_jit_gdb.c jit/zend_jit_vm_helpers.c"
5057
@@ -86,6 +93,62 @@ if test "$PHP_OPCACHE" != "no"; then
8693
8794 PHP_SUBST(DASM_FLAGS)
8895 PHP_SUBST(DASM_ARCH)
96+
97+ JIT_CFLAGS=
98+
99+ elif test "$PHP_OPCACHE_JIT" = "yes" -a "$PHP_OPCACHE_JIT_IR" = "yes"; then
100+ AC_DEFINE ( HAVE_JIT , 1 , [ Define to enable JIT] )
101+ AC_DEFINE ( ZEND_JIT_IR , 1 , [ Use JIT IR framework] )
102+ ZEND_JIT_SRC="jit/zend_jit.c jit/zend_jit_vm_helpers.c jit/ir/ir.c jit/ir/ir_strtab.c \
103+ jit/ir/ir_cfg.c jit/ir/ir_sccp.c jit/ir/ir_gcm.c jit/ir/ir_ra.c jit/ir/ir_save.c \
104+ jit/ir/ir_dump.c jit/ir/ir_gdb.c jit/ir/ir_perf.c jit/ir/ir_check.c \
105+ jit/ir/ir_patch.c jit/ir/ir_emit.c"
106+
107+ dnl Find out which ABI we are using.
108+ case $host_alias in
109+ x86_64-*-darwin*)
110+ IR_TARGET=IR_TARGET_X64
111+ DASM_FLAGS="-D X64APPLE=1 -D X64=1"
112+ DASM_ARCH="x86"
113+ ;;
114+ x86_64*)
115+ IR_TARGET=IR_TARGET_X64
116+ DASM_FLAGS="-D X64=1"
117+ DASM_ARCH="x86"
118+ ;;
119+ i[ [ 34567] ] 86*)
120+ IR_TARGET=IR_TARGET_X86
121+ DASM_ARCH="x86"
122+ ;;
123+ x86*)
124+ IR_TARGET=IR_TARGET_X86
125+ DASM_ARCH="x86"
126+ ;;
127+ aarch64*)
128+ IR_TARGET=IR_TARGET_AARCH64
129+ DASM_ARCH="aarch64"
130+ ;;
131+ esac
132+
133+ AS_IF ( [ test x"$with_capstone" = "xyes"] ,[
134+ PKG_CHECK_MODULES([ CAPSTONE] ,[ capstone >= 3.0.0] ,[
135+ AC_DEFINE ( [ HAVE_CAPSTONE] , [ 1] , [ Capstone is available] )
136+ PHP_EVAL_LIBLINE($CAPSTONE_LIBS, OPCACHE_SHARED_LIBADD)
137+ PHP_EVAL_INCLINE($CAPSTONE_CFLAGS)
138+ ZEND_JIT_SRC+=" jit/ir/ir_disasm.c"
139+ ] ,[
140+ AC_MSG_ERROR ( [ capstone >= 3.0 required but not found] )
141+ ] )
142+ ] )
143+
144+ PHP_SUBST(IR_TARGET)
145+ PHP_SUBST(DASM_FLAGS)
146+ PHP_SUBST(DASM_ARCH)
147+
148+ JIT_CFLAGS="-I@ext_builddir@/jit/ir -D${IR_TARGET} -DIR_PHP"
149+ if test "$ZEND_DEBUG" = "yes"; then
150+ JIT_CFLAGS="${JIT_CFLAGS} -DIR_DEBUG"
151+ fi
89152 fi
90153
91154 AC_CHECK_FUNCS ( [ mprotect memfd_create shm_create_largepage] )
@@ -310,7 +373,7 @@ int main(void) {
310373 shared_alloc_mmap.c \
311374 shared_alloc_posix.c \
312375 $ZEND_JIT_SRC,
313- shared,,"-Wno-implicit-fallthrough -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1",,yes)
376+ shared,,"-Wno-implicit-fallthrough -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 ${JIT_CFLAGS} ",,yes)
314377
315378 PHP_ADD_EXTENSION_DEP(opcache, pcre)
316379
@@ -320,6 +383,9 @@ int main(void) {
320383
321384 if test "$PHP_OPCACHE_JIT" = "yes"; then
322385 PHP_ADD_BUILD_DIR([ $ext_builddir/jit] , 1)
386+ if test "$PHP_OPCACHE_JIT_IR" = "yes"; then
387+ PHP_ADD_BUILD_DIR([ $ext_builddir/jit/ir] , 1)
388+ fi
323389 PHP_ADD_MAKEFILE_FRAGMENT($ext_srcdir/jit/Makefile.frag)
324390 fi
325391 PHP_SUBST(OPCACHE_SHARED_LIBADD)
0 commit comments