_(RECURSIVE_CALL, "recursive call") \
_(RECURSIVE_RET, "recursive return") \
_(RETURN, "return") \
+ _(RETURN_HALT, "return from interpreter") \
_(LINK, "link to another trace") \
/* compilation and linking successful */ \
_(COMPILED, "compiled") \
}
t->link = zend_jit_find_trace(p->opline->handler);
zend_jit_trace_link_to_root(&dasm_state, &zend_jit_traces[t->link]);
- } else if (p->stop == ZEND_JIT_TRACE_STOP_RETURN) {
+ } else if (p->stop == ZEND_JIT_TRACE_STOP_RETURN
+ || p->stop == ZEND_JIT_TRACE_STOP_RETURN_HALT) {
zend_jit_trace_return(&dasm_state, 0);
} else {
// TODO: not implemented ???
{
const zend_op *orig_opline;
zend_jit_trace_stop stop;
+ int ret = 0;
zend_op_array *op_array;
zend_jit_op_array_trace_extension *jit_extension;
size_t offset;
}
if (ZEND_JIT_TRACE_STOP_OK(stop)) {
+ if (stop == ZEND_JIT_TRACE_STOP_RETURN_HALT) {
+ ret = -1;
+ }
if (JIT_G(debug) & ZEND_JIT_DEBUG_TRACE_STOP) {
if (stop == ZEND_JIT_TRACE_STOP_LINK) {
uint32_t idx = trace_buffer[1].last;
goto abort;
}
} else {
+ if (stop == ZEND_JIT_TRACE_STOP_HALT) {
+ ret = -1;
+ }
abort:
if (JIT_G(debug) & ZEND_JIT_DEBUG_TRACE_ABORT) {
fprintf(stderr, "---- TRACE %d abort (%s)\n",
fprintf(stderr, "\n");
}
- return (stop == ZEND_JIT_TRACE_STOP_HALT) ? -1 : 0;
+ return ret;
}
static void zend_jit_blacklist_trace_exit(uint32_t trace_num, uint32_t exit_num)
int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint32_t parent_num, uint32_t exit_num)
{
zend_jit_trace_stop stop;
+ int ret = 0;
uint32_t trace_num;
zend_jit_trace_rec trace_buffer[ZEND_JIT_TRACE_MAX_LENGTH];
}
if (ZEND_JIT_TRACE_STOP_OK(stop)) {
+ if (stop == ZEND_JIT_TRACE_STOP_RETURN_HALT) {
+ ret = -1;
+ }
if (JIT_G(debug) & ZEND_JIT_DEBUG_TRACE_STOP) {
if (stop == ZEND_JIT_TRACE_STOP_LINK) {
uint32_t idx = trace_buffer[1].last;
goto abort;
}
} else {
+ if (stop == ZEND_JIT_TRACE_STOP_HALT) {
+ ret = -1;
+ }
abort:
if (JIT_G(debug) & ZEND_JIT_DEBUG_TRACE_ABORT) {
fprintf(stderr, "---- TRACE %d abort (%s)\n",
fprintf(stderr, "\n");
}
- return (stop == ZEND_JIT_TRACE_STOP_HALT) ? -1 : 0;
+ return ret;
}
int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf *regs)
#ifdef HAVE_GCC_GLOBAL_REGS
handler();
if (UNEXPECTED(opline == zend_jit_halt_op)) {
- stop = ZEND_JIT_TRACE_STOP_HALT;
+ stop = ZEND_JIT_TRACE_STOP_RETURN_HALT;
break;
}
if (UNEXPECTED(execute_data != prev_execute_data)) {
rc = handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
if (rc != 0) {
if (rc < 0) {
- stop = ZEND_JIT_TRACE_STOP_HALT;
+ stop = ZEND_JIT_TRACE_STOP_RETRUN_HALT;
break;
}
execute_data = EG(current_execute_data);