You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.7 KiB

11 years ago
11 years ago
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Zend OPcache |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1998-2015 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. | http://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@zend.com> |
  16. | Zeev Suraski <zeev@zend.com> |
  17. | Stanislav Malyshev <stas@zend.com> |
  18. | Dmitry Stogov <dmitry@zend.com> |
  19. +----------------------------------------------------------------------+
  20. */
  21. #ifndef ZEND_OPTIMIZER_INTERNAL_H
  22. #define ZEND_OPTIMIZER_INTERNAL_H
  23. #include "ZendAccelerator.h"
  24. #define VAR_NUM(v) EX_VAR_TO_NUM(v)
  25. #define NUM_VAR(v) ((uint32_t)(zend_uintptr_t)ZEND_CALL_VAR_NUM(0, v))
  26. #define INV_COND(op) ((op) == ZEND_JMPZ ? ZEND_JMPNZ : ZEND_JMPZ)
  27. #define INV_EX_COND(op) ((op) == ZEND_JMPZ_EX ? ZEND_JMPNZ : ZEND_JMPZ)
  28. #define INV_COND_EX(op) ((op) == ZEND_JMPZ ? ZEND_JMPNZ_EX : ZEND_JMPZ_EX)
  29. #define INV_EX_COND_EX(op) ((op) == ZEND_JMPZ_EX ? ZEND_JMPNZ_EX : ZEND_JMPZ_EX)
  30. #undef MAKE_NOP
  31. #define MAKE_NOP(opline) do { \
  32. (opline)->opcode = ZEND_NOP; \
  33. memset(&(opline)->result, 0, sizeof((opline)->result)); \
  34. memset(&(opline)->op1, 0, sizeof((opline)->op1)); \
  35. memset(&(opline)->op2, 0, sizeof((opline)->op2)); \
  36. (opline)->result_type = (opline)->op1_type = (opline)->op2_type=IS_UNUSED; \
  37. zend_vm_set_opcode_handler(opline); \
  38. } while (0);
  39. #define RESULT_USED(op) (((op->result_type & IS_VAR) && !(op->result_type & EXT_TYPE_UNUSED)) || op->result_type == IS_TMP_VAR)
  40. #define RESULT_UNUSED(op) ((op->result_type & EXT_TYPE_UNUSED) != 0)
  41. #define SAME_VAR(op1, op2) ((((op1 ## _type & IS_VAR) && (op2 ## _type & IS_VAR)) || (op1 ## _type == IS_TMP_VAR && op2 ## _type == IS_TMP_VAR)) && op1.var == op2.var)
  42. typedef struct _zend_optimizer_ctx {
  43. zend_arena *arena;
  44. zend_persistent_script *script;
  45. HashTable *constants;
  46. } zend_optimizer_ctx;
  47. typedef struct _zend_code_block zend_code_block;
  48. typedef struct _zend_block_source zend_block_source;
  49. struct _zend_code_block {
  50. int access;
  51. zend_op *start_opline;
  52. int start_opline_no;
  53. int len;
  54. zend_code_block *op1_to;
  55. zend_code_block *op2_to;
  56. zend_code_block *ext_to;
  57. zend_code_block *follow_to;
  58. zend_code_block *next;
  59. zend_block_source *sources;
  60. zend_bool protected; /* don't merge this block with others */
  61. };
  62. typedef struct _zend_cfg {
  63. zend_code_block *blocks;
  64. zend_code_block **try;
  65. zend_code_block **catch;
  66. zend_op **Tsource;
  67. char *same_t;
  68. } zend_cfg;
  69. struct _zend_block_source {
  70. zend_code_block *from;
  71. zend_block_source *next;
  72. };
  73. #define OPTIMIZATION_LEVEL \
  74. ZCG(accel_directives).optimization_level
  75. #define LITERAL_LONG(op, val) do { \
  76. zval _c; \
  77. ZVAL_LONG(&_c, val); \
  78. op.constant = zend_optimizer_add_literal(op_array, &_c); \
  79. } while (0)
  80. #define LITERAL_BOOL(op, val) do { \
  81. zval _c; \
  82. ZVAL_BOOL(&_c, val); \
  83. op.constant = zend_optimizer_add_literal(op_array, &_c); \
  84. } while (0)
  85. #define literal_dtor(zv) do { \
  86. zval_dtor(zv); \
  87. ZVAL_NULL(zv); \
  88. } while (0)
  89. #define COPY_NODE(target, src) do { \
  90. target ## _type = src ## _type; \
  91. target = src; \
  92. } while (0)
  93. int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv);
  94. int zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy);
  95. void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value);
  96. int zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value);
  97. int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name);
  98. void zend_optimizer_update_op1_const(zend_op_array *op_array,
  99. zend_op *opline,
  100. zval *val);
  101. void zend_optimizer_update_op2_const(zend_op_array *op_array,
  102. zend_op *opline,
  103. zval *val);
  104. int zend_optimizer_replace_by_const(zend_op_array *op_array,
  105. zend_op *opline,
  106. zend_uchar type,
  107. uint32_t var,
  108. zval *val);
  109. void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx);
  110. void zend_optimizer_pass2(zend_op_array *op_array);
  111. void zend_optimizer_pass3(zend_op_array *op_array);
  112. void optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx);
  113. void optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx);
  114. void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *ctx);
  115. void zend_optimizer_nop_removal(zend_op_array *op_array);
  116. void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx *ctx);
  117. int zend_optimizer_is_disabled_func(const char *name, size_t len);
  118. #endif