@@ -652,20 +652,23 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
652652{
653653 const StencilGroup * group ;
654654 // Loop once to find the total compiled size:
655- size_t code_size = 0 ;
655+ size_t hot_code_size = 0 ;
656+ size_t cold_code_size = 0 ;
656657 size_t data_size = 0 ;
657658 jit_state state = {0 };
658659 for (size_t i = 0 ; i < length ; i ++ ) {
659660 const _PyUOpInstruction * instruction = & trace [i ];
660661 group = & stencil_groups [instruction -> opcode ];
661- state .instruction_starts [i ] = code_size ;
662- code_size += group -> code_size ;
662+ state .instruction_starts [i ] = hot_code_size ;
663+ hot_code_size += group -> hot_code_size ;
664+ cold_code_size += group -> cold_code_size ;
663665 data_size += group -> data_size ;
664666 combine_symbol_mask (group -> trampoline_mask , state .trampolines .mask );
665667 combine_symbol_mask (group -> got_mask , state .got_symbols .mask );
666668 }
667669 group = & stencil_groups [_FATAL_ERROR_r00 ];
668- code_size += group -> code_size ;
670+ hot_code_size += group -> hot_code_size ;
671+ cold_code_size += group -> cold_code_size ;
669672 data_size += group -> data_size ;
670673 combine_symbol_mask (group -> trampoline_mask , state .trampolines .mask );
671674 combine_symbol_mask (group -> got_mask , state .got_symbols .mask );
@@ -679,6 +682,7 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
679682 // Round up to the nearest page:
680683 size_t page_size = get_page_size ();
681684 assert ((page_size & (page_size - 1 )) == 0 );
685+ size_t code_size = hot_code_size + cold_code_size ;
682686 size_t code_padding = DATA_ALIGN - ((code_size + state .trampolines .size ) & (DATA_ALIGN - 1 ));
683687 size_t padding = page_size - ((code_size + state .trampolines .size + code_padding + data_size + state .got_symbols .size ) & (page_size - 1 ));
684688 size_t total_size = code_size + state .trampolines .size + code_padding + data_size + state .got_symbols .size + padding ;
@@ -700,23 +704,27 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
700704 }
701705 // Loop again to emit the code:
702706 unsigned char * code = memory ;
707+ unsigned char * cold = memory + hot_code_size ;
703708 state .trampolines .mem = memory + code_size ;
704709 unsigned char * data = memory + code_size + state .trampolines .size + code_padding ;
705710 assert (trace [0 ].opcode == _START_EXECUTOR_r00 || trace [0 ].opcode == _COLD_EXIT_r00 || trace [0 ].opcode == _COLD_DYNAMIC_EXIT_r00 );
706711 state .got_symbols .mem = data + data_size ;
707712 for (size_t i = 0 ; i < length ; i ++ ) {
708713 const _PyUOpInstruction * instruction = & trace [i ];
709714 group = & stencil_groups [instruction -> opcode ];
710- group -> emit (code , data , executor , instruction , & state );
711- code += group -> code_size ;
715+ group -> emit (code , cold , data , executor , instruction , & state );
716+ code += group -> hot_code_size ;
717+ cold += group -> cold_code_size ;
712718 data += group -> data_size ;
713719 }
714720 // Protect against accidental buffer overrun into data:
715721 group = & stencil_groups [_FATAL_ERROR_r00 ];
716- group -> emit (code , data , executor , NULL , & state );
717- code += group -> code_size ;
722+ group -> emit (code , cold , data , executor , NULL , & state );
723+ code += group -> hot_code_size ;
724+ cold += group -> cold_code_size ;
718725 data += group -> data_size ;
719- assert (code == memory + code_size );
726+ assert (code == memory + hot_code_size );
727+ assert (cold == memory + code_size );
720728 assert (data == memory + code_size + state .trampolines .size + code_padding + data_size );
721729 if (mark_executable (memory , total_size )) {
722730 jit_free (memory , total_size );
@@ -738,17 +746,20 @@ compile_shim(void)
738746{
739747 _PyExecutorObject dummy ;
740748 const StencilGroup * group ;
741- size_t code_size = 0 ;
749+ size_t hot_code_size = 0 ;
750+ size_t cold_code_size = 0 ;
742751 size_t data_size = 0 ;
743752 jit_state state = {0 };
744753 group = & shim ;
745- code_size += group -> code_size ;
754+ hot_code_size += group -> hot_code_size ;
755+ cold_code_size += group -> cold_code_size ;
746756 data_size += group -> data_size ;
747757 combine_symbol_mask (group -> trampoline_mask , state .trampolines .mask );
748758 combine_symbol_mask (group -> got_mask , state .got_symbols .mask );
749759 // Round up to the nearest page:
750760 size_t page_size = get_page_size ();
751761 assert ((page_size & (page_size - 1 )) == 0 );
762+ size_t code_size = hot_code_size + cold_code_size ;
752763 size_t code_padding = DATA_ALIGN - ((code_size + state .trampolines .size ) & (DATA_ALIGN - 1 ));
753764 size_t padding = page_size - ((code_size + state .trampolines .size + code_padding + data_size + state .got_symbols .size ) & (page_size - 1 ));
754765 size_t total_size = code_size + state .trampolines .size + code_padding + data_size + state .got_symbols .size + padding ;
@@ -757,17 +768,20 @@ compile_shim(void)
757768 return NULL ;
758769 }
759770 unsigned char * code = memory ;
771+ unsigned char * cold = memory + hot_code_size ;
760772 state .trampolines .mem = memory + code_size ;
761773 unsigned char * data = memory + code_size + state .trampolines .size + code_padding ;
762774 state .got_symbols .mem = data + data_size ;
763775 // Compile the shim, which handles converting between the native
764776 // calling convention and the calling convention used by jitted code
765777 // (which may be different for efficiency reasons).
766778 group = & shim ;
767- group -> emit (code , data , & dummy , NULL , & state );
768- code += group -> code_size ;
779+ group -> emit (code , cold , data , & dummy , NULL , & state );
780+ code += group -> hot_code_size ;
781+ cold += group -> cold_code_size ;
769782 data += group -> data_size ;
770- assert (code == memory + code_size );
783+ assert (code == memory + hot_code_size );
784+ assert (cold == memory + code_size );
771785 assert (data == memory + code_size + state .trampolines .size + code_padding + data_size );
772786 if (mark_executable (memory , total_size )) {
773787 jit_free (memory , total_size );
0 commit comments