Skip to content

Commit 7999b0d

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: assign_036.phpt
This patch mainly supports the opcode FETCH_OBJ_R for statement "$a->result = "okey";".
1 parent aaf8a6b commit 7999b0d

File tree

1 file changed

+196
-1
lines changed

1 file changed

+196
-1
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 196 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6049,7 +6049,202 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
60496049
ZEND_ASSERT(opline->op2_type == IS_CONST);
60506050
ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
60516051

6052-
| brk #0 // TODO
6052+
member = RT_CONSTANT(opline, opline->op2);
6053+
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
6054+
prop_info = zend_get_known_property_info(op_array, ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6055+
6056+
if (opline->op1_type == IS_UNUSED || use_this) {
6057+
| brk #0 // TODO
6058+
| GET_ZVAL_PTR FCARG1x, this_addr, TMP1
6059+
} else {
6060+
if (opline->op1_type == IS_VAR
6061+
&& opline->opcode == ZEND_FETCH_OBJ_W
6062+
&& (op1_info & MAY_BE_INDIRECT)
6063+
&& Z_REG(op1_addr) == ZREG_FP) {
6064+
| brk #0 // TODO
6065+
|1:
6066+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6067+
}
6068+
if (op1_info & MAY_BE_REF) {
6069+
if (Z_REG(op1_addr) != ZREG_FCARG1x || Z_OFFSET(op1_addr) != 0) {
6070+
| LOAD_ZVAL_ADDR FCARG1x, op1_addr
6071+
}
6072+
| ZVAL_DEREF FCARG1x, op1_info, TMP1w
6073+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6074+
}
6075+
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) {
6076+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
6077+
int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
6078+
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
6079+
6080+
if (!exit_addr) {
6081+
return 0;
6082+
}
6083+
| brk #0 // TODO
6084+
} else {
6085+
| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >7, TMP1w, TMP2
6086+
}
6087+
}
6088+
| GET_ZVAL_PTR FCARG1x, op1_addr, TMP1
6089+
}
6090+
6091+
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
6092+
prop_info = zend_get_known_property_info(op_array, trace_ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6093+
if (prop_info) {
6094+
ce = trace_ce;
6095+
ce_is_instanceof = 0;
6096+
if (!(op1_info & MAY_BE_CLASS_GUARD)) {
6097+
if (!zend_jit_class_guard(Dst, opline, trace_ce)) {
6098+
return 0;
6099+
}
6100+
if (ssa->var_info && ssa_op->op1_use >= 0) {
6101+
ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD;
6102+
ssa->var_info[ssa_op->op1_use].ce = ce;
6103+
ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof;
6104+
}
6105+
}
6106+
}
6107+
}
6108+
6109+
if (!prop_info) {
6110+
| ldr REG0, EX->run_time_cache
6111+
| LOAD_32BIT_VAL TMP1, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
6112+
| add TMP1, TMP1, REG0
6113+
| ldr REG2, [TMP1]
6114+
| ldr TMP1, [FCARG1x, #offsetof(zend_object, ce)]
6115+
| cmp REG2, TMP1
6116+
| bne >5
6117+
| brk #0 // TODO: currently jump to Label 5.
6118+
| LOAD_32BIT_VAL TMP1, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*)
6119+
| add TMP1, TMP1, REG0
6120+
| ldr REG0, [TMP1]
6121+
may_be_dynamic = zend_may_be_dynamic_property(ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6122+
if (may_be_dynamic) {
6123+
| brk #0 // TODO
6124+
| tst REG0, REG0
6125+
if (opline->opcode == ZEND_FETCH_OBJ_W) {
6126+
| brk #0 // TODO
6127+
| blt >5
6128+
} else {
6129+
| brk #0 // TODO
6130+
| blt >8 // dynamic property
6131+
}
6132+
}
6133+
| brk #0 // TODO
6134+
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6135+
if (opline->opcode == ZEND_FETCH_OBJ_W
6136+
&& (opline->extended_value & ZEND_FETCH_OBJ_FLAGS)
6137+
&& (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS))) {
6138+
uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
6139+
6140+
| brk #0 // TODO
6141+
|.cold_code
6142+
|1:
6143+
| brk #0 // TODO
6144+
|.code
6145+
}
6146+
} else {
6147+
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, prop_info->offset);
6148+
| brk #0 // TODO
6149+
}
6150+
if (op1_avoid_refcounting) {
6151+
SET_STACK_REG(JIT_G(current_frame)->stack,
6152+
EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
6153+
}
6154+
6155+
if (opline->opcode == ZEND_FETCH_OBJ_W) {
6156+
if (Z_REG(prop_addr) != ZREG_FCARG1x || Z_OFFSET(prop_addr) != 0) {
6157+
| brk #0 // TODO
6158+
| LOAD_ZVAL_ADDR FCARG1x, prop_addr
6159+
}
6160+
| brk #0 // TODO
6161+
| SET_ZVAL_PTR res_addr, FCARG1x, TMP1
6162+
| SET_ZVAL_TYPE_INFO res_addr, IS_INDIRECT, TMP1w, TMP2
6163+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && prop_info) {
6164+
ssa->var_info[ssa_op->result_def].indirect_reference = 1;
6165+
}
6166+
} else {
6167+
bool result_avoid_refcounting = 0;
6168+
6169+
if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info) {
6170+
uint32_t flags = 0;
6171+
uint32_t old_info;
6172+
zend_jit_trace_stack *stack = JIT_G(current_frame)->stack;
6173+
int32_t exit_point;
6174+
const void *exit_addr;
6175+
zend_uchar type;
6176+
zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
6177+
6178+
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR))
6179+
&& !use_this
6180+
&& !op1_avoid_refcounting) {
6181+
flags = ZEND_JIT_EXIT_FREE_OP1;
6182+
}
6183+
6184+
| brk #0 // TODO
6185+
} else {
6186+
if (!zend_jit_zval_copy_deref(Dst, res_addr, prop_addr, ZREG_REG2)) {
6187+
return 0;
6188+
}
6189+
}
6190+
}
6191+
6192+
|.cold_code
6193+
6194+
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || !prop_info) {
6195+
|5:
6196+
| SET_EX_OPLINE opline, REG0
6197+
if (opline->opcode == ZEND_FETCH_OBJ_W) {
6198+
| brk #0 // TODO
6199+
| EXT_CALL zend_jit_fetch_obj_w_slow, REG0
6200+
} else if (opline->opcode != ZEND_FETCH_OBJ_IS) {
6201+
| EXT_CALL zend_jit_fetch_obj_r_slow, REG0
6202+
} else {
6203+
| brk #0 // TODO
6204+
| EXT_CALL zend_jit_fetch_obj_is_slow, REG0
6205+
}
6206+
| b >9
6207+
}
6208+
6209+
if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
6210+
|7:
6211+
| brk #0 // TODO
6212+
}
6213+
6214+
if (!prop_info
6215+
&& may_be_dynamic
6216+
&& opline->opcode != ZEND_FETCH_OBJ_W) {
6217+
|8:
6218+
| brk #0 // TODO
6219+
}
6220+
6221+
|.code;
6222+
|9: // END
6223+
if (opline->op1_type != IS_UNUSED && !use_this && !op1_indirect) {
6224+
if (opline->op1_type == IS_VAR
6225+
&& opline->opcode == ZEND_FETCH_OBJ_W
6226+
&& (op1_info & MAY_BE_RC1)) {
6227+
zend_jit_addr orig_op1_addr = OP1_ADDR();
6228+
6229+
| brk #0 // TODO
6230+
} else if (!op1_avoid_refcounting) {
6231+
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
6232+
}
6233+
}
6234+
6235+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE
6236+
&& prop_info
6237+
&& opline->op1_type != IS_VAR
6238+
&& opline->op1_type != IS_TMP_VAR) {
6239+
may_throw = 0;
6240+
}
6241+
6242+
if (may_throw) {
6243+
if (!zend_jit_check_exception(Dst)) {
6244+
return 0;
6245+
}
6246+
}
6247+
60536248
return 1;
60546249
}
60556250

0 commit comments

Comments
 (0)