Skip to content

Commit bfc56ed

Browse files
committed
Keep trace number in EG(jit_trace_num) instead of EG(reserved)[zend_func_info_rid]
1 parent 3376f19 commit bfc56ed

File tree

5 files changed

+8
-14
lines changed

5 files changed

+8
-14
lines changed

Zend/zend_execute_API.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,9 +794,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
794794
if (func->type == ZEND_USER_FUNCTION) {
795795
int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0;
796796
const zend_op *current_opline_before_exception = EG(opline_before_exception);
797+
uint32_t orig_jit_trace_num = EG(jit_trace_num);
797798

798799
zend_init_func_execute_data(call, &func->op_array, fci->retval);
799800
zend_execute_ex(call);
801+
EG(jit_trace_num) = orig_jit_trace_num;
800802
EG(opline_before_exception) = current_opline_before_exception;
801803
if (call_via_handler) {
802804
/* We must re-initialize function again */

Zend/zend_globals.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ struct _zend_executor_globals {
164164
struct _zend_execute_data *current_execute_data;
165165
zend_class_entry *fake_scope; /* used to avoid checks accessing properties */
166166

167+
uint32_t jit_trace_num; /* Used by tracing JIT to reference the currently running trace */
168+
167169
zend_long precision;
168170

169171
int ticks_count;

ext/opcache/jit/zend_jit_disasm_x86.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ static int zend_jit_disasm_init(void)
385385
REGISTER_EG(vm_stack_top);
386386
REGISTER_EG(vm_stack_end);
387387
REGISTER_EG(symbol_table);
388+
REGISTER_EG(jit_trace_num);
388389
#undef REGISTER_EG
389390
#endif
390391

ext/opcache/jit/zend_jit_trace.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4994,7 +4994,7 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
49944994

49954995
int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf *regs)
49964996
{
4997-
uint32_t trace_num = (uint32_t)(uintptr_t)EG(reserved)[zend_func_info_rid];
4997+
uint32_t trace_num = EG(jit_trace_num);
49984998
zend_execute_data *execute_data = EG(current_execute_data);
49994999
const zend_op *orig_opline = EX(opline);
50005000
const zend_op *opline;

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,8 +2853,8 @@ static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num)
28532853
{
28542854
current_trace_num = trace_num;
28552855

2856-
| //EG(reserved)[zend_func_info_rid] = trace_num;
2857-
| MEM_OP2_1_ZTS mov, aword, executor_globals, reserved[zend_func_info_rid], trace_num, r0
2856+
| // EG(jit_trace_num) = trace_num;
2857+
| MEM_OP2_1_ZTS mov, dword, executor_globals, jit_trace_num, trace_num, r0
28582858

28592859
return 1;
28602860
}
@@ -8588,17 +8588,6 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
85888588
| call aword [r0 + offsetof(zend_internal_function, handler)]
85898589
}
85908590

8591-
if (trace) {
8592-
// TODO: This is a quick dirty fix ??????
8593-
//
8594-
// Internal function may call another trace that,
8595-
// replaces EG(trace_id) and the following side exit
8596-
// from this trace is going to be mad !!!!!!
8597-
//
8598-
// Lets set EG(trace_id) once again...
8599-
zend_jit_trace_begin(Dst, current_trace_num);
8600-
}
8601-
86028591
| // EG(current_execute_data) = execute_data;
86038592
| MEM_OP2_1_ZTS mov, aword, executor_globals, current_execute_data, FP, r0
86048593

0 commit comments

Comments
 (0)