Skip to content

Commit 7ebc994

Browse files
committed
Prevent JIT code generation for 64-bit FFI data in 32-bit build
1 parent 74f25bf commit 7ebc994

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
@@ -17569,6 +17569,10 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
1756917569
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
1757017570
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
1757117571
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
17572+
#if defined(IR_TARGET_X86)
17573+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
17574+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
17575+
#endif
1757217576
&& op2_info == MAY_BE_LONG) {
1757317577
return 1;
1757417578
}
@@ -17628,6 +17632,10 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
1762817632
&& (op1_ffi_type->kind == ZEND_FFI_TYPE_ARRAY || op1_ffi_type->kind == ZEND_FFI_TYPE_POINTER)
1762917633
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind >= ZEND_FFI_TYPE_FLOAT
1763017634
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind <= ZEND_FFI_TYPE_ENUM
17635+
#if defined(IR_TARGET_X86)
17636+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_UINT64
17637+
&& ZEND_FFI_TYPE(op1_ffi_type->array.type)->kind != ZEND_FFI_TYPE_SINT64
17638+
#endif
1763117639
&& op2_info == MAY_BE_LONG) {
1763217640
return 1;
1763317641
}

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)