@@ -439,7 +439,14 @@ static uint8_t zend_jit_trace_bad_stop_event(const zend_op *opline, int count)
439439 return 0 ;
440440}
441441
442- static int zend_jit_trace_record_fake_init_call_ex (zend_execute_data * call , zend_jit_trace_rec * trace_buffer , int idx , uint32_t is_megamorphic , uint32_t * megamorphic , uint32_t level , uint32_t init_level , uint32_t * call_level )
442+ /* Workaround for PHP-8.0 */
443+ #ifndef ZEND_CALL_JIT_RESERVED
444+ # define ZEND_CALL_JIT_RESERVED (1<<29)
445+ #endif
446+
447+ #define ZEND_CALL_MEGAMORPHIC ZEND_CALL_JIT_RESERVED
448+
449+ static int zend_jit_trace_record_fake_init_call_ex (zend_execute_data * call , zend_jit_trace_rec * trace_buffer , int idx , uint32_t is_megamorphic , uint32_t init_level )
443450{
444451 zend_jit_trace_stop stop ZEND_ATTRIBUTE_UNUSED = ZEND_JIT_TRACE_STOP_ERROR ;
445452
@@ -448,7 +455,7 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
448455 zend_jit_op_array_trace_extension * jit_extension ;
449456
450457 if (call -> prev_execute_data ) {
451- idx = zend_jit_trace_record_fake_init_call_ex (call -> prev_execute_data , trace_buffer , idx , is_megamorphic , megamorphic , level , init_level + 1 , call_level );
458+ idx = zend_jit_trace_record_fake_init_call_ex (call -> prev_execute_data , trace_buffer , idx , is_megamorphic , init_level + 1 );
452459 if (idx < 0 ) {
453460 return idx ;
454461 }
@@ -479,32 +486,16 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
479486 && ((ZEND_CALL_INFO (call ) & ZEND_CALL_DYNAMIC )
480487 || func -> common .scope )) {
481488 func = NULL ;
482- * megamorphic |= (1 << (level + * call_level ));
483- } else {
484- * megamorphic &= ~(1 << (level + * call_level ));
489+ ZEND_ADD_CALL_FLAG (EX (call ), ZEND_CALL_MEGAMORPHIC );
485490 }
486- (* call_level )++ ;
487491 TRACE_RECORD (ZEND_JIT_TRACE_INIT_CALL , ZEND_JIT_TRACE_FAKE_INFO (init_level ), func );
488492 } while (0 );
489493 return idx ;
490494}
491495
492- static int zend_jit_trace_record_fake_init_call (zend_execute_data * call , zend_jit_trace_rec * trace_buffer , int idx , uint32_t is_megamorphic , uint32_t * megamorphic , uint32_t level )
496+ static int zend_jit_trace_record_fake_init_call (zend_execute_data * call , zend_jit_trace_rec * trace_buffer , int idx , uint32_t is_megamorphic )
493497{
494- uint32_t call_level = 0 ;
495-
496- return zend_jit_trace_record_fake_init_call_ex (call , trace_buffer , idx , is_megamorphic , megamorphic , level , 0 , & call_level );
497- }
498-
499- static int zend_jit_trace_call_level (const zend_execute_data * call )
500- {
501- int call_level = 0 ;
502-
503- while (call -> prev_execute_data ) {
504- call_level ++ ;
505- call = call -> prev_execute_data ;
506- }
507- return call_level ;
498+ return zend_jit_trace_record_fake_init_call_ex (call , trace_buffer , idx , is_megamorphic , 0 );
508499}
509500
510501static int zend_jit_trace_subtrace (zend_jit_trace_rec * trace_buffer , int start , int end , uint8_t event , const zend_op_array * op_array , const zend_op * opline )
@@ -558,7 +549,6 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
558549 zend_jit_trace_stop halt = 0 ;
559550 int level = 0 ;
560551 int ret_level = 0 ;
561- int call_level ;
562552 zend_vm_opcode_handler_t handler ;
563553 const zend_op_array * op_array ;
564554 zend_jit_op_array_trace_extension * jit_extension ;
@@ -575,7 +565,6 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
575565 int last_loop = -1 ;
576566 int last_loop_level = -1 ;
577567 const zend_op * last_loop_opline = NULL ;
578- uint32_t megamorphic = 0 ;
579568 const zend_op_array * unrolled_calls [ZEND_JIT_TRACE_MAX_CALL_DEPTH + ZEND_JIT_TRACE_MAX_RET_DEPTH ];
580569#ifdef HAVE_GCC_GLOBAL_REGS
581570 zend_execute_data * prev_execute_data = ex ;
@@ -613,7 +602,7 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
613602 }
614603
615604 if (prev_call ) {
616- int ret = zend_jit_trace_record_fake_init_call (prev_call , trace_buffer , idx , is_megamorphic , & megamorphic , ret_level + level );
605+ int ret = zend_jit_trace_record_fake_init_call (prev_call , trace_buffer , idx , is_megamorphic );
617606 if (ret < 0 ) {
618607 TRACE_END (ZEND_JIT_TRACE_END , ZEND_JIT_TRACE_STOP_BAD_FUNC , opline );
619608#ifdef HAVE_GCC_GLOBAL_REGS
@@ -723,8 +712,7 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
723712 || opline -> opcode == ZEND_DO_ICALL
724713 || opline -> opcode == ZEND_DO_UCALL
725714 || opline -> opcode == ZEND_DO_FCALL_BY_NAME ) {
726- call_level = zend_jit_trace_call_level (EX (call ));
727- if (megamorphic & (1 << (ret_level + level + call_level ))) {
715+ if (ZEND_CALL_INFO (EX (call )) & ZEND_CALL_MEGAMORPHIC ) {
728716 stop = ZEND_JIT_TRACE_STOP_INTERPRETER ;
729717 break ;
730718 }
@@ -852,7 +840,7 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
852840 last_loop_opline = NULL ;
853841
854842 if (prev_call ) {
855- int ret = zend_jit_trace_record_fake_init_call (prev_call , trace_buffer , idx , 0 , & megamorphic , ret_level + level );
843+ int ret = zend_jit_trace_record_fake_init_call (prev_call , trace_buffer , idx , 0 );
856844 if (ret < 0 ) {
857845 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC ;
858846 break ;
@@ -935,12 +923,8 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
935923 && trace_buffer [1 ].opline == opline - 1 ) {
936924 func = NULL ;
937925 }
938- call_level = zend_jit_trace_call_level (EX (call ));
939- ZEND_ASSERT (ret_level + level + call_level < 32 );
940- if (func ) {
941- megamorphic &= ~(1 << (ret_level + level + call_level ));
942- } else {
943- megamorphic |= (1 << (ret_level + level + call_level ));
926+ if (!func ) {
927+ ZEND_ADD_CALL_FLAG (EX (call ), ZEND_CALL_MEGAMORPHIC );
944928 }
945929 TRACE_RECORD (ZEND_JIT_TRACE_INIT_CALL , 0 , func );
946930 }
0 commit comments