Skip to content

Commit 4d51d58

Browse files
committed
JIT: Specify fastcall calling convenrion through dummy function prototype
1 parent 4630f77 commit 4d51d58

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

ext/opcache/jit/zend_jit_ir.c

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@
6565
#undef ir_CONST_ADDR
6666
#define ir_CONST_ADDR(_addr) jit_CONST_ADDR(jit, (uintptr_t)(_addr))
6767
#define ir_CONST_FUNC(_addr) jit_CONST_FUNC(jit, (uintptr_t)(_addr), 0)
68-
#define ir_CONST_FC_FUNC(_addr) jit_CONST_FUNC(jit, (uintptr_t)(_addr), IR_CONST_FASTCALL_FUNC)
69-
#define ir_CAST_FC_FUNC(_addr) ir_fold2(_ir_CTX, IR_OPT(IR_BITCAST, IR_ADDR), (_addr), IR_CONST_FASTCALL_FUNC)
68+
#define ir_CONST_FC_FUNC(_addr) jit_CONST_FUNC(jit, (uintptr_t)(_addr), IR_FASTCALL_FUNC)
69+
#define ir_CAST_FC_FUNC(_addr) ir_fold2(_ir_CTX, IR_OPT(IR_PROTO, IR_ADDR), (_addr), \
70+
ir_proto_0(_ir_CTX, IR_FASTCALL_FUNC, IR_I32))
7071

7172
#undef ir_ADD_OFFSET
7273
#define ir_ADD_OFFSET(_addr, _offset) \
@@ -492,17 +493,23 @@ static ir_ref jit_CONST_FUNC(zend_jit_ctx *jit, uintptr_t addr, uint16_t flags)
492493
ir_ref ref;
493494
ir_insn *insn;
494495
zval *zv;
496+
#if defined(IR_TARGET_X86)
497+
/* TODO: dummy prototype (only flags matter) ??? */
498+
ir_ref proto = flags ? ir_proto_0(&jit->ctx, flags, IR_I32) : 0;
499+
#else
500+
ir_ref proto = 0;
501+
#endif
495502

496503
ZEND_ASSERT(addr != 0);
497504
zv = zend_hash_index_lookup(&jit->addr_hash, addr);
498505
if (Z_TYPE_P(zv) == IS_LONG) {
499506
ref = Z_LVAL_P(zv);
500-
ZEND_ASSERT(jit->ctx.ir_base[ref].opt == IR_OPT(IR_FUNC_ADDR, IR_ADDR) && jit->ctx.ir_base[ref].const_flags == flags);
507+
ZEND_ASSERT(jit->ctx.ir_base[ref].opt == IR_OPT(IR_FUNC_ADDR, IR_ADDR) && jit->ctx.ir_base[ref].proto == proto);
501508
} else {
502509
ref = ir_unique_const_addr(&jit->ctx, addr);
503510
insn = &jit->ctx.ir_base[ref];
504511
insn->optx = IR_OPT(IR_FUNC_ADDR, IR_ADDR);
505-
insn->const_flags = flags;
512+
insn->proto = proto;
506513
ZVAL_LONG(zv, ref);
507514
}
508515
return ref;
@@ -551,7 +558,12 @@ static ir_ref jit_STUB_FUNC_ADDR(zend_jit_ctx *jit, jit_stub_id id, uint16_t fla
551558
ref = ir_unique_const_addr(&jit->ctx, (uintptr_t)zend_jit_stub_handlers[id]);
552559
insn = &jit->ctx.ir_base[ref];
553560
insn->optx = IR_OPT(IR_FUNC_ADDR, IR_ADDR);
554-
insn->const_flags = flags;
561+
#if defined(IR_TARGET_X86)
562+
/* TODO: dummy prototype (only flags matter) ??? */
563+
insn->proto = flags ? ir_proto_0(&jit->ctx, flags, IR_I32) : 0;
564+
#else
565+
insn->proto = 0;
566+
#endif
555567
jit->stub_addr[id] = ref;
556568
}
557569
return ref;
@@ -6046,7 +6058,7 @@ static int zend_jit_assign_to_variable_call(zend_jit_ctx *jit,
60466058
jit_SET_EX_OPLINE(jit, opline);
60476059
ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_op_helper), ir_CONST_U32(Z_OFFSET(val_addr)));
60486060

6049-
ir_CALL_2(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_assign_const, IR_CONST_FASTCALL_FUNC),
6061+
ir_CALL_2(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_assign_const, IR_FASTCALL_FUNC),
60506062
jit_ZVAL_ADDR(jit, var_addr),
60516063
jit_EG(uninitialized_zval));
60526064

@@ -6081,7 +6093,7 @@ static int zend_jit_assign_to_variable_call(zend_jit_ctx *jit,
60816093
jit_SET_EX_OPLINE(jit, opline);
60826094
}
60836095

6084-
ir_CALL_2(IR_VOID, jit_STUB_FUNC_ADDR(jit, func, IR_CONST_FASTCALL_FUNC),
6096+
ir_CALL_2(IR_VOID, jit_STUB_FUNC_ADDR(jit, func, IR_FASTCALL_FUNC),
60856097
jit_ZVAL_ADDR(jit, var_addr),
60866098
jit_ZVAL_ADDR(jit, val_addr));
60876099

@@ -11543,7 +11555,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx *jit,
1154311555
// JIT: zend_error(E_WARNING,"Undefined array key " ZEND_LONG_FMT, hval);
1154411556
// JIT: retval = &EG(uninitialized_zval);
1154511557
jit_SET_EX_OPLINE(jit, opline);
11546-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_CONST_FASTCALL_FUNC));
11558+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_FASTCALL_FUNC));
1154711559
ir_END_list(*end_inputs);
1154811560
break;
1154911561
case BP_VAR_IS:
@@ -11723,7 +11735,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx *jit,
1172311735
ir_IF_FALSE_cold(if_found);
1172411736
// JIT: zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
1172511737
jit_SET_EX_OPLINE(jit, opline);
11726-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_key, IR_CONST_FASTCALL_FUNC));
11738+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_key, IR_FASTCALL_FUNC));
1172711739
ir_END_list(*end_inputs);
1172811740
break;
1172911741
case BP_VAR_IS:
@@ -12314,7 +12326,7 @@ static zend_jit_addr zend_jit_prepare_array_update(zend_jit_ctx *jit,
1231412326
}
1231512327
// JIT: ZVAL_ARR(container, zend_new_array(8));
1231612328
ref = ir_CALL_1(IR_ADDR,
12317-
jit_STUB_FUNC_ADDR(jit, jit_stub_new_array, IR_CONST_FASTCALL_FUNC),
12329+
jit_STUB_FUNC_ADDR(jit, jit_stub_new_array, IR_FASTCALL_FUNC),
1231812330
jit_ZVAL_ADDR(jit, op1_addr));
1231912331
if (array_inputs->count) {
1232012332
ir_refs_add(array_inputs, ir_END());
@@ -12372,7 +12384,7 @@ static int zend_jit_fetch_dim(zend_jit_ctx *jit,
1237212384
if (opline->opcode != ZEND_FETCH_DIM_RW) {
1237312385
jit_SET_EX_OPLINE(jit, opline);
1237412386
}
12375-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_CONST_FASTCALL_FUNC));
12387+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_FASTCALL_FUNC));
1237612388
ir_END_list(end_inputs);
1237712389

1237812390
ir_IF_TRUE(if_ok);
@@ -12744,7 +12756,7 @@ static int zend_jit_assign_dim(zend_jit_ctx *jit, const zend_op *opline, uint32_
1274412756

1274512757
// JIT: zend_throw_error(NULL, "Cannot add element to the array as the next element is already occupied");
1274612758
jit_SET_EX_OPLINE(jit, opline);
12747-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_CONST_FASTCALL_FUNC));
12759+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_FASTCALL_FUNC));
1274812760

1274912761
ir_END_list(end_inputs);
1275012762

@@ -12889,7 +12901,7 @@ static int zend_jit_assign_dim_op(zend_jit_ctx *jit, const zend_op *opline, uint
1288912901
ir_IF_FALSE_cold(if_ok);
1289012902

1289112903
// JIT: zend_throw_error(NULL, "Cannot add element to the array as the next element is already occupied");
12892-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_CONST_FASTCALL_FUNC));
12904+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_cannot_add_element, IR_FASTCALL_FUNC));
1289312905

1289412906
ir_END_list(end_inputs);
1289512907

0 commit comments

Comments
 (0)