mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00

Squashed commit of the following: commit38e22106d4
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 15:12:19 2015 +0300 Added NEWS entry commit0a355935bf
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 15:06:32 2015 +0300 Inline function, to eliminate repeatable checks commitd937584f3a
Merge:0341626
32677f5
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 14:35:49 2015 +0300 Merge branch 'master' into temporary_cleaning * master: Fixed bug #70006 (cli - function with default arg = STDOUT crash output). Fix x86 build Fixed use after free on closure_call_leak_with_exception.phpt Fixed test commit0341626ea9
Merge:74869fa
dec35de
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 12:00:53 2015 +0300 Merge branch 'temporary_cleaning' of https://github.com/laruence/php-src into temporary_cleaning * 'temporary_cleaning' of https://github.com/laruence/php-src: Fixed checkpoint get Fixed crash of invalid pointer derefer cleanup commit74869fa673
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 11:45:34 2015 +0300 Fixed wrong GOTO resolution commitdec35ded32
Author: Xinchen Hui <laruence@gmail.com> Date: Tue Jul 7 15:58:49 2015 +0800 Fixed checkpoint get commitb0f419540a
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 10:47:11 2015 +0300 Fixed crash of invalid pointer derefer (laruence) commit7a428d98ca
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 10:35:47 2015 +0300 Fixed identation commit9c3a4dce9c
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 10:33:52 2015 +0300 Fixed invalid size commit653abc670b
Author: Xinchen Hui <laruence@gmail.com> Date: Tue Jul 7 11:29:14 2015 +0800 Fixed crash of invalid pointer derefer commite04500ceda
Author: Xinchen Hui <laruence@gmail.com> Date: Tue Jul 7 11:28:26 2015 +0800 cleanup commit34183e1687
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 04:49:46 2015 +0300 op_array->T_liveliness compression commit2f6ad84579
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 04:44:44 2015 +0300 White spaces commitbe83f115a3
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 04:42:26 2015 +0300 Identation commit1f5084b990
Merge:91b620d
1adf3df
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 04:41:54 2015 +0300 Merge branch 'master' into temporary_cleaning * master: Throw TypeError for invalid callback Fix crash when exception occurs during nested rope Fix crash when exception is thrown during ROPE_END Small cleanup in ternary compilation move the define to the right place fix ext/ldap build Rectify information about invalid shift warning being now ArithmeticError commit91b620d684
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 04:32:04 2015 +0300 Replace GOTO by FREE/FE_FREE and JMP at compile time commit7052e56979
Author: Dmitry Stogov <dmitry@zend.com> Date: Tue Jul 7 02:25:08 2015 +0300 Use zend_regenerate_var_liveliness_info() to regenerate information after pass two. commitae72b0dc67
Merge:a81c4bb
a919fe8
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 21:02:34 2015 +0300 Merge branch 'master' into temporary_cleaning * master: Do not display EXT_TYPE_UNUSED in phpdbg opcodes Run debug build with opcache on travis commita81c4bb8c6
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 20:59:34 2015 +0300 Improved algorithm. It's actually the same algorithm with second loop removed and simpler temporary data structures. The only difference may be in "re-defined" vatriable handling. Now live-range in that case started from the seconnd definition (this must be more safe). commit9a16810f7a
Merge:bbfbe47
001ecd3
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 17:57:45 2015 +0300 Merge branch 'master' into temporary_cleaning * master: Simplify TMP var number decoding (without HashTable) commitbbfbe470c8
Merge:0bda4ab
436b01e
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 17:02:01 2015 +0300 Merge branch 'master' into temporary_cleaning * master: Avoid dangerous optimization Fixed JMPZNZ instruction printing Attempt at falling back on ldap_find_control for Mac OS commit0bda4abea7
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 16:05:33 2015 +0300 Fixed live-range construction for OP_DATA opcode Added comments about algorithm assumtions commit521ad9df98
Merge:4398dab
a09dcb0
Author: Bob Weinand <bobwei9@hotmail.com> Date: Mon Jul 6 14:54:15 2015 +0200 Merge branch 'master' of https://github.com/php/php-src into temporary_cleaning commit4398dab82f
Author: Bob Weinand <bobwei9@hotmail.com> Date: Mon Jul 6 13:51:27 2015 +0200 Add a few phpt tests related to temporary cleaning commit739656f83f
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 14:28:49 2015 +0300 Fixed Zend/tests/foreach_004.phpt failure (FE_FETCH shouldn't be included into TMP vatriablr live range) commit3df462a2bc
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 13:41:02 2015 +0300 Improve data layout (reduce the op_array structure size on 64-bit systems) commit883b73c56e
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Jul 6 13:28:45 2015 +0300 Removed op_array->brk_cont_array commitae5e58b598
Author: Bob Weinand <bobwei9@hotmail.com> Date: Mon Jul 6 04:22:58 2015 +0200 Fix bug with brk_cont variable free / free loop vars via temporary liveliness info commitb4223ca627
Author: Bob Weinand <bobwei9@hotmail.com> Date: Mon Jul 6 04:07:07 2015 +0200 Fix bugs / cleanup fixes commitea33189d22
Author: Xinchen Hui <laruence@gmail.com> Date: Sun Jul 5 20:58:38 2015 +0800 Removed useless TsTop commit1dbb007e4a
Merge:550bbf8
3a8af24
Author: Xinchen Hui <laruence@gmail.com> Date: Sat Jul 4 15:06:44 2015 +0800 Merge branch 'temporary_cleaning' of https://github.com/dstogov/php-src into temporary_cleaning commit3a8af24529
Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Jul 3 16:15:36 2015 +0300 More exceptions from regular liveliness analyses (with explanation in comments). Mark old "unexplained" exceptions with ???. commitba721efa2c
Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Jul 3 14:16:09 2015 +0300 Print list of live temp variables (at least for internal debugging) commit8d1f88fe91
Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Jul 3 13:31:56 2015 +0300 Use op_array->T_liveliness to free incomplete ropes and restore error_reporting level on exception commit80c1d0d779
Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Jul 3 11:05:39 2015 +0300 Don't keep empty T_liveliness commit501ae8aaac
Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Jul 2 22:31:48 2015 +0300 Reverted changes to Zend/zend_arena.h. Reuse CG(arena) instead of creating a new one. commita4fce36907
Merge:6ff7246
fd0fcce
Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Jul 2 22:01:42 2015 +0300 Merge branch 'temporary_cleaning' of github.com:bwoebi/php-src into temporary_cleaning * 'temporary_cleaning' of github.com:bwoebi/php-src: Fix remaining issues with compacted temporaries Fix regression from last commit (+1 ?!) Fix off-by-one (opcache may remove last ZEND_RETURN) Speed algorithm up, more fail safety when reusing temporaries Dumb bug in opcode.c (forgot to update Ts[i]) Fix opcache support Exempt ROPE temporaries from freeing Hmm, we need temporary info for all the opcodes Add opcache support for cleaning in optimization step (Opcache seems to have a few unrelated issues which blow up together with that patch) Add proper temporary cleaning upon frame abortion Fix arena on small sizes (size < sizeof(zend_arena)) commitfd0fcce811
Author: Bob Weinand <bobwei9@hotmail.com> Date: Thu Jul 2 20:00:33 2015 +0200 Fix remaining issues with compacted temporaries commit427dc58bbb
Author: Bob Weinand <bobwei9@hotmail.com> Date: Wed Jul 1 22:49:12 2015 +0200 Fix regression from last commit (+1 ?!) commit1adcf56a6e
Author: Bob Weinand <bobwei9@hotmail.com> Date: Wed Jul 1 22:17:07 2015 +0200 Fix off-by-one (opcache may remove last ZEND_RETURN) commit25b231b784
Author: Bob Weinand <bobwei9@hotmail.com> Date: Wed Jul 1 20:59:24 2015 +0200 Speed algorithm up, more fail safety when reusing temporaries commit22d9d05350
Author: Bob Weinand <bobwei9@hotmail.com> Date: Wed Jul 1 16:48:46 2015 +0200 Dumb bug in opcode.c (forgot to update Ts[i]) commit6538269bfa
Author: Bob Weinand <bobwei9@hotmail.com> Date: Wed Jul 1 13:05:52 2015 +0200 Fix opcache support commit333a7c4a88
Author: Bob Weinand <bobwei9@hotmail.com> Date: Sat Jun 27 22:40:21 2015 +0200 Exempt ROPE temporaries from freeing commit02585f7708
Author: Bob Weinand <bobwei9@hotmail.com> Date: Fri Jun 26 16:20:55 2015 +0200 Hmm, we need temporary info for all the opcodes commitcbcaedbd78
Author: Bob Weinand <bobwei9@hotmail.com> Date: Fri Jun 26 01:04:09 2015 +0200 Add opcache support for cleaning in optimization step (Opcache seems to have a few unrelated issues which blow up together with that patch) commitfef649f406
Author: Bob Weinand <bobwei9@hotmail.com> Date: Fri Jun 26 01:02:27 2015 +0200 Add proper temporary cleaning upon frame abortion commit1cec2e7271
Author: Bob Weinand <bobwei9@hotmail.com> Date: Thu Jun 25 23:33:21 2015 +0200 Fix arena on small sizes (size < sizeof(zend_arena))
225 lines
6.5 KiB
C
225 lines
6.5 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| PHP Version 7 |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 1997-2015 The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Authors: Felipe Pena <felipe@php.net> |
|
|
| Authors: Joe Watkins <joe.watkins@live.co.uk> |
|
|
| Authors: Bob Weinand <bwoebi@php.net> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#include "phpdbg.h"
|
|
#include "zend_vm_opcodes.h"
|
|
#include "zend_compile.h"
|
|
#include "phpdbg_opcode.h"
|
|
#include "phpdbg_utils.h"
|
|
#include "ext/standard/php_string.h"
|
|
#include "zend_smart_str.h"
|
|
|
|
ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
|
|
|
|
static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t type) /* {{{ */
|
|
{
|
|
char *decode = NULL;
|
|
|
|
switch (type) {
|
|
case IS_CV: {
|
|
zend_string *var = ops->vars[EX_VAR_TO_NUM(op->var)];
|
|
asprintf(&decode, "$%.*s%c", ZSTR_LEN(var) <= 19 ? (int) ZSTR_LEN(var) : 18, ZSTR_VAL(var), ZSTR_LEN(var) <= 19 ? 0 : '+');
|
|
} break;
|
|
|
|
case IS_VAR:
|
|
case IS_TMP_VAR: {
|
|
asprintf(&decode, "@%" PRIu32, EX_VAR_TO_NUM(op->var) - ops->last_var);
|
|
} break;
|
|
case IS_CONST: {
|
|
zval *literal = RT_CONSTANT(ops, *op);
|
|
decode = phpdbg_short_zval_print(literal, 20);
|
|
} break;
|
|
}
|
|
return decode;
|
|
} /* }}} */
|
|
|
|
char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */
|
|
{
|
|
char *decode[4] = {NULL, NULL, NULL, NULL};
|
|
|
|
/* OP1 */
|
|
switch (op->opcode) {
|
|
case ZEND_JMP:
|
|
case ZEND_FAST_CALL:
|
|
asprintf(&decode[1], "J%ld", OP_JMP_ADDR(op, op->op1) - ops->opcodes);
|
|
break;
|
|
|
|
case ZEND_INIT_FCALL:
|
|
case ZEND_RECV:
|
|
case ZEND_RECV_INIT:
|
|
case ZEND_RECV_VARIADIC:
|
|
asprintf(&decode[1], "%" PRIu32, op->op1.num);
|
|
break;
|
|
|
|
default:
|
|
decode[1] = phpdbg_decode_op(ops, &op->op1, op->op1_type);
|
|
break;
|
|
}
|
|
|
|
/* OP2 */
|
|
switch (op->opcode) {
|
|
/* TODO: ZEND_FAST_CALL, ZEND_FAST_RET op2 */
|
|
case ZEND_JMPZNZ:
|
|
asprintf(&decode[2], "J%u or J%" PRIu32, OP_JMP_ADDR(op, op->op2) - ops->opcodes, ZEND_OFFSET_TO_OPLINE(op, op->extended_value) - ops->opcodes);
|
|
break;
|
|
|
|
case ZEND_JMPZ:
|
|
case ZEND_JMPNZ:
|
|
case ZEND_JMPZ_EX:
|
|
case ZEND_JMPNZ_EX:
|
|
case ZEND_JMP_SET:
|
|
case ZEND_ASSERT_CHECK:
|
|
asprintf(&decode[2], "J%ld", OP_JMP_ADDR(op, op->op2) - ops->opcodes);
|
|
break;
|
|
|
|
case ZEND_SEND_VAL:
|
|
case ZEND_SEND_VAL_EX:
|
|
case ZEND_SEND_VAR:
|
|
case ZEND_SEND_VAR_NO_REF:
|
|
case ZEND_SEND_REF:
|
|
case ZEND_SEND_VAR_EX:
|
|
case ZEND_SEND_USER:
|
|
asprintf(&decode[2], "%" PRIu32, op->op2.num);
|
|
break;
|
|
|
|
default:
|
|
decode[2] = phpdbg_decode_op(ops, &op->op2, op->op2_type);
|
|
break;
|
|
}
|
|
|
|
/* RESULT */
|
|
switch (op->opcode) {
|
|
case ZEND_CATCH:
|
|
asprintf(&decode[2], "%" PRIu32, op->result.num);
|
|
break;
|
|
default:
|
|
decode[3] = phpdbg_decode_op(ops, &op->result, op->result_type);
|
|
break;
|
|
}
|
|
|
|
#if 1
|
|
if (ops->T_liveliness) {
|
|
uint32_t *var = ops->T_liveliness + (op - ops->opcodes);
|
|
|
|
if (*var != (uint32_t)-1) {
|
|
smart_str str = {0};
|
|
|
|
var = ops->T_liveliness + (*var);
|
|
smart_str_appends(&str, "; [@");
|
|
smart_str_append_long(&str, EX_VAR_TO_NUM(((*var) & ~0x3)) - ops->last_var);
|
|
while (*(++var) != (uint32_t)-1) {
|
|
smart_str_appends(&str, ", @");
|
|
smart_str_append_long(&str, EX_VAR_TO_NUM(((*var) & ~0x3)) - ops->last_var);
|
|
}
|
|
smart_str_appendc(&str, ']');
|
|
smart_str_0(&str);
|
|
|
|
asprintf(&decode[0],
|
|
"%-20s %-20s %-20s%-20s",
|
|
decode[1] ? decode[1] : "",
|
|
decode[2] ? decode[2] : "",
|
|
decode[3] ? decode[3] : "",
|
|
ZSTR_VAL(str.s));
|
|
|
|
smart_str_free(&str);
|
|
|
|
if (decode[1])
|
|
free(decode[1]);
|
|
if (decode[2])
|
|
free(decode[2]);
|
|
if (decode[3])
|
|
free(decode[3]);
|
|
|
|
return decode[0];
|
|
}
|
|
}
|
|
#endif
|
|
|
|
asprintf(&decode[0],
|
|
"%-20s %-20s %-20s",
|
|
decode[1] ? decode[1] : "",
|
|
decode[2] ? decode[2] : "",
|
|
decode[3] ? decode[3] : "");
|
|
|
|
if (decode[1])
|
|
free(decode[1]);
|
|
if (decode[2])
|
|
free(decode[2]);
|
|
if (decode[3])
|
|
free(decode[3]);
|
|
|
|
return decode[0];
|
|
} /* }}} */
|
|
|
|
void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_flags) /* {{{ */
|
|
{
|
|
/* force out a line while stepping so the user knows what is happening */
|
|
if (ignore_flags ||
|
|
(!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) ||
|
|
(PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ||
|
|
(PHPDBG_G(oplog)))) {
|
|
|
|
zend_op *opline = (zend_op *) execute_data->opline;
|
|
char *decode = phpdbg_decode_opline(&execute_data->func->op_array, opline);
|
|
|
|
if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) {
|
|
/* output line info */
|
|
phpdbg_notice("opline", "line=\"%u\" opline=\"%p\" opcode=\"%s\" op=\"%s\" file=\"%s\"", "L%-5u %16p %-30s %s %s",
|
|
opline->lineno,
|
|
opline,
|
|
phpdbg_decode_opcode(opline->opcode),
|
|
decode,
|
|
execute_data->func->op_array.filename ? ZSTR_VAL(execute_data->func->op_array.filename) : "unknown");
|
|
}
|
|
|
|
if (!ignore_flags && PHPDBG_G(oplog)) {
|
|
phpdbg_log_ex(fileno(PHPDBG_G(oplog)), "L%-5u %16p %-30s %s %s",
|
|
opline->lineno,
|
|
opline,
|
|
phpdbg_decode_opcode(opline->opcode),
|
|
decode,
|
|
execute_data->func->op_array.filename ? ZSTR_VAL(execute_data->func->op_array.filename) : "unknown");
|
|
}
|
|
|
|
if (decode) {
|
|
free(decode);
|
|
}
|
|
}
|
|
|
|
if (PHPDBG_G(oplog_list)) {
|
|
phpdbg_oplog_entry *cur = zend_arena_alloc(&PHPDBG_G(oplog_arena), sizeof(phpdbg_oplog_entry));
|
|
cur->op = (zend_op *) execute_data->opline;
|
|
cur->op_array = &execute_data->func->op_array;
|
|
cur->next = NULL;
|
|
PHPDBG_G(oplog_cur)->next = cur;
|
|
PHPDBG_G(oplog_cur) = cur;
|
|
}
|
|
} /* }}} */
|
|
|
|
void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags) /* {{{ */
|
|
{
|
|
phpdbg_print_opline_ex(execute_data, ignore_flags);
|
|
} /* }}} */
|
|
|
|
const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */
|
|
{
|
|
const char *ret = zend_get_opcode_name(opcode);
|
|
return ret?ret:"UNKNOWN";
|
|
} /* }}} */
|