Skip to content

Commit 4528b92

Browse files
committed
Prevent JIT code generation for 64-bit FFI data in 32-bit build
1 parent f024af8 commit 4528b92

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

ext/opcache/jit/zend_jit_ir.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17614,6 +17614,10 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
1761417614
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
1761517615
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
1761617616
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
17617+
#if defined(IR_TARGET_X86)
17618+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
17619+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
17620+
#endif
1761717621
&& op2_info == MAY_BE_LONG) {
1761817622
return 1;
1761917623
}
@@ -17673,6 +17677,10 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
1767317677
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
1767417678
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
1767517679
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
17680+
#if defined(IR_TARGET_X86)
17681+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
17682+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
17683+
#endif
1767617684
&& op2_info == MAY_BE_LONG) {
1767717685
return 1;
1767817686
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4693,6 +4693,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
46934693
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
46944694
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
46954695
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
4696+
#if defined(IR_TARGET_X86)
4697+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
4698+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
4699+
#endif
46964700
&& op2_info == MAY_BE_LONG) {
46974701
if (!ffi_info) {
46984702
ffi_info = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_jit_ffi_info));
@@ -4899,6 +4903,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
48994903
&& !field->bits
49004904
&& ZEND_FFI_TYPE(field->type)->kind >= ZEND_FFI_TYPE_FLOAT
49014905
&& ZEND_FFI_TYPE(field->type)->kind <= ZEND_FFI_TYPE_ENUM
4906+
#if defined(IR_TARGET_X86)
4907+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_UINT64
4908+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_SINT64
4909+
#endif
49024910
&& (op1_data_info == MAY_BE_LONG || op1_data_info == MAY_BE_DOUBLE)) {
49034911
if (!ffi_info) {
49044912
ffi_info = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_jit_ffi_info));
@@ -5005,6 +5013,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50055013
&& !field->bits
50065014
&& ZEND_FFI_TYPE(field->type)->kind >= ZEND_FFI_TYPE_FLOAT
50075015
&& ZEND_FFI_TYPE(field->type)->kind <= ZEND_FFI_TYPE_ENUM
5016+
#if defined(IR_TARGET_X86)
5017+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_UINT64
5018+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_SINT64
5019+
#endif
50085020
&& (op1_data_info == MAY_BE_LONG || op1_data_info == MAY_BE_DOUBLE)) {
50095021
if (!ffi_info) {
50105022
ffi_info = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_jit_ffi_info));
@@ -5082,6 +5094,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50825094
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
50835095
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
50845096
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
5097+
#if defined(IR_TARGET_X86)
5098+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
5099+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
5100+
#endif
50855101
&& op2_info == MAY_BE_LONG
50865102
&& (op1_data_info == MAY_BE_LONG || op1_data_info == MAY_BE_DOUBLE)) {
50875103
if (!ffi_info) {
@@ -5889,6 +5905,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
58895905
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
58905906
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
58915907
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
5908+
#if defined(IR_TARGET_X86)
5909+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
5910+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
5911+
#endif
58925912
&& op2_info == MAY_BE_LONG) {
58935913
if (!ffi_info) {
58945914
ffi_info = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_jit_ffi_info));
@@ -6144,7 +6164,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
61446164
if (field
61456165
&& !field->bits
61466166
&& ZEND_FFI_TYPE(field->type)->kind >= ZEND_FFI_TYPE_FLOAT
6147-
&& ZEND_FFI_TYPE(field->type)->kind <= ZEND_FFI_TYPE_ENUM) {
6167+
&& ZEND_FFI_TYPE(field->type)->kind <= ZEND_FFI_TYPE_ENUM
6168+
#if defined(IR_TARGET_X86)
6169+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_UINT64
6170+
&& ZEND_FFI_TYPE(field->type)->kind != ZEND_FFI_TYPE_SINT64
6171+
#endif
6172+
) {
61486173
if (!ffi_info) {
61496174
ffi_info = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_jit_ffi_info));
61506175
}

0 commit comments

Comments
 (0)