1PHP_ARG_ENABLE([opcache], 2 [whether to enable Zend OPcache support], 3 [AS_HELP_STRING([--disable-opcache], 4 [Disable Zend OPcache support])], 5 [yes]) 6 7PHP_ARG_ENABLE([huge-code-pages], 8 [whether to enable copying PHP CODE pages into HUGE PAGES], 9 [AS_HELP_STRING([--disable-huge-code-pages], 10 [Disable copying PHP CODE pages into HUGE PAGES])], 11 [yes], 12 [no]) 13 14PHP_ARG_ENABLE([opcache-jit], 15 [whether to enable JIT], 16 [AS_HELP_STRING([--disable-opcache-jit], 17 [Disable JIT])], 18 [yes], 19 [no]) 20 21PHP_ARG_WITH([capstone],, 22 [AS_HELP_STRING([--with-capstone], 23 [support opcache JIT disassembly through capstone])], 24 [no], 25 [no]) 26 27if test "$PHP_OPCACHE" != "no"; then 28 29 dnl Always build as shared extension 30 ext_shared=yes 31 32 if test "$PHP_HUGE_CODE_PAGES" = "yes"; then 33 AC_DEFINE(HAVE_HUGE_CODE_PAGES, 1, [Define to enable copying PHP CODE pages into HUGE PAGES (experimental)]) 34 fi 35 36 if test "$PHP_OPCACHE_JIT" = "yes"; then 37 case $host_cpu in 38 i[[34567]]86*|x86*|aarch64|amd64) 39 ;; 40 *) 41 AC_MSG_WARN([JIT not supported by host architecture]) 42 PHP_OPCACHE_JIT=no 43 ;; 44 esac 45 fi 46 47 if test "$PHP_OPCACHE_JIT" = "yes" ; then 48 AC_DEFINE(HAVE_JIT, 1, [Define to enable JIT]) 49 AC_DEFINE(ZEND_JIT_IR, 1, [Use JIT IR framework]) 50 ZEND_JIT_SRC="jit/zend_jit.c jit/zend_jit_vm_helpers.c jit/ir/ir.c jit/ir/ir_strtab.c \ 51 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 \ 52 jit/ir/ir_dump.c jit/ir/ir_gdb.c jit/ir/ir_perf.c jit/ir/ir_check.c \ 53 jit/ir/ir_patch.c jit/ir/ir_emit.c" 54 55 dnl Find out which ABI we are using. 56 case $host_alias in 57 x86_64-*-darwin*) 58 IR_TARGET=IR_TARGET_X64 59 DASM_FLAGS="-D X64APPLE=1 -D X64=1" 60 DASM_ARCH="x86" 61 ;; 62 *x86_64*|amd64-*-freebsd*) 63 IR_TARGET=IR_TARGET_X64 64 DASM_FLAGS="-D X64=1" 65 DASM_ARCH="x86" 66 ;; 67 i[[34567]]86*) 68 IR_TARGET=IR_TARGET_X86 69 DASM_ARCH="x86" 70 ;; 71 x86*) 72 IR_TARGET=IR_TARGET_X86 73 DASM_ARCH="x86" 74 ;; 75 aarch64*) 76 IR_TARGET=IR_TARGET_AARCH64 77 DASM_ARCH="aarch64" 78 ;; 79 esac 80 81 AS_IF([test x"$with_capstone" = "xyes"],[ 82 PKG_CHECK_MODULES([CAPSTONE],[capstone >= 3.0.0],[ 83 AC_DEFINE([HAVE_CAPSTONE], [1], [Capstone is available]) 84 PHP_EVAL_LIBLINE($CAPSTONE_LIBS, OPCACHE_SHARED_LIBADD) 85 PHP_EVAL_INCLINE($CAPSTONE_CFLAGS) 86 ZEND_JIT_SRC+=" jit/ir/ir_disasm.c" 87 ],[ 88 AC_MSG_ERROR([capstone >= 3.0 required but not found]) 89 ]) 90 ]) 91 92 PHP_SUBST(IR_TARGET) 93 PHP_SUBST(DASM_FLAGS) 94 PHP_SUBST(DASM_ARCH) 95 96 JIT_CFLAGS="-I@ext_builddir@/jit/ir -D${IR_TARGET} -DIR_PHP" 97 if test "$ZEND_DEBUG" = "yes"; then 98 JIT_CFLAGS="${JIT_CFLAGS} -DIR_DEBUG" 99 fi 100 fi 101 102 AC_CHECK_FUNCS([mprotect memfd_create shm_create_largepage]) 103 104 AC_MSG_CHECKING(for sysvipc shared memory support) 105 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 106#include <sys/types.h> 107#include <sys/wait.h> 108#include <sys/ipc.h> 109#include <sys/shm.h> 110#include <unistd.h> 111#include <string.h> 112 113int main(void) { 114 pid_t pid; 115 int status; 116 int ipc_id; 117 char *shm; 118 struct shmid_ds shmbuf; 119 120 ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W)); 121 if (ipc_id == -1) { 122 return 1; 123 } 124 125 shm = shmat(ipc_id, NULL, 0); 126 if (shm == (void *)-1) { 127 shmctl(ipc_id, IPC_RMID, NULL); 128 return 2; 129 } 130 131 if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) { 132 shmdt(shm); 133 shmctl(ipc_id, IPC_RMID, NULL); 134 return 3; 135 } 136 137 shmbuf.shm_perm.uid = getuid(); 138 shmbuf.shm_perm.gid = getgid(); 139 shmbuf.shm_perm.mode = 0600; 140 141 if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) { 142 shmdt(shm); 143 shmctl(ipc_id, IPC_RMID, NULL); 144 return 4; 145 } 146 147 shmctl(ipc_id, IPC_RMID, NULL); 148 149 strcpy(shm, "hello"); 150 151 pid = fork(); 152 if (pid < 0) { 153 return 5; 154 } else if (pid == 0) { 155 strcpy(shm, "bye"); 156 return 6; 157 } 158 if (wait(&status) != pid) { 159 return 7; 160 } 161 if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { 162 return 8; 163 } 164 if (strcmp(shm, "bye") != 0) { 165 return 9; 166 } 167 return 0; 168} 169]])],[have_shm_ipc=yes],[have_shm_ipc=no],[have_shm_ipc=no]) 170 if test "$have_shm_ipc" = "yes"; then 171 AC_DEFINE(HAVE_SHM_IPC, 1, [Define if you have SysV IPC SHM support]) 172 fi 173 AC_MSG_RESULT([$have_shm_ipc]) 174 175 AC_MSG_CHECKING(for mmap() using MAP_ANON shared memory support) 176 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 177#include <sys/types.h> 178#include <sys/wait.h> 179#include <sys/mman.h> 180#include <unistd.h> 181#include <string.h> 182 183#ifndef MAP_ANON 184# ifdef MAP_ANONYMOUS 185# define MAP_ANON MAP_ANONYMOUS 186# endif 187#endif 188#ifndef MAP_FAILED 189# define MAP_FAILED ((void*)-1) 190#endif 191 192int main(void) { 193 pid_t pid; 194 int status; 195 char *shm; 196 197 shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); 198 if (shm == MAP_FAILED) { 199 return 1; 200 } 201 202 strcpy(shm, "hello"); 203 204 pid = fork(); 205 if (pid < 0) { 206 return 5; 207 } else if (pid == 0) { 208 strcpy(shm, "bye"); 209 return 6; 210 } 211 if (wait(&status) != pid) { 212 return 7; 213 } 214 if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { 215 return 8; 216 } 217 if (strcmp(shm, "bye") != 0) { 218 return 9; 219 } 220 return 0; 221} 222]])],[have_shm_mmap_anon=yes],[have_shm_mmap_anon=no],[ 223 case $host_alias in 224 *linux*) 225 have_shm_mmap_anon=yes 226 ;; 227 *) 228 have_shm_mmap_anon=no 229 ;; 230 esac 231]) 232 if test "$have_shm_mmap_anon" = "yes"; then 233 AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support]) 234 fi 235 AC_MSG_RESULT([$have_shm_mmap_anon]) 236 237 PHP_CHECK_FUNC_LIB(shm_open, rt, root) 238 AC_MSG_CHECKING(for mmap() using shm_open() shared memory support) 239 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 240#include <sys/types.h> 241#include <sys/wait.h> 242#include <sys/mman.h> 243#include <sys/stat.h> 244#include <fcntl.h> 245#include <unistd.h> 246#include <string.h> 247#include <stdlib.h> 248#include <stdio.h> 249 250#ifndef MAP_FAILED 251# define MAP_FAILED ((void*)-1) 252#endif 253 254int main(void) { 255 pid_t pid; 256 int status; 257 int fd; 258 char *shm; 259 char tmpname[4096]; 260 261 sprintf(tmpname,"/opcache.test.shm.%dXXXXXX", getpid()); 262 if (mktemp(tmpname) == NULL) { 263 return 1; 264 } 265 fd = shm_open(tmpname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 266 if (fd == -1) { 267 return 2; 268 } 269 if (ftruncate(fd, 4096) < 0) { 270 close(fd); 271 shm_unlink(tmpname); 272 return 3; 273 } 274 275 shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 276 if (shm == MAP_FAILED) { 277 return 4; 278 } 279 shm_unlink(tmpname); 280 close(fd); 281 282 strcpy(shm, "hello"); 283 284 pid = fork(); 285 if (pid < 0) { 286 return 5; 287 } else if (pid == 0) { 288 strcpy(shm, "bye"); 289 return 6; 290 } 291 if (wait(&status) != pid) { 292 return 7; 293 } 294 if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { 295 return 8; 296 } 297 if (strcmp(shm, "bye") != 0) { 298 return 9; 299 } 300 return 0; 301} 302]])],[have_shm_mmap_posix=yes],[have_shm_mmap_posix=no],[have_shm_mmap_posix=no]) 303 AC_MSG_RESULT([$have_shm_mmap_posix]) 304 if test "$have_shm_mmap_posix" = "yes"; then 305 AC_DEFINE(HAVE_SHM_MMAP_POSIX, 1, [Define if you have POSIX mmap() SHM support]) 306 PHP_CHECK_LIBRARY(rt, shm_unlink, [PHP_ADD_LIBRARY(rt,1,OPCACHE_SHARED_LIBADD)]) 307 fi 308 309 PHP_NEW_EXTENSION(opcache, 310 ZendAccelerator.c \ 311 zend_accelerator_blacklist.c \ 312 zend_accelerator_debug.c \ 313 zend_accelerator_hash.c \ 314 zend_accelerator_module.c \ 315 zend_persist.c \ 316 zend_persist_calc.c \ 317 zend_file_cache.c \ 318 zend_shared_alloc.c \ 319 zend_accelerator_util_funcs.c \ 320 shared_alloc_shm.c \ 321 shared_alloc_mmap.c \ 322 shared_alloc_posix.c \ 323 $ZEND_JIT_SRC, 324 shared,,"-Wno-implicit-fallthrough -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 ${JIT_CFLAGS}",,yes) 325 326 PHP_ADD_EXTENSION_DEP(opcache, pcre) 327 328 if test "$have_shm_ipc" != "yes" && test "$have_shm_mmap_posix" != "yes" && test "$have_shm_mmap_anon" != "yes"; then 329 AC_MSG_ERROR([No supported shared memory caching support was found when configuring opcache. Check config.log for any errors or missing dependencies.]) 330 fi 331 332 if test "$PHP_OPCACHE_JIT" = "yes"; then 333 PHP_ADD_BUILD_DIR([$ext_builddir/jit], 1) 334 PHP_ADD_BUILD_DIR([$ext_builddir/jit/ir], 1) 335 PHP_ADD_MAKEFILE_FRAGMENT($ext_srcdir/jit/Makefile.frag) 336 fi 337 PHP_SUBST(OPCACHE_SHARED_LIBADD) 338fi 339