1 /* 2 +----------------------------------------------------------------------+ 3 | Zend OPcache | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | https://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Andi Gutmans <andi@php.net> | 16 | Zeev Suraski <zeev@php.net> | 17 | Stanislav Malyshev <stas@zend.com> | 18 | Dmitry Stogov <dmitry@php.net> | 19 +----------------------------------------------------------------------+ 20 */ 21 22 #ifndef ZEND_OPTIMIZER_H 23 #define ZEND_OPTIMIZER_H 24 25 #include "zend.h" 26 #include "zend_compile.h" 27 28 #define ZEND_OPTIMIZER_PASS_1 (1<<0) /* Simple local optimizations */ 29 #define ZEND_OPTIMIZER_PASS_2 (1<<1) /* */ 30 #define ZEND_OPTIMIZER_PASS_3 (1<<2) /* Jump optimization */ 31 #define ZEND_OPTIMIZER_PASS_4 (1<<3) /* INIT_FCALL_BY_NAME -> DO_FCALL */ 32 #define ZEND_OPTIMIZER_PASS_5 (1<<4) /* CFG based optimization */ 33 #define ZEND_OPTIMIZER_PASS_6 (1<<5) /* DFA based optimization */ 34 #define ZEND_OPTIMIZER_PASS_7 (1<<6) /* CALL GRAPH optimization */ 35 #define ZEND_OPTIMIZER_PASS_8 (1<<7) /* SCCP (constant propagation) */ 36 #define ZEND_OPTIMIZER_PASS_9 (1<<8) /* TMP VAR usage */ 37 #define ZEND_OPTIMIZER_PASS_10 (1<<9) /* NOP removal */ 38 #define ZEND_OPTIMIZER_PASS_11 (1<<10) /* Merge equal constants */ 39 #define ZEND_OPTIMIZER_PASS_12 (1<<11) /* Adjust used stack */ 40 #define ZEND_OPTIMIZER_PASS_13 (1<<12) /* Remove unused variables */ 41 #define ZEND_OPTIMIZER_PASS_14 (1<<13) /* DCE (dead code elimination) */ 42 #define ZEND_OPTIMIZER_PASS_15 (1<<14) /* (unsafe) Collect constants */ 43 #define ZEND_OPTIMIZER_PASS_16 (1<<15) /* Inline functions */ 44 45 #define ZEND_OPTIMIZER_IGNORE_OVERLOADING (1<<16) /* (unsafe) Ignore possibility of operator overloading */ 46 47 #define ZEND_OPTIMIZER_NARROW_TO_DOUBLE (1<<17) /* try to narrow long constant assignments to double */ 48 49 #define ZEND_OPTIMIZER_ALL_PASSES 0x7FFFFFFF 50 51 #define DEFAULT_OPTIMIZATION_LEVEL "0x7FFEBFFF" 52 53 54 #define ZEND_DUMP_AFTER_PASS_1 ZEND_OPTIMIZER_PASS_1 55 #define ZEND_DUMP_AFTER_PASS_2 ZEND_OPTIMIZER_PASS_2 56 #define ZEND_DUMP_AFTER_PASS_3 ZEND_OPTIMIZER_PASS_3 57 #define ZEND_DUMP_AFTER_PASS_4 ZEND_OPTIMIZER_PASS_4 58 #define ZEND_DUMP_AFTER_PASS_5 ZEND_OPTIMIZER_PASS_5 59 #define ZEND_DUMP_AFTER_PASS_6 ZEND_OPTIMIZER_PASS_6 60 #define ZEND_DUMP_AFTER_PASS_7 ZEND_OPTIMIZER_PASS_7 61 #define ZEND_DUMP_AFTER_PASS_8 ZEND_OPTIMIZER_PASS_8 62 #define ZEND_DUMP_AFTER_PASS_9 ZEND_OPTIMIZER_PASS_9 63 #define ZEND_DUMP_AFTER_PASS_10 ZEND_OPTIMIZER_PASS_10 64 #define ZEND_DUMP_AFTER_PASS_11 ZEND_OPTIMIZER_PASS_11 65 #define ZEND_DUMP_AFTER_PASS_12 ZEND_OPTIMIZER_PASS_12 66 #define ZEND_DUMP_AFTER_PASS_13 ZEND_OPTIMIZER_PASS_13 67 #define ZEND_DUMP_AFTER_PASS_14 ZEND_OPTIMIZER_PASS_14 68 69 #define ZEND_DUMP_BEFORE_OPTIMIZER (1<<16) 70 #define ZEND_DUMP_AFTER_OPTIMIZER (1<<17) 71 72 #define ZEND_DUMP_BEFORE_BLOCK_PASS (1<<18) 73 #define ZEND_DUMP_AFTER_BLOCK_PASS (1<<19) 74 #define ZEND_DUMP_BLOCK_PASS_VARS (1<<20) 75 76 #define ZEND_DUMP_BEFORE_DFA_PASS (1<<21) 77 #define ZEND_DUMP_AFTER_DFA_PASS (1<<22) 78 #define ZEND_DUMP_DFA_CFG (1<<23) 79 #define ZEND_DUMP_DFA_DOMINATORS (1<<24) 80 #define ZEND_DUMP_DFA_LIVENESS (1<<25) 81 #define ZEND_DUMP_DFA_PHI (1<<26) 82 #define ZEND_DUMP_DFA_SSA (1<<27) 83 #define ZEND_DUMP_DFA_SSA_VARS (1<<28) 84 #define ZEND_DUMP_SCCP (1<<29) 85 86 typedef struct _zend_script { 87 zend_string *filename; 88 zend_op_array main_op_array; 89 HashTable function_table; 90 HashTable class_table; 91 } zend_script; 92 93 typedef void (*zend_optimizer_pass_t)(zend_script *, void *context); 94 95 BEGIN_EXTERN_C() 96 ZEND_API void zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level); 97 ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass); 98 ZEND_API void zend_optimizer_unregister_pass(int idx); 99 zend_result zend_optimizer_startup(void); 100 zend_result zend_optimizer_shutdown(void); 101 END_EXTERN_C() 102 103 #endif 104