Skip to content

Commit 4123cc3

Browse files
committed
Fix the ordering of zend_jit_return to match ZEND_RETURN_SPEC_OBSERVER
1 parent a87ccc7 commit 4123cc3

File tree

2 files changed

+148
-156
lines changed

2 files changed

+148
-156
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 75 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -11022,21 +11022,6 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
1102211022
return_value_used = -1;
1102311023
}
1102411024

11025-
if (ZEND_OBSERVER_ENABLED) {
11026-
if (Z_MODE(op1_addr) == IS_REG) {
11027-
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11028-
11029-
if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11030-
return 0;
11031-
}
11032-
op1_addr = dst;
11033-
}
11034-
| LOAD_ZVAL_ADDR FCARG2x, op1_addr
11035-
| mov FCARG1x, FP
11036-
| SET_EX_OPLINE opline, REG0
11037-
| EXT_CALL zend_observer_fcall_end, REG0
11038-
}
11039-
1104011025
// if (!EX(return_value))
1104111026
if (Z_MODE(op1_addr) == IS_REG && Z_REG(op1_addr) == ZREG_REG1) {
1104211027
if (return_value_used != 0) {
@@ -11095,77 +11080,88 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
1109511080
}
1109611081
}
1109711082

11098-
if (return_value_used == 0) {
11099-
|9:
11100-
return 1;
11101-
}
11102-
11103-
if (opline->op1_type == IS_CONST) {
11104-
zval *zv = RT_CONSTANT(opline, opline->op1);
11105-
| ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_REG0, ZREG_TMP1, ZREG_FPR0
11106-
if (Z_REFCOUNTED_P(zv)) {
11107-
| ADDREF_CONST zv, REG0, TMP1
11108-
}
11109-
} else if (opline->op1_type == IS_TMP_VAR) {
11110-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11111-
} else if (opline->op1_type == IS_CV) {
11112-
if (op1_info & MAY_BE_REF) {
11113-
| LOAD_ZVAL_ADDR REG0, op1_addr
11114-
| ZVAL_DEREF REG0, op1_info, TMP1w
11115-
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
11116-
}
11117-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11118-
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11119-
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11120-
(op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11121-
!op_array->function_name) {
11122-
| TRY_ADDREF op1_info, REG0w, REG2, TMP1w
11123-
} else if (return_value_used != 1) {
11124-
| // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11125-
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
11083+
if (return_value_used != 0) {
11084+
if (opline->op1_type == IS_CONST) {
11085+
zval *zv = RT_CONSTANT(opline, opline->op1);
11086+
| ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_REG0, ZREG_TMP1, ZREG_FPR0
11087+
if (Z_REFCOUNTED_P(zv)) {
11088+
| ADDREF_CONST zv, REG0, TMP1
1112611089
}
11127-
}
11128-
} else {
11129-
if (op1_info & MAY_BE_REF) {
11130-
zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, offsetof(zend_reference, val));
11131-
11132-
| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1, ZREG_TMP1
11133-
|.cold_code
11134-
|1:
11135-
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11136-
| GET_ZVAL_PTR REG0, op1_addr, TMP1
11137-
| // ZVAL_COPY_VALUE(return_value, &ref->value);
11138-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_REG2, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11139-
| GC_DELREF REG0, TMP1w
11140-
| beq >2
11141-
| // if (IS_REFCOUNTED())
11142-
if (jit_return_label >= 0) {
11143-
| IF_NOT_REFCOUNTED REG2w, =>jit_return_label, TMP1w
11144-
} else {
11145-
| IF_NOT_REFCOUNTED REG2w, >9, TMP1w
11090+
} else if (opline->op1_type == IS_TMP_VAR) {
11091+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11092+
} else if (opline->op1_type == IS_CV) {
11093+
if (op1_info & MAY_BE_REF) {
11094+
| LOAD_ZVAL_ADDR REG0, op1_addr
11095+
| ZVAL_DEREF REG0, op1_info, TMP1w
11096+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
1114611097
}
11147-
| // ADDREF
11148-
| GET_ZVAL_PTR REG2, ret_addr, TMP1 // reload
11149-
| GC_ADDREF REG2, TMP1w
11150-
if (jit_return_label >= 0) {
11151-
| b =>jit_return_label
11152-
} else {
11153-
| b >9
11098+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11099+
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11100+
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11101+
(op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11102+
!op_array->function_name) {
11103+
| TRY_ADDREF op1_info, REG0w, REG2, TMP1w
11104+
} else if (return_value_used != 1) {
11105+
| // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11106+
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
11107+
}
1115411108
}
11155-
|2:
11156-
| mov FCARG1x, REG0
11157-
| EFREE_REFERENCE
11158-
if (jit_return_label >= 0) {
11159-
| b =>jit_return_label
11160-
} else {
11161-
| b >9
11109+
} else {
11110+
if (op1_info & MAY_BE_REF) {
11111+
zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, offsetof(zend_reference, val));
11112+
11113+
| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1, ZREG_TMP1
11114+
|.cold_code
11115+
|1:
11116+
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11117+
| GET_ZVAL_PTR REG0, op1_addr, TMP1
11118+
| // ZVAL_COPY_VALUE(return_value, &ref->value);
11119+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_REG2, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11120+
| GC_DELREF REG0, TMP1w
11121+
| beq >2
11122+
| // if (IS_REFCOUNTED())
11123+
if (jit_return_label >= 0) {
11124+
| IF_NOT_REFCOUNTED REG2w, =>jit_return_label, TMP1w
11125+
} else {
11126+
| IF_NOT_REFCOUNTED REG2w, >9, TMP1w
11127+
}
11128+
| // ADDREF
11129+
| GET_ZVAL_PTR REG2, ret_addr, TMP1 // reload
11130+
| GC_ADDREF REG2, TMP1w
11131+
if (jit_return_label >= 0) {
11132+
| b =>jit_return_label
11133+
} else {
11134+
| b >9
11135+
}
11136+
|2:
11137+
| mov FCARG1x, REG0
11138+
| EFREE_REFERENCE
11139+
if (jit_return_label >= 0) {
11140+
| b =>jit_return_label
11141+
} else {
11142+
| b >9
11143+
}
11144+
|.code
1116211145
}
11163-
|.code
11146+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
1116411147
}
11165-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
1116611148
}
11167-
11149+
1116811150
|9:
11151+
if (ZEND_OBSERVER_ENABLED) {
11152+
if (Z_MODE(op1_addr) == IS_REG) {
11153+
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11154+
11155+
if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11156+
return 0;
11157+
}
11158+
op1_addr = dst;
11159+
}
11160+
| LOAD_ZVAL_ADDR FCARG2x, op1_addr
11161+
| mov FCARG1x, FP
11162+
| SET_EX_OPLINE opline, REG0
11163+
| EXT_CALL zend_observer_fcall_end, REG0
11164+
}
1116911165
return 1;
1117011166
}
1117111167

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 73 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -11739,21 +11739,6 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
1173911739
return_value_used = -1;
1174011740
}
1174111741

11742-
if (ZEND_OBSERVER_ENABLED) {
11743-
if (Z_MODE(op1_addr) == IS_REG) {
11744-
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11745-
11746-
if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11747-
return 0;
11748-
}
11749-
op1_addr = dst;
11750-
}
11751-
| LOAD_ZVAL_ADDR FCARG2a, op1_addr
11752-
| mov FCARG1a, FP
11753-
| SET_EX_OPLINE opline, r0
11754-
| EXT_CALL zend_observer_fcall_end, r0
11755-
}
11756-
1175711742
// if (!EX(return_value))
1175811743
if (Z_MODE(op1_addr) == IS_REG && Z_REG(op1_addr) == ZREG_R1) {
1175911744
if (return_value_used != 0) {
@@ -11818,76 +11803,87 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
1181811803
}
1181911804
}
1182011805

11821-
if (return_value_used == 0) {
11822-
|9:
11823-
return 1;
11824-
}
11825-
11826-
if (opline->op1_type == IS_CONST) {
11827-
zval *zv = RT_CONSTANT(opline, opline->op1);
11828-
| ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0
11829-
if (Z_REFCOUNTED_P(zv)) {
11830-
| ADDREF_CONST zv, r0
11831-
}
11832-
} else if (opline->op1_type == IS_TMP_VAR) {
11833-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
11834-
} else if (opline->op1_type == IS_CV) {
11835-
if (op1_info & MAY_BE_REF) {
11836-
| LOAD_ZVAL_ADDR r0, op1_addr
11837-
| ZVAL_DEREF r0, op1_info
11838-
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
11839-
}
11840-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
11841-
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11842-
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11843-
(op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11844-
!op_array->function_name) {
11845-
| TRY_ADDREF op1_info, ah, r2
11846-
} else if (return_value_used != 1) {
11847-
| // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11848-
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL
11806+
if (return_value_used != 0) {
11807+
if (opline->op1_type == IS_CONST) {
11808+
zval *zv = RT_CONSTANT(opline, opline->op1);
11809+
| ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0
11810+
if (Z_REFCOUNTED_P(zv)) {
11811+
| ADDREF_CONST zv, r0
1184911812
}
11850-
}
11851-
} else {
11852-
if (op1_info & MAY_BE_REF) {
11853-
zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, offsetof(zend_reference, val));
11854-
11855-
| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1
11856-
|.cold_code
11857-
|1:
11858-
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11859-
| GET_ZVAL_PTR r0, op1_addr
11860-
| // ZVAL_COPY_VALUE(return_value, &ref->value);
11861-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_R2, ZREG_R2
11862-
| GC_DELREF r0
11863-
| je >2
11864-
| // if (IS_REFCOUNTED())
11865-
if (jit_return_label >= 0) {
11866-
| IF_NOT_REFCOUNTED dh, =>jit_return_label
11867-
} else {
11868-
| IF_NOT_REFCOUNTED dh, >9
11813+
} else if (opline->op1_type == IS_TMP_VAR) {
11814+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
11815+
} else if (opline->op1_type == IS_CV) {
11816+
if (op1_info & MAY_BE_REF) {
11817+
| LOAD_ZVAL_ADDR r0, op1_addr
11818+
| ZVAL_DEREF r0, op1_info
11819+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
1186911820
}
11870-
| // ADDREF
11871-
| GET_ZVAL_PTR r2, ret_addr // reload
11872-
| GC_ADDREF r2
11873-
if (jit_return_label >= 0) {
11874-
| jmp =>jit_return_label
11875-
} else {
11876-
| jmp >9
11821+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
11822+
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11823+
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11824+
(op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11825+
!op_array->function_name) {
11826+
| TRY_ADDREF op1_info, ah, r2
11827+
} else if (return_value_used != 1) {
11828+
| // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11829+
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL
11830+
}
1187711831
}
11878-
|2:
11879-
| EFREE_REFERENCE r0
11880-
if (jit_return_label >= 0) {
11881-
| jmp =>jit_return_label
11882-
} else {
11883-
| jmp >9
11832+
} else {
11833+
if (op1_info & MAY_BE_REF) {
11834+
zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, offsetof(zend_reference, val));
11835+
11836+
| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1
11837+
|.cold_code
11838+
|1:
11839+
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11840+
| GET_ZVAL_PTR r0, op1_addr
11841+
| // ZVAL_COPY_VALUE(return_value, &ref->value);
11842+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_R2, ZREG_R2
11843+
| GC_DELREF r0
11844+
| je >2
11845+
| // if (IS_REFCOUNTED())
11846+
if (jit_return_label >= 0) {
11847+
| IF_NOT_REFCOUNTED dh, =>jit_return_label
11848+
} else {
11849+
| IF_NOT_REFCOUNTED dh, >9
11850+
}
11851+
| // ADDREF
11852+
| GET_ZVAL_PTR r2, ret_addr // reload
11853+
| GC_ADDREF r2
11854+
if (jit_return_label >= 0) {
11855+
| jmp =>jit_return_label
11856+
} else {
11857+
| jmp >9
11858+
}
11859+
|2:
11860+
| EFREE_REFERENCE r0
11861+
if (jit_return_label >= 0) {
11862+
| jmp =>jit_return_label
11863+
} else {
11864+
| jmp >9
11865+
}
11866+
|.code
1188411867
}
11885-
|.code
11868+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
1188611869
}
11887-
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
1188811870
}
1188911871

1189011872
|9:
11873+
if (ZEND_OBSERVER_ENABLED) {
11874+
if (Z_MODE(op1_addr) == IS_REG) {
11875+
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11876+
11877+
if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11878+
return 0;
11879+
}
11880+
op1_addr = dst;
11881+
}
11882+
| LOAD_ZVAL_ADDR FCARG2a, op1_addr
11883+
| mov FCARG1a, FP
11884+
| SET_EX_OPLINE opline, r0
11885+
| EXT_CALL zend_observer_fcall_end, r0
11886+
}
1189111887
return 1;
1189211888
}
1189311889

0 commit comments

Comments
 (0)