Skip to content

Commit

Permalink
Fix register allocation on x86
Browse files Browse the repository at this point in the history
Fixes oss-fuzz #43119
  • Loading branch information
dstogov committed Jan 11, 2022
1 parent d7db5f6 commit d8b0337
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 11 deletions.
28 changes: 17 additions & 11 deletions ext/opcache/jit/zend_jit_x86.dasc
Original file line number Diff line number Diff line change
Expand Up @@ -6039,6 +6039,7 @@ static int zend_jit_simple_assign(dasm_State **Dst,
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0);
} else {
zend_jit_addr ref_addr;
zend_reg type_reg = tmp_reg;

if (in_cold) {
| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1
Expand All @@ -6047,21 +6048,24 @@ static int zend_jit_simple_assign(dasm_State **Dst,
|.cold_code
|1:
}
if (Z_REG(val_addr) == ZREG_R2) {
| mov aword T1, r2 // save
}
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
| GET_ZVAL_PTR r2, val_addr
| GC_DELREF r2
| // ZVAL_COPY_VALUE(return_value, &ref->value);
ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8);
if (!res_addr) {
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, ZREG_R2, tmp_reg
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg, tmp_reg
} else {
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, ZREG_R2, tmp_reg
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg, tmp_reg
}
| je >2
| IF_NOT_REFCOUNTED dh, >3
if (tmp_reg == ZREG_R0) {
| IF_NOT_REFCOUNTED ah, >3
} else {
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3
}
| GET_ZVAL_PTR Ra(tmp_reg), var_addr

if (!res_addr) {
| GC_ADDREF Ra(tmp_reg)
} else {
Expand All @@ -6070,17 +6074,19 @@ static int zend_jit_simple_assign(dasm_State **Dst,
| jmp >3
|2:
if (res_addr) {
| IF_NOT_REFCOUNTED dh, >2
if (tmp_reg == ZREG_R0) {
| IF_NOT_REFCOUNTED ah, >2
} else {
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2
}
| GET_ZVAL_PTR Ra(tmp_reg), var_addr
| GC_ADDREF Ra(tmp_reg)
|2:
}
if (Z_REG(val_addr) == ZREG_R2) {
| mov r2, aword T1 // restore
}
if (save_r1) {
| mov aword T1, FCARG1a // save
}
| EFREE_REFERENCE aword [Ra(Z_REG(val_addr))+Z_OFFSET(val_addr)]
| EFREE_REFERENCE r2
if (save_r1) {
| mov FCARG1a, aword T1 // restore
}
Expand Down
29 changes: 29 additions & 0 deletions ext/opcache/tests/jit/assign_049.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
--TEST--
JIT ASSIGN: register allocation on x86
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.file_update_protection=0
opcache.jit_buffer_size=1M
opcache.protect_memory=1
--FILE--
<?php
function &a($i) {
$a = "str". $i;
return $a;
}

class A {
public $a;
public function test() {
$this->a = a(1);
}
}

$a = new A;
$a->test();
$a->test();
?>
DONE
--EXPECT--
DONE

0 comments on commit d8b0337

Please sign in to comment.