Skip to content

Commit 8f0c87e

Browse files
committed
Avoid unintended inlining
1 parent ba05b2c commit 8f0c87e

File tree

2 files changed

+62
-14
lines changed

2 files changed

+62
-14
lines changed

Zend/zend_vm_execute.h

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20496,7 +20496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OP
2049620496
HANDLE_EXCEPTION();
2049720497
}
2049820498

20499-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20499+
static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2050020500
{
2050120501
USE_OPLINE
2050220502
zval *varptr, *arg;
@@ -20534,6 +20534,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
2053420534
ZEND_VM_NEXT_OPCODE();
2053520535
}
2053620536

20537+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20538+
{
20539+
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
20540+
}
20541+
2053720542
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2053820543
{
2053920544
USE_OPLINE
@@ -20604,7 +20609,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
2060420609

2060520610
if (EXPECTED(1)) {
2060620611
if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
20607-
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
20612+
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
2060820613
}
2060920614

2061020615
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -20617,7 +20622,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
2061720622
}
2061820623
} else {
2061920624
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
20620-
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
20625+
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
2062120626
}
2062220627

2062320628
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -30341,7 +30346,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST
3034130346
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
3034230347
}
3034330348

30344-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30349+
static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3034530350
{
3034630351
USE_OPLINE
3034730352

@@ -30456,6 +30461,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
3045630461
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
3045730462
}
3045830463

30464+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30465+
{
30466+
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
30467+
}
30468+
3045930469
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3046030470
{
3046130471
USE_OPLINE
@@ -36876,7 +36886,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
3687636886
HANDLE_EXCEPTION();
3687736887
}
3687836888

36879-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36889+
static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3688036890
{
3688136891
USE_OPLINE
3688236892
zval *varptr, *arg;
@@ -36914,6 +36924,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_H
3691436924
ZEND_VM_NEXT_OPCODE();
3691536925
}
3691636926

36927+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36928+
{
36929+
ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
36930+
}
36931+
3691736932
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3691836933
{
3691936934
USE_OPLINE
@@ -39024,7 +39039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_
3902439039
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
3902539040
}
3902639041

39027-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
39042+
static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3902839043
{
3902939044
USE_OPLINE
3903039045

@@ -39139,6 +39154,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
3913939154
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
3914039155
}
3914139156

39157+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
39158+
{
39159+
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
39160+
}
39161+
3914239162
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3914339163
{
3914439164
USE_OPLINE
@@ -55590,7 +55610,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5559055610
HYBRID_BREAK();
5559155611
HYBRID_CASE(ZEND_SEND_VAR_SPEC_VAR):
5559255612
VM_TRACE(ZEND_SEND_VAR_SPEC_VAR)
55593-
ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55613+
ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5559455614
HYBRID_BREAK();
5559555615
HYBRID_CASE(ZEND_SEND_VAR_NO_REF_SPEC_VAR):
5559655616
VM_TRACE(ZEND_SEND_VAR_NO_REF_SPEC_VAR)
@@ -56214,7 +56234,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5621456234
HYBRID_BREAK();
5621556235
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST):
5621656236
VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST)
56217-
ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
56237+
ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5621856238
HYBRID_BREAK();
5621956239
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST):
5622056240
VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST)
@@ -56676,7 +56696,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5667656696
HYBRID_BREAK();
5667756697
HYBRID_CASE(ZEND_SEND_VAR_SPEC_CV):
5667856698
VM_TRACE(ZEND_SEND_VAR_SPEC_CV)
56679-
ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
56699+
ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5668056700
HYBRID_BREAK();
5668156701
HYBRID_CASE(ZEND_SEND_REF_SPEC_CV):
5668256702
VM_TRACE(ZEND_SEND_REF_SPEC_CV)
@@ -56876,7 +56896,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5687656896
HYBRID_BREAK();
5687756897
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CV_CONST):
5687856898
VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CV_CONST)
56879-
ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
56899+
ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5688056900
HYBRID_BREAK();
5688156901
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_CV_CONST):
5688256902
VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_CV_CONST)

Zend/zend_vm_gen.php

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -891,11 +891,21 @@ function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) {
891891
"/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m",
892892
"/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*(,[^)]*)?\)/m",
893893
),
894-
function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) {
894+
function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec, $name) {
895895
if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) {
896896
return "execute_data";
897897
} else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) {
898-
return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))";
898+
global $opcodes, $opnames;
899+
900+
$handler = $matches[1];
901+
$opcode = $opcodes[$opnames[$handler]];
902+
$inline =
903+
ZEND_VM_KIND == ZEND_VM_KIND_HYBRID &&
904+
isset($opcode["use"]) &&
905+
is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec) &&
906+
is_hot_handler($opcodes[$opnames[$name]]["hot"], $op1, $op2, $extra_spec) ?
907+
"_INLINE" : "";
908+
return "ZEND_VM_TAIL_CALL(" . opcode_name($handler, $spec, $op1, $op2, $extra_spec) . $inline . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))";
899909
} else {
900910
// ZEND_VM_DISPATCH_TO_HELPER
901911
if (isset($matches[2])) {
@@ -1074,6 +1084,7 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
10741084
}
10751085

10761086
// Generate opcode handler's entry point according to selected threading model
1087+
$additional_func = false;
10771088
$spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
10781089
switch($kind) {
10791090
case ZEND_VM_KIND_HYBRID:
@@ -1087,10 +1098,14 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
10871098
. stream_get_contents($out);
10881099
fclose($out);
10891100
} else {
1101+
$inline =
1102+
isset($opcode["use"]) &&
1103+
is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec) ?
1104+
"_INLINE" : "";
10901105
$code =
10911106
"\t\t\tHYBRID_CASE({$spec_name}):\n"
10921107
. "\t\t\t\tVM_TRACE($spec_name)\n"
1093-
. "\t\t\t\t{$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"
1108+
. "\t\t\t\t{$spec_name}{$inline}_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"
10941109
. "\t\t\t\tHYBRID_BREAK();\n";
10951110
}
10961111
if (is_array($gen_order)) {
@@ -1101,7 +1116,12 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
11011116
return;
11021117
case ZEND_VM_KIND_CALL:
11031118
if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
1104-
out($f,"static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
1119+
if (isset($opcode["use"])) {
1120+
out($f,"static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
1121+
$additional_func = true;
1122+
} else {
1123+
out($f,"static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
1124+
}
11051125
} else if ($opcode["hot"] && is_cold_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
11061126
out($f,"static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
11071127
} else {
@@ -1130,6 +1150,14 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
11301150

11311151
// Generate opcode handler's code
11321152
gen_code($f, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
1153+
1154+
if ($additional_func) {
1155+
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
1156+
out($f,"{\n");
1157+
out($f,"\tZEND_VM_TAIL_CALL({$spec_name}_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
1158+
out($f,"}\n");
1159+
out($f,"\n");
1160+
}
11331161
}
11341162

11351163
// Generates helper

0 commit comments

Comments
 (0)