Skip to content

Commit 7976127

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: assign_002.phpt
Reference is involved in this test case, i.e. "$ref2 = & $ref1;". 1. Fix one bug in zend_do_fcall(). For each stack slot, the type information gets initialized during the call frame allocation phase. Opcode ZEND_ASSIGN_REF is associated to this statement. It's worth noting that PHP JIT doesn't apply to this opcode actually. That means the original handler(i.e. interpreter version) will be invoked at runtime. Note that this mode works for a number of opcodes, not only ZEND_ASSIGN_REF. In the execution of original handler, the runtime type information of $ref2 is accessed and this bug is triggered. 2. Support macros GET_Z_PTR and ZVAL_DEREF. 3. Cover new paths in function zend_jit_simple_assign() and macro ZVAL_COPY_CONST.
1 parent 657b00d commit 7976127

File tree

1 file changed

+56
-8
lines changed

1 file changed

+56
-8
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,11 @@ static void* dasm_labels[zend_lb_MAX];
461461

462462
|.macro SET_ZVAL_TYPE_INFO, addr, type, tmp_reg1, tmp_reg2
463463
|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL);
464-
| LOAD_32BIT_VAL tmp_reg1, type
464+
|| if (type <= MAX_IMM12) {
465+
| mov tmp_reg1, #type
466+
|| } else {
467+
| LOAD_32BIT_VAL tmp_reg1, type
468+
|| }
465469
| SAFE_MEM_ACC_WITH_UOFFSET str, tmp_reg1, Rx(Z_REG(addr)), Z_OFFSET(addr)+offsetof(zval,u1.type_info), tmp_reg2
466470
|.endmacro
467471

@@ -471,7 +475,7 @@ static void* dasm_labels[zend_lb_MAX];
471475
|.endmacro
472476

473477
|.macro GET_Z_PTR, reg, zv
474-
| mov reg, aword [zv]
478+
| ldr reg, [zv]
475479
|.endmacro
476480

477481
|.macro SET_Z_PTR, zv, val
@@ -737,7 +741,6 @@ static void* dasm_labels[zend_lb_MAX];
737741
|| }
738742
|| if (Z_MODE(dst_addr) == IS_MEM_ZVAL) {
739743
|| if (dst_def_info == MAY_BE_DOUBLE) {
740-
| brk #0 // TODO: test
741744
|| if ((dst_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) {
742745
| SET_ZVAL_TYPE_INFO dst_addr, IS_DOUBLE, Rw(tmp_reg1), Rx(tmp_reg2)
743746
|| }
@@ -957,11 +960,10 @@ static void* dasm_labels[zend_lb_MAX];
957960
|.endmacro
958961

959962
|.macro ZVAL_DEREF, reg, info, tmp_reg
960-
| brk #0 // TODO
961963
|| if (info & MAY_BE_REF) {
962964
| IF_NOT_Z_TYPE, reg, IS_REFERENCE, >1, tmp_reg
963965
| GET_Z_PTR reg, reg
964-
| add reg, offsetof(zend_reference, val)
966+
| add reg, reg, #offsetof(zend_reference, val)
965967
|1:
966968
|| }
967969
|.endmacro
@@ -3126,7 +3128,44 @@ static int zend_jit_simple_assign(dasm_State **Dst,
31263128
| brk #0 // TODO
31273129
}
31283130
} else {
3129-
| brk #0 // TODO
3131+
if (val_info & MAY_BE_UNDEF) {
3132+
| brk #0
3133+
}
3134+
if (val_info & MAY_BE_REF) {
3135+
if (val_type == IS_CV) {
3136+
ZEND_ASSERT(Z_REG(var_addr) != ZREG_REG2);
3137+
if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_REG2 || Z_OFFSET(val_addr) != 0) {
3138+
| LOAD_ZVAL_ADDR REG2, val_addr
3139+
}
3140+
| ZVAL_DEREF REG2, val_info, TMP1w
3141+
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG2, 0);
3142+
} else {
3143+
zend_jit_addr ref_addr;
3144+
3145+
| brk #0
3146+
}
3147+
}
3148+
3149+
if (!res_addr) {
3150+
| ZVAL_COPY_VALUE var_addr, var_info, val_addr, val_info, ZREG_REG2, tmp_reg, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
3151+
} else {
3152+
| brk #0 // TODO
3153+
}
3154+
3155+
if (val_type == IS_CV) {
3156+
if (!res_addr) {
3157+
| lsr REG2w, REG2w, #8
3158+
| and REG2w, REG2w, #0xff
3159+
| TRY_ADDREF val_info, REG2w, Rx(tmp_reg), TMP1
3160+
} else {
3161+
| brk #0 // TODO
3162+
}
3163+
} else {
3164+
if (res_addr) {
3165+
| brk #0 // TODO
3166+
}
3167+
}
3168+
|3:
31303169
}
31313170
return 1;
31323171
}
@@ -4379,9 +4418,18 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
43794418
} else {
43804419
| ldr REG2w, [REG0, #offsetof(zend_op_array, last_var)]
43814420
}
4382-
| sub REG2w, REG2w, REG1w
4421+
| subs REG2w, REG2w, REG1w
43834422
| ble >3
4384-
| brk #0 // TODO: test
4423+
| // zval *var = EX_VAR_NUM(num_args);
4424+
| lsl REG1, REG1, #4
4425+
| add REG1, REG1, FP
4426+
|| ZEND_ASSERT(ZEND_CALL_FRAME_SLOT * sizeof(zval) <= MAX_IMM12);
4427+
| add REG1, REG1, #(ZEND_CALL_FRAME_SLOT * sizeof(zval))
4428+
|2:
4429+
| SET_Z_TYPE_INFO REG1, IS_UNDEF, TMP1w
4430+
| add REG1, REG1, #16
4431+
| subs REG2w, REG2w, #1
4432+
| bne <2
43854433
|3:
43864434
}
43874435

0 commit comments

Comments
 (0)