Skip to content

Commit b578f69

Browse files
committed
Merge branch 'PHP-8.2'
* PHP-8.2: Fix (at lease part of the) #GH-10635: ARM64 function JIT causes impossible assertion
2 parents 49c1e6e + 388d784 commit b578f69

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12218,7 +12218,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
1221812218
type_loaded = 1;
1221912219
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0);
1222012220
if (opline->opcode == ZEND_FETCH_OBJ_W
12221-
&& (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS))) {
12221+
&& (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT)))) {
1222212222
uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
1222312223

1222412224
| ldr REG0, EX->run_time_cache
@@ -12702,7 +12702,7 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
1270212702
| ldr TMP1, [FCARG1x, #offsetof(zend_object, ce)]
1270312703
| cmp REG2, TMP1
1270412704
| bne >7
12705-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
12705+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1270612706
| MEM_ACCESS_64_WITH_UOFFSET ldr, TMP1, REG0, (opline->extended_value + sizeof(void*) * 2), TMP1
1270712707
| cbnz TMP1, >7
1270812708
}
@@ -13136,7 +13136,7 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
1313613136
| ldr TMP2, [FCARG1x, #offsetof(zend_object, ce)]
1313713137
| cmp REG2, TMP2
1313813138
| bne >7
13139-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
13139+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1314013140
| MEM_ACCESS_64_WITH_UOFFSET ldr, TMP1, REG0, ((opline+1)->extended_value + sizeof(void*) * 2), TMP1
1314113141
| cbnz TMP1, >7
1314213142
}
@@ -13514,7 +13514,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
1351413514
| ldr TMP1, [FCARG1x, #offsetof(zend_object, ce)]
1351513515
| cmp REG2, TMP1
1351613516
| bne >5
13517-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
13517+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1351813518
| MEM_ACCESS_64_WITH_UOFFSET ldr, FCARG2x, REG0, (opline->extended_value + sizeof(void*) * 2), TMP1
1351913519
}
1352013520
| MEM_ACCESS_64_WITH_UOFFSET ldr, REG0, REG0, (opline->extended_value + sizeof(void*)), TMP1
@@ -13525,7 +13525,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
1352513525
| IF_TYPE TMP1w, IS_UNDEF, >5
1352613526
| mov FCARG1x, TMP2
1352713527
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0);
13528-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
13528+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1352913529
| cbnz FCARG2x, >1
1353013530
|.cold_code
1353113531
|1:

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12959,7 +12959,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
1295912959
type_loaded = 1;
1296012960
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0);
1296112961
if (opline->opcode == ZEND_FETCH_OBJ_W
12962-
&& (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS))) {
12962+
&& (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT)))) {
1296312963
uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
1296412964

1296512965
| mov r0, EX->run_time_cache
@@ -13455,7 +13455,7 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
1345513455
| mov r2, aword [r0 + opline->extended_value]
1345613456
| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)]
1345713457
| jne >7
13458-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
13458+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1345913459
| cmp aword [r0 + opline->extended_value + sizeof(void*) * 2], 0
1346013460
| jnz >7
1346113461
}
@@ -13928,7 +13928,7 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
1392813928
| mov r2, aword [r0 + (opline+1)->extended_value]
1392913929
| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)]
1393013930
| jne >7
13931-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
13931+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1393213932
| cmp aword [r0 + (opline+1)->extended_value + sizeof(void*) * 2], 0
1393313933
| jnz >7
1393413934
}
@@ -14347,7 +14347,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
1434714347
| mov r2, aword [r0 + opline->extended_value]
1434814348
| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)]
1434914349
| jne >5
14350-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
14350+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1435114351
| mov FCARG2a, aword [r0 + opline->extended_value + sizeof(void*) * 2]
1435214352
}
1435314353
| mov r0, aword [r0 + opline->extended_value + sizeof(void*)]
@@ -14356,7 +14356,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
1435614356
| IF_TYPE byte [FCARG1a + r0 + 8], IS_UNDEF, >5
1435714357
| add FCARG1a, r0
1435814358
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0);
14359-
if (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
14359+
if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) {
1436014360
| test FCARG2a, FCARG2a
1436114361
| jnz >1
1436214362
|.cold_code

ext/opcache/tests/jit/gh10635.phpt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
GH-10635: Function JIT causes impossible assertion
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
trait T {
11+
function foo() {
12+
return reset($this->a);
13+
}
14+
}
15+
class C {
16+
use T;
17+
private array $a = [1];
18+
}
19+
$o = new C;
20+
$o->foo();
21+
unset($o);
22+
$o = new C;
23+
$o->foo();
24+
unset($o);
25+
?>
26+
DONE
27+
--EXPECT--
28+
DONE

0 commit comments

Comments
 (0)