Skip to content

Commit

Permalink
Fixed tracing JIT for ASSIGN to typed reference
Browse files Browse the repository at this point in the history
  • Loading branch information
dstogov committed Jul 15, 2020
1 parent 272b887 commit ebb94af
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 29 deletions.
10 changes: 5 additions & 5 deletions ext/opcache/jit/zend_jit_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -1632,7 +1632,7 @@ static void ZEND_FASTCALL zend_jit_vm_stack_free_args_helper(zend_execute_data *
zend_vm_stack_free_args(call);
}

static zend_always_inline void zend_jit_assign_to_typed_ref(zend_reference *ref, zval *value, zend_uchar value_type)
static zend_always_inline void zend_jit_assign_to_typed_ref_helper(zend_reference *ref, zval *value, zend_uchar value_type)
{
zval variable;

Expand All @@ -1642,22 +1642,22 @@ static zend_always_inline void zend_jit_assign_to_typed_ref(zend_reference *ref,

static void ZEND_FASTCALL zend_jit_assign_const_to_typed_ref(zend_reference *ref, zval *value)
{
zend_jit_assign_to_typed_ref(ref, value, IS_CONST);
zend_jit_assign_to_typed_ref_helper(ref, value, IS_CONST);
}

static void ZEND_FASTCALL zend_jit_assign_tmp_to_typed_ref(zend_reference *ref, zval *value)
{
zend_jit_assign_to_typed_ref(ref, value, IS_TMP_VAR);
zend_jit_assign_to_typed_ref_helper(ref, value, IS_TMP_VAR);
}

static void ZEND_FASTCALL zend_jit_assign_var_to_typed_ref(zend_reference *ref, zval *value)
{
zend_jit_assign_to_typed_ref(ref, value, IS_VAR);
zend_jit_assign_to_typed_ref_helper(ref, value, IS_VAR);
}

static void ZEND_FASTCALL zend_jit_assign_cv_to_typed_ref(zend_reference *ref, zval *value)
{
zend_jit_assign_to_typed_ref(ref, value, IS_CV);
zend_jit_assign_to_typed_ref_helper(ref, value, IS_CV);
}


Expand Down
3 changes: 3 additions & 0 deletions ext/opcache/jit/zend_jit_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -3341,6 +3341,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
if (!zend_jit_fetch_reference(&dasm_state, opline, orig_op1_type, &op1_info, &op1_addr, 0)) {
goto jit_failure;
}
if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, op_array, opline->op2_type, op2_addr, 1)) {
goto jit_failure;
}
op1_def_addr = op1_addr;
} else {
USE_OP1_TRACE_TYPE();
Expand Down
66 changes: 42 additions & 24 deletions ext/opcache/jit/zend_jit_x86.dasc
Original file line number Diff line number Diff line change
Expand Up @@ -5389,6 +5389,44 @@ static int zend_jit_simple_assign(dasm_State **Dst,
return 1;
}

static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
const zend_op *opline,
const zend_op_array *op_array,
zend_uchar val_type,
zend_jit_addr val_addr,
zend_bool check_exception)
{
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
| jnz >2
|.cold_code
|2:
| LOAD_ZVAL_ADDR FCARG2a, val_addr
| SAVE_VALID_OPLINE opline, r0
if (val_type == IS_CONST) {
| EXT_CALL zend_jit_assign_const_to_typed_ref, r0
} else if (val_type == IS_TMP_VAR) {
| EXT_CALL zend_jit_assign_tmp_to_typed_ref, r0
} else if (val_type == IS_VAR) {
| EXT_CALL zend_jit_assign_var_to_typed_ref, r0
} else if (val_type == IS_CV) {
| EXT_CALL zend_jit_assign_cv_to_typed_ref, r0
} else {
ZEND_UNREACHABLE();
}
if (check_exception) {
| // if (UNEXPECTED(EG(exception) != NULL)) {
| MEM_OP2_1_ZTS cmp, aword, executor_globals, exception, 0, r0
| je >8 // END OF zend_jit_assign_to_variable()
| jmp ->exception_handler
} else {
| jmp >8
}
|.code

return 1;
}

static int zend_jit_assign_to_variable(dasm_State **Dst,
const zend_op *opline,
const zend_op_array *op_array,
Expand All @@ -5415,26 +5453,10 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >1
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
| GET_Z_PTR FCARG1a, FCARG1a
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
| jnz >2
| add FCARG1a, offsetof(zend_reference, val)
|.cold_code
|2:
| LOAD_ZVAL_ADDR FCARG2a, val_addr
| SAVE_VALID_OPLINE opline, r0
if (val_type == IS_CONST) {
| EXT_CALL zend_jit_assign_const_to_typed_ref, r0
} else if (val_type == IS_TMP_VAR) {
| EXT_CALL zend_jit_assign_tmp_to_typed_ref, r0
} else if (val_type == IS_VAR) {
| EXT_CALL zend_jit_assign_var_to_typed_ref, r0
} else if (val_type == IS_CV) {
| EXT_CALL zend_jit_assign_cv_to_typed_ref, r0
} else {
ZEND_UNREACHABLE();
if (!zend_jit_assign_to_typed_ref(Dst, opline, op_array, val_type, val_addr, check_exception)) {
return 0;
}
| jmp >8
|.code
| add FCARG1a, offsetof(zend_reference, val)
|1:
}
if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
Expand Down Expand Up @@ -7878,7 +7900,7 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
}

if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
may_throw && !(op1_info & MAY_BE_REF) && (op1_info & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)))) {
may_throw)) {
return 0;
}
if (!zend_jit_store_var_if_necessary_ex(Dst, opline->op1.var, op1_addr, op1_def_info, op1_use_addr, op1_info)) {
Expand All @@ -7890,10 +7912,6 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
}
}

if (may_throw && (op1_info & MAY_BE_REF)) {
zend_jit_check_exception(Dst);
}

return 1;
}

Expand Down

0 comments on commit ebb94af

Please sign in to comment.