From 1082669e241a6c0b217d12b88a0c42de6d813e55 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 17 Jun 2021 14:21:40 +0300 Subject: [PATCH] JIT: Fixed failures of tracing JIT with CALL VM This fixes: - tests/lang/bug28800.phpt - Zend/tests/settype_resource.phpt - Zend/tests/type_declarations/scalar_return_basic_64bit.phpt --- ext/opcache/jit/zend_jit_trace.c | 2 +- ext/opcache/jit/zend_jit_x86.dasc | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 8353c3cec04..ebc7cb1a191 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6452,11 +6452,11 @@ static const void *zend_jit_trace_exit_to_vm(uint32_t trace_num, uint32_t exit_n opline = zend_jit_traces[trace_num].exit_info[exit_num].opline; if (opline) { - zend_jit_set_ip(&dasm_state, opline); if (opline == zend_jit_traces[zend_jit_traces[trace_num].root].opline) { /* prevent endless loop */ original_handler = 1; } + zend_jit_set_ip_ex(&dasm_state, opline, original_handler); } zend_jit_trace_return(&dasm_state, original_handler); diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 75c36269e73..aa8d15f86f5 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -3053,6 +3053,24 @@ static int zend_jit_set_ip(dasm_State **Dst, const zend_op *opline) return 1; } +static int zend_jit_set_ip_ex(dasm_State **Dst, const zend_op *opline, bool set_ip_reg) +{ + if (last_valid_opline == opline) { + zend_jit_use_last_valid_opline(); + } else if (GCC_GLOBAL_REGS && last_valid_opline) { + zend_jit_use_last_valid_opline(); + | ADD_IP (opline - last_valid_opline) * sizeof(zend_op); + } else if (!GCC_GLOBAL_REGS && set_ip_reg) { + | LOAD_ADDR RX, opline + | mov aword EX->opline, RX + } else { + | LOAD_IP_ADDR opline + } + zend_jit_set_last_valid_opline(opline); + + return 1; +} + static int zend_jit_set_valid_ip(dasm_State **Dst, const zend_op *opline) { if (delayed_call_chain) {