diff --git a/lib/irr/lccrt_irrjit.h b/lib/irr/lccrt_irrjit.h index d030376..1bec016 100644 --- a/lib/irr/lccrt_irrjit.h +++ b/lib/irr/lccrt_irrjit.h @@ -1,5 +1,5 @@ /** - * lccrt.h - пользовательский интерфейс (динамической) компиляции. + * lccrt.h - п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╧ п╦п╫я┌п╣я─я└п╣п╧я│ (п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧) п╨п╬п╪п©п╦п╩я▐я├п╦п╦. * * Copyright (c) 1992-2019 AO "MCST". All rights reserved. */ @@ -21,7 +21,7 @@ typedef struct lccrt_irr_code_area_r *lccrt_irr_code_area_ptr; typedef lccrt_irr_code_area_ptr lccrt_irr_ca_ptr; /** - * Просто буфер. + * п÷я─п╬я│я┌п╬ п╠я┐я└п╣я─. */ typedef struct lccrt_irr_buffer_r { @@ -32,243 +32,243 @@ typedef struct lccrt_irr_buffer_r } lccrt_irr_buffer_t; /** - * Элемент двусвязного списка. + * п╜п╩п╣п╪п╣п╫я┌ п╢п╡я┐я│п╡я▐п╥п╫п╬пЁп╬ я│п©п╦я│п╨п╟. */ typedef struct lccrt_irr_edge_link_r { - lccrt_irr_edge_ptr prev; /* предыдущий элемент списка */ - lccrt_irr_edge_ptr next; /* следующий элемент списка */ - void *data; /* пользовательские данные */ + lccrt_irr_edge_ptr prev; /* п©я─п╣п╢я▀п╢я┐я┴п╦п╧ я█п╩п╣п╪п╣п╫я┌ я│п©п╦я│п╨п╟ */ + lccrt_irr_edge_ptr next; /* я│п╩п╣п╢я┐я▌я┴п╦п╧ я█п╩п╣п╪п╣п╫я┌ я│п©п╦я│п╨п╟ */ + void *data; /* п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╣ п╢п╟п╫п╫я▀п╣ */ } lccrt_irr_edge_link_t; /** - * Двусторонняя дуга. + * п■п╡я┐я│я┌п╬я─п╬п╫п╫я▐я▐ п╢я┐пЁп╟. */ typedef struct lccrt_irr_edge_r { - lccrt_irr_edge_link_t src; /* источник дуги */ - lccrt_irr_edge_link_t dst; /* приемник дуги */ + lccrt_irr_edge_link_t src; /* п╦я│я┌п╬я┤п╫п╦п╨ п╢я┐пЁп╦ */ + lccrt_irr_edge_link_t dst; /* п©я─п╦п╣п╪п╫п╦п╨ п╢я┐пЁп╦ */ lccrt_check_type_t type_check; } lccrt_irr_edge_t; /** - * Участок памяти для размещения нативного кода. + * пёя┤п╟я│я┌п╬п╨ п©п╟п╪я▐я┌п╦ п╢п╩я▐ я─п╟п╥п╪п╣я┴п╣п╫п╦я▐ п╫п╟я┌п╦п╡п╫п╬пЁп╬ п╨п╬п╢п╟. */ typedef struct lccrt_irr_code_area_r { - lccrt_irr_jr_ptr jr; /* jit-регион */ - void *area; /* участок памяти (открытый на исполнение) */ - int64_t area_len; /* байтовый размер участка */ - int64_t area_use; /* количество байт, использованных от начала участка */ + lccrt_irr_jr_ptr jr; /* jit-я─п╣пЁп╦п╬п╫ */ + void *area; /* я┐я┤п╟я│я┌п╬п╨ п©п╟п╪я▐я┌п╦ (п╬я┌п╨я─я▀я┌я▀п╧ п╫п╟ п╦я│п©п╬п╩п╫п╣п╫п╦п╣) */ + int64_t area_len; /* п╠п╟п╧я┌п╬п╡я▀п╧ я─п╟п╥п╪п╣я─ я┐я┤п╟я│я┌п╨п╟ */ + int64_t area_use; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╠п╟п╧я┌, п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╫я▀я┘ п╬я┌ п╫п╟я┤п╟п╩п╟ я┐я┤п╟я│я┌п╨п╟ */ struct lccrt_irr_code_area_r *prev; struct lccrt_irr_code_area_r *next; lccrt_check_type_t type_check; } lccrt_irr_code_area_t; /** - * Результат компиляции группы линейных участков с одной точкой входа. + * п═п╣п╥я┐п╩я▄я┌п╟я┌ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ пЁя─я┐п©п©я▀ п╩п╦п╫п╣п╧п╫я▀я┘ я┐я┤п╟я│я┌п╨п╬п╡ я│ п╬п╢п╫п╬п╧ я┌п╬я┤п╨п╬п╧ п╡я┘п╬п╢п╟. */ typedef struct lccrt_irr_code_r { - void *start_point; /* начало нативного кода */ - lccrt_irr_jr_ptr jr; /* jit-регион */ - lccrt_irr_node_ptr node; /* стартовый узел группы */ - lccrt_irr_edge_ptr nodes; /* множество узлов, из которых был скомпилирован данный нативный код - (источник дуги - данный код, приемник дуги - узел) */ + void *start_point; /* п╫п╟я┤п╟п╩п╬ п╫п╟я┌п╦п╡п╫п╬пЁп╬ п╨п╬п╢п╟ */ + lccrt_irr_jr_ptr jr; /* jit-я─п╣пЁп╦п╬п╫ */ + lccrt_irr_node_ptr node; /* я│я┌п╟я─я┌п╬п╡я▀п╧ я┐п╥п╣п╩ пЁя─я┐п©п©я▀ */ + lccrt_irr_edge_ptr nodes; /* п╪п╫п╬п╤п╣я│я┌п╡п╬ я┐п╥п╩п╬п╡, п╦п╥ п╨п╬я┌п╬я─я▀я┘ п╠я▀п╩ я│п╨п╬п╪п©п╦п╩п╦я─п╬п╡п╟п╫ п╢п╟п╫п╫я▀п╧ п╫п╟я┌п╦п╡п╫я▀п╧ п╨п╬п╢ + (п╦я│я┌п╬я┤п╫п╦п╨ п╢я┐пЁп╦ - п╢п╟п╫п╫я▀п╧ п╨п╬п╢, п©я─п╦п╣п╪п╫п╦п╨ п╢я┐пЁп╦ - я┐п╥п╣п╩) */ lccrt_check_type_t type_check; } lccrt_irr_code_t; /** - * Данные модуля трансляция виртуального адреса. + * п■п╟п╫п╫я▀п╣ п╪п╬п╢я┐п╩я▐ я┌я─п╟п╫я│п╩я▐я├п╦я▐ п╡п╦я─я┌я┐п╟п╩я▄п╫п╬пЁп╬ п╟п╢я─п╣я│п╟. */ typedef struct lccrt_irr_resolve_r { - void *data; /* данные, которые необходимо передать функции трансляции не распределенного адреса */ - lccrt_irr_resolve_virt_addr_func_t func; /* функция трансляции не распределенного адреса */ - void ***etbls; /* промежуточные таблицы для еще не распределенных адресов */ - void **table0; /* корневая таблица трансляции виртуального адреса */ - int level; /* количество промежуточных (без листового) уровней трансляции */ - int bits; /* количество значащих бит в промежуточной части адреса */ - int tail_bits; /* количество значащих бит в листовой части адреса (если - level*bits + tail_bits < 64, то считаем траслируемый адрес - всегда выравненным на недостающее количество бит) */ + void *data; /* п╢п╟п╫п╫я▀п╣, п╨п╬я┌п╬я─я▀п╣ п╫п╣п╬п╠я┘п╬п╢п╦п╪п╬ п©п╣я─п╣п╢п╟я┌я▄ я└я┐п╫п╨я├п╦п╦ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╫п╣ я─п╟я│п©я─п╣п╢п╣п╩п╣п╫п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ */ + lccrt_irr_resolve_virt_addr_func_t func; /* я└я┐п╫п╨я├п╦я▐ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╫п╣ я─п╟я│п©я─п╣п╢п╣п╩п╣п╫п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ */ + void ***etbls; /* п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫я▀п╣ я┌п╟п╠п╩п╦я├я▀ п╢п╩я▐ п╣я┴п╣ п╫п╣ я─п╟я│п©я─п╣п╢п╣п╩п╣п╫п╫я▀я┘ п╟п╢я─п╣я│п╬п╡ */ + void **table0; /* п╨п╬я─п╫п╣п╡п╟я▐ я┌п╟п╠п╩п╦я├п╟ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╡п╦я─я┌я┐п╟п╩я▄п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ */ + int level; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫я▀я┘ (п╠п╣п╥ п╩п╦я│я┌п╬п╡п╬пЁп╬) я┐я─п╬п╡п╫п╣п╧ я┌я─п╟п╫я│п╩я▐я├п╦п╦ */ + int bits; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╥п╫п╟я┤п╟я┴п╦я┘ п╠п╦я┌ п╡ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬п╧ я┤п╟я│я┌п╦ п╟п╢я─п╣я│п╟ */ + int tail_bits; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╥п╫п╟я┤п╟я┴п╦я┘ п╠п╦я┌ п╡ п╩п╦я│я┌п╬п╡п╬п╧ я┤п╟я│я┌п╦ п╟п╢я─п╣я│п╟ (п╣я│п╩п╦ + level*bits + tail_bits < 64, я┌п╬ я│я┤п╦я┌п╟п╣п╪ я┌я─п╟я│п╩п╦я─я┐п╣п╪я▀п╧ п╟п╢я─п╣я│ + п╡я│п╣пЁп╢п╟ п╡я▀я─п╟п╡п╫п╣п╫п╫я▀п╪ п╫п╟ п╫п╣п╢п╬я│я┌п╟я▌я┴п╣п╣ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╠п╦я┌) */ struct { - uint64_t vaddr_hi; /* полная старшая часть виртуального адреса последнего обращения */ - void **table; /* таблица последнего обращения */ + uint64_t vaddr_hi; /* п©п╬п╩п╫п╟я▐ я│я┌п╟я─я┬п╟я▐ я┤п╟я│я┌я▄ п╡п╦я─я┌я┐п╟п╩я▄п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ п©п╬я│п╩п╣п╢п╫п╣пЁп╬ п╬п╠я─п╟я┴п╣п╫п╦я▐ */ + void **table; /* я┌п╟п╠п╩п╦я├п╟ п©п╬я│п╩п╣п╢п╫п╣пЁп╬ п╬п╠я─п╟я┴п╣п╫п╦я▐ */ } hash; } lccrt_irr_resolve_t; /** - * Данные потока компиляции. + * п■п╟п╫п╫я▀п╣ п©п╬я┌п╬п╨п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct { - pthread_t func; /* данные потока компиляции */ - pthread_mutex_t a_sync; /* для передачи сигнала в поток компиляции */ - pthread_mutex_t b_sync; /* для приема сигнала из потока компиляции */ - lccrt_plugin_t *plg; /* библиотека компиляции Backend Bytecode'а в целевой код */ - lccrt_irr_buffer_t buff; /* буфер для формирования Backend Bytecode */ - lccrt_irr_node_ptr node; /* линейный участок, переданный потоку компиляции */ - lccrt_irr_code_ptr code; /* набор линейных участков, представление которых передано - потоку компиляции */ - uint8_t is_ready; /* флаг готовности потока компиляции */ - char *exec_mem; /* текущая страница открытая на запись и исполнение */ - int64_t exec_index; /* индекс в текущей странице (количество использованных байт) */ - int64_t exec_length; /* байтовый размер текущей страницы */ + pthread_t func; /* п╢п╟п╫п╫я▀п╣ п©п╬я┌п╬п╨п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + pthread_mutex_t a_sync; /* п╢п╩я▐ п©п╣я─п╣п╢п╟я┤п╦ я│п╦пЁп╫п╟п╩п╟ п╡ п©п╬я┌п╬п╨ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + pthread_mutex_t b_sync; /* п╢п╩я▐ п©я─п╦п╣п╪п╟ я│п╦пЁп╫п╟п╩п╟ п╦п╥ п©п╬я┌п╬п╨п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + lccrt_plugin_t *plg; /* п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ Backend Bytecode'п╟ п╡ я├п╣п╩п╣п╡п╬п╧ п╨п╬п╢ */ + lccrt_irr_buffer_t buff; /* п╠я┐я└п╣я─ п╢п╩я▐ я└п╬я─п╪п╦я─п╬п╡п╟п╫п╦я▐ Backend Bytecode */ + lccrt_irr_node_ptr node; /* п╩п╦п╫п╣п╧п╫я▀п╧ я┐я┤п╟я│я┌п╬п╨, п©п╣я─п╣п╢п╟п╫п╫я▀п╧ п©п╬я┌п╬п╨я┐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + lccrt_irr_code_ptr code; /* п╫п╟п╠п╬я─ п╩п╦п╫п╣п╧п╫я▀я┘ я┐я┤п╟я│я┌п╨п╬п╡, п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦п╣ п╨п╬я┌п╬я─я▀я┘ п©п╣я─п╣п╢п╟п╫п╬ + п©п╬я┌п╬п╨я┐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + uint8_t is_ready; /* я└п╩п╟пЁ пЁп╬я┌п╬п╡п╫п╬я│я┌п╦ п©п╬я┌п╬п╨п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + char *exec_mem; /* я┌п╣п╨я┐я┴п╟я▐ я│я┌я─п╟п╫п╦я├п╟ п╬я┌п╨я─я▀я┌п╟я▐ п╫п╟ п╥п╟п©п╦я│я▄ п╦ п╦я│п©п╬п╩п╫п╣п╫п╦п╣ */ + int64_t exec_index; /* п╦п╫п╢п╣п╨я│ п╡ я┌п╣п╨я┐я┴п╣п╧ я│я┌я─п╟п╫п╦я├п╣ (п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╫я▀я┘ п╠п╟п╧я┌) */ + int64_t exec_length; /* п╠п╟п╧я┌п╬п╡я▀п╧ я─п╟п╥п╪п╣я─ я┌п╣п╨я┐я┴п╣п╧ я│я┌я─п╟п╫п╦я├я▀ */ } lccrt_irr_compile_t; /** - * Период поиска линейного участка с максимальным счетчиком. + * п÷п╣я─п╦п╬п╢ п©п╬п╦я│п╨п╟ п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟ я│ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╪ я│я┤п╣я┌я┤п╦п╨п╬п╪. */ #define LCCRT_IRR_COUNTS_CHAIN_MAX (64) /** - * Данные региона динамической компиляции. + * п■п╟п╫п╫я▀п╣ я─п╣пЁп╦п╬п╫п╟ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct lccrt_irr_jit_region_r { - lccrt_ctx_ptr ctx; /* общий контекст */ - const char *arch; /* название целевой архитектуры */ - lccrt_irr_resolve_t resolve; /* модуль трансляции виртуального адреса */ - /* цепочка для выявления узла с максимальным счетчиком */ + lccrt_ctx_ptr ctx; /* п╬п╠я┴п╦п╧ п╨п╬п╫я┌п╣п╨я│я┌ */ + const char *arch; /* п╫п╟п╥п╡п╟п╫п╦п╣ я├п╣п╩п╣п╡п╬п╧ п╟я─я┘п╦я┌п╣п╨я┌я┐я─я▀ */ + lccrt_irr_resolve_t resolve; /* п╪п╬п╢я┐п╩я▄ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╡п╦я─я┌я┐п╟п╩я▄п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ */ + /* я├п╣п©п╬я┤п╨п╟ п╢п╩я▐ п╡я▀я▐п╡п╩п╣п╫п╦я▐ я┐п╥п╩п╟ я│ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╪ я│я┤п╣я┌я┤п╦п╨п╬п╪ */ struct { - lccrt_irr_node_ptr max_node; /* узел с максимальным счетчиком */ - lccrt_irr_node_ptr max_node_prev; /* узел с максимальным счетчиком */ - uint64_t cur_length; /* текущая длина цепочки */ + lccrt_irr_node_ptr max_node; /* я┐п╥п╣п╩ я│ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╪ я│я┤п╣я┌я┤п╦п╨п╬п╪ */ + lccrt_irr_node_ptr max_node_prev; /* я┐п╥п╣п╩ я│ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╪ я│я┤п╣я┌я┤п╦п╨п╬п╪ */ + uint64_t cur_length; /* я┌п╣п╨я┐я┴п╟я▐ п╢п╩п╦п╫п╟ я├п╣п©п╬я┤п╨п╦ */ } counts_chain; - lccrt_irr_compile_t comp; /* данные для взаимодействия с компилятором */ - uint64_t node_ident; /* идентификатор для следующего линейного участка */ - uint64_t oper_ident; /* идентификатор для следующей операции */ - uint64_t exec_node_count; /* количество исполненных узлов в интерпретаторе */ + lccrt_irr_compile_t comp; /* п╢п╟п╫п╫я▀п╣ п╢п╩я▐ п╡п╥п╟п╦п╪п╬п╢п╣п╧я│я┌п╡п╦я▐ я│ п╨п╬п╪п©п╦п╩я▐я┌п╬я─п╬п╪ */ + uint64_t node_ident; /* п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п╢п╩я▐ я│п╩п╣п╢я┐я▌я┴п╣пЁп╬ п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟ */ + uint64_t oper_ident; /* п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п╢п╩я▐ я│п╩п╣п╢я┐я▌я┴п╣п╧ п╬п©п╣я─п╟я├п╦п╦ */ + uint64_t exec_node_count; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╦я│п©п╬п╩п╫п╣п╫п╫я▀я┘ я┐п╥п╩п╬п╡ п╡ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╣ */ struct lccrt_irr_reloc_unit_r *free_relocs; - int8_t is_exit_all; /* возврат после каждого линейного участка */ - int8_t is_debug_done; /* по отладочной опции завершено исполнение irr-кода */ - lccrt_irr_code_area_ptr code_areas; /* список участков памяти для кода */ - lccrt_irr_edge_ptr free_edges; /* список свободных дуг */ + int8_t is_exit_all; /* п╡п╬п╥п╡я─п╟я┌ п©п╬я│п╩п╣ п╨п╟п╤п╢п╬пЁп╬ п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟ */ + int8_t is_debug_done; /* п©п╬ п╬я┌п╩п╟п╢п╬я┤п╫п╬п╧ п╬п©я├п╦п╦ п╥п╟п╡п╣я─я┬п╣п╫п╬ п╦я│п©п╬п╩п╫п╣п╫п╦п╣ irr-п╨п╬п╢п╟ */ + lccrt_irr_code_area_ptr code_areas; /* я│п©п╦я│п╬п╨ я┐я┤п╟я│я┌п╨п╬п╡ п©п╟п╪я▐я┌п╦ п╢п╩я▐ п╨п╬п╢п╟ */ + lccrt_irr_edge_ptr free_edges; /* я│п©п╦я│п╬п╨ я│п╡п╬п╠п╬п╢п╫я▀я┘ п╢я┐пЁ */ lccrt_check_type_t type_check; } lccrt_irr_jit_region_t; #if 0 /** - * Данные региона динамической компиляции. + * п■п╟п╫п╫я▀п╣ я─п╣пЁп╦п╬п╫п╟ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct lccrt_irr_code_r { - lccrt_ctx_ptr ctx; /* общий контекст */ + lccrt_ctx_ptr ctx; /* п╬п╠я┴п╦п╧ п╨п╬п╫я┌п╣п╨я│я┌ */ lccrt_irr_jit_region_ptr jr; - lccrt_irr_node_ptr node; /* исходный узел */ - uint64_t phys_addr; /* адрес расположения первой машинной инструкции */ - int64_t phys_len; /* байтовый размер машинного кода */ - void *relocs; /* ссылка на пользовательские данные (релокейшены указывающие на данный код) */ + lccrt_irr_node_ptr node; /* п╦я│я┘п╬п╢п╫я▀п╧ я┐п╥п╣п╩ */ + uint64_t phys_addr; /* п╟п╢я─п╣я│ я─п╟я│п©п╬п╩п╬п╤п╣п╫п╦я▐ п©п╣я─п╡п╬п╧ п╪п╟я┬п╦п╫п╫п╬п╧ п╦п╫я│я┌я─я┐п╨я├п╦п╦ */ + int64_t phys_len; /* п╠п╟п╧я┌п╬п╡я▀п╧ я─п╟п╥п╪п╣я─ п╪п╟я┬п╦п╫п╫п╬пЁп╬ п╨п╬п╢п╟ */ + void *relocs; /* я│я│я▀п╩п╨п╟ п╫п╟ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╣ п╢п╟п╫п╫я▀п╣ (я─п╣п╩п╬п╨п╣п╧я┬п╣п╫я▀ я┐п╨п╟п╥я▀п╡п╟я▌я┴п╦п╣ п╫п╟ п╢п╟п╫п╫я▀п╧ п╨п╬п╢) */ lccrt_check_type_t type_check; } lccrt_irr_code_t; #endif /** - * Размер кэша трансляции в контексте исполнения. + * п═п╟п╥п╪п╣я─ п╨я█я┬п╟ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╡ п╨п╬п╫я┌п╣п╨я│я┌п╣ п╦я│п©п╬п╩п╫п╣п╫п╦я▐. */ #define LCCRT_IRR_EC_DLINKS_LEN (8) /** - * Данные контекста исполнения кода, полученного в результате компиляции. + * п■п╟п╫п╫я▀п╣ п╨п╬п╫я┌п╣п╨я│я┌п╟ п╦я│п©п╬п╩п╫п╣п╫п╦я▐ п╨п╬п╢п╟, п©п╬п╩я┐я┤п╣п╫п╫п╬пЁп╬ п╡ я─п╣п╥я┐п╩я▄я┌п╟я┌п╣ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct lccrt_irr_execute_context_r { - lccrt_ctx_ptr ctx; /* общий контекст */ + lccrt_ctx_ptr ctx; /* п╬п╠я┴п╦п╧ п╨п╬п╫я┌п╣п╨я│я┌ */ lccrt_irr_jit_region_ptr jr; - int64_t exit_value; /* возвращаемое значение по завершению исполнения */ - int regs_max[LCCRT_IRR_REG_TYPE_LAST]; /* фактические максимальные количества регистров - каждого типа */ - uint64_t *ext_regs[LCCRT_IRR_REG_TYPE_LAST]; /* массивы со значениями регистров */ + int64_t exit_value; /* п╡п╬п╥п╡я─п╟я┴п╟п╣п╪п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ п©п╬ п╥п╟п╡п╣я─я┬п╣п╫п╦я▌ п╦я│п©п╬п╩п╫п╣п╫п╦я▐ */ + int regs_max[LCCRT_IRR_REG_TYPE_LAST]; /* я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╣ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╣ п╨п╬п╩п╦я┤п╣я│я┌п╡п╟ я─п╣пЁп╦я│я┌я─п╬п╡ + п╨п╟п╤п╢п╬пЁп╬ я┌п╦п©п╟ */ + uint64_t *ext_regs[LCCRT_IRR_REG_TYPE_LAST]; /* п╪п╟я│я│п╦п╡я▀ я│п╬ п╥п╫п╟я┤п╣п╫п╦я▐п╪п╦ я─п╣пЁп╦я│я┌я─п╬п╡ */ lccrt_check_type_t type_check; } lccrt_irr_execute_context_t; /** - * Типы релокейшенов. + * п╒п╦п©я▀ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╬п╡. */ typedef enum { - LCCRT_IRR_RELOC_TYPE_STATIC, /* размещение в байт-код операции LCCRT_IRR_OPER_BRANCHIF_RELOC */ + LCCRT_IRR_RELOC_TYPE_STATIC, /* я─п╟п╥п╪п╣я┴п╣п╫п╦п╣ п╡ п╠п╟п╧я┌-п╨п╬п╢ п╬п©п╣я─п╟я├п╦п╦ LCCRT_IRR_OPER_BRANCHIF_RELOC */ LCCRT_IRR_RELOC_TYPE_LAST } lccrt_irr_reloc_type_t; /** - * Элемент списка релокейшенов. + * п╜п╩п╣п╪п╣п╫я┌ я│п©п╦я│п╨п╟ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╬п╡. */ typedef struct lccrt_irr_reloc_unit_r { - struct lccrt_irr_reloc_unit_r *prev; /* ссылка на предыдущий элемент списка */ - struct lccrt_irr_reloc_unit_r *next; /* ссылка на следующий элемент списка */ - lccrt_irr_node_ptr dst_node; /* линейный участок, на который слинкован релокейшен */ - void *data; /* указатель на место размещения релокейшена */ - uint64_t data_ident; /* идентификатор места размещения */ - int index; /* позиция релокейшена в месте размещения */ - lccrt_irr_reloc_type_t type; /* тип релокейшена, на который указывает данный элемент */ + struct lccrt_irr_reloc_unit_r *prev; /* я│я│я▀п╩п╨п╟ п╫п╟ п©я─п╣п╢я▀п╢я┐я┴п╦п╧ я█п╩п╣п╪п╣п╫я┌ я│п©п╦я│п╨п╟ */ + struct lccrt_irr_reloc_unit_r *next; /* я│я│я▀п╩п╨п╟ п╫п╟ я│п╩п╣п╢я┐я▌я┴п╦п╧ я█п╩п╣п╪п╣п╫я┌ я│п©п╦я│п╨п╟ */ + lccrt_irr_node_ptr dst_node; /* п╩п╦п╫п╣п╧п╫я▀п╧ я┐я┤п╟я│я┌п╬п╨, п╫п╟ п╨п╬я┌п╬я─я▀п╧ я│п╩п╦п╫п╨п╬п╡п╟п╫ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫ */ + void *data; /* я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ п╪п╣я│я┌п╬ я─п╟п╥п╪п╣я┴п╣п╫п╦я▐ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╟ */ + uint64_t data_ident; /* п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п╪п╣я│я┌п╟ я─п╟п╥п╪п╣я┴п╣п╫п╦я▐ */ + int index; /* п©п╬п╥п╦я├п╦я▐ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╟ п╡ п╪п╣я│я┌п╣ я─п╟п╥п╪п╣я┴п╣п╫п╦я▐ */ + lccrt_irr_reloc_type_t type; /* я┌п╦п© я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╟, п╫п╟ п╨п╬я┌п╬я─я▀п╧ я┐п╨п╟п╥я▀п╡п╟п╣я┌ п╢п╟п╫п╫я▀п╧ я█п╩п╣п╪п╣п╫я┌ */ lccrt_check_type_t type_check; } lccrt_irr_reloc_unit_t; /** - * Данные релокейшена. + * п■п╟п╫п╫я▀п╣ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╟. */ typedef struct lccrt_irr_reloc_r { - uint64_t phys_addr; /* адрес первой машинной инструкции, на которую следует передать исполнение - при переходе по релокейшену (данное поле всегда первое поле структуры!) */ - uint64_t virt_addr; /* внешний адресный дескриптор */ - lccrt_irr_code_ptr code; /* результат компиляции внешнего адресного дескриптора */ - lccrt_irr_node_ptr node; /* результат трансляции виртуального адреса */ - void *link; /* ссылка на пользовательские данные */ + uint64_t phys_addr; /* п╟п╢я─п╣я│ п©п╣я─п╡п╬п╧ п╪п╟я┬п╦п╫п╫п╬п╧ п╦п╫я│я┌я─я┐п╨я├п╦п╦, п╫п╟ п╨п╬я┌п╬я─я┐я▌ я│п╩п╣п╢я┐п╣я┌ п©п╣я─п╣п╢п╟я┌я▄ п╦я│п©п╬п╩п╫п╣п╫п╦п╣ + п©я─п╦ п©п╣я─п╣я┘п╬п╢п╣ п©п╬ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫я┐ (п╢п╟п╫п╫п╬п╣ п©п╬п╩п╣ п╡я│п╣пЁп╢п╟ п©п╣я─п╡п╬п╣ п©п╬п╩п╣ я│я┌я─я┐п╨я┌я┐я─я▀!) */ + uint64_t virt_addr; /* п╡п╫п╣я┬п╫п╦п╧ п╟п╢я─п╣я│п╫я▀п╧ п╢п╣я│п╨я─п╦п©я┌п╬я─ */ + lccrt_irr_code_ptr code; /* я─п╣п╥я┐п╩я▄я┌п╟я┌ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╡п╫п╣я┬п╫п╣пЁп╬ п╟п╢я─п╣я│п╫п╬пЁп╬ п╢п╣я│п╨я─п╦п©я┌п╬я─п╟ */ + lccrt_irr_node_ptr node; /* я─п╣п╥я┐п╩я▄я┌п╟я┌ я┌я─п╟п╫я│п╩я▐я├п╦п╦ п╡п╦я─я┌я┐п╟п╩я▄п╫п╬пЁп╬ п╟п╢я─п╣я│п╟ */ + void *link; /* я│я│я▀п╩п╨п╟ п╫п╟ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╣ п╢п╟п╫п╫я▀п╣ */ lccrt_irr_jit_region_ptr jr; lccrt_check_type_t type_check; } lccrt_irr_reloc_t; /** - * Байт-код представление операции для исполнения в интерпретаторе. + * п▒п╟п╧я┌-п╨п╬п╢ п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦п╣ п╬п©п╣я─п╟я├п╦п╦ п╢п╩я▐ п╦я│п©п╬п╩п╫п╣п╫п╦я▐ п╡ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╣. */ typedef struct lccrt_irr_bytecode_r { uintptr_t name; - uint64_t *a0; /* первый аргумент */ - uint64_t *a1; /* второй аргумент */ - uint64_t *a2; /* результат или третий аргумент */ - lccrt_irr_oper_ptr irr_oper; /* исходная irr-операция */ + uint64_t *a0; /* п©п╣я─п╡я▀п╧ п╟я─пЁя┐п╪п╣п╫я┌ */ + uint64_t *a1; /* п╡я┌п╬я─п╬п╧ п╟я─пЁя┐п╪п╣п╫я┌ */ + uint64_t *a2; /* я─п╣п╥я┐п╩я▄я┌п╟я┌ п╦п╩п╦ я┌я─п╣я┌п╦п╧ п╟я─пЁя┐п╪п╣п╫я┌ */ + lccrt_irr_oper_ptr irr_oper; /* п╦я│я┘п╬п╢п╫п╟я▐ irr-п╬п©п╣я─п╟я├п╦я▐ */ lccrt_check_type_t type_check; } lccrt_irr_bytecode_t; /** - * Узел промежуточного irr-представления. + * пёп╥п╣п╩ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬пЁп╬ irr-п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦я▐. */ typedef struct lccrt_irr_node_r { lccrt_irr_jr_ptr jr; - uint64_t user_ident; /* внешний идентификатор */ - uint64_t ident; /* внутренний идентификатор */ - lccrt_irr_oper_ptr beg; /* начальная операция узла */ - lccrt_irr_oper_ptr end; /* последняя операция узла */ - lccrt_irr_code_ptr code; /* результат компиляции в нативный код */ - lccrt_irr_reloc_unit_ptr relocs; /* список релокейшенов, указывающих на данный узел */ - uint64_t attrs; /* пользовательские атрибуты узла */ - uint64_t exec_count; /* счетчик узла */ - uint8_t is_delete; /* узел должен быть удален */ + uint64_t user_ident; /* п╡п╫п╣я┬п╫п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ */ + uint64_t ident; /* п╡п╫я┐я┌я─п╣п╫п╫п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ */ + lccrt_irr_oper_ptr beg; /* п╫п╟я┤п╟п╩я▄п╫п╟я▐ п╬п©п╣я─п╟я├п╦я▐ я┐п╥п╩п╟ */ + lccrt_irr_oper_ptr end; /* п©п╬я│п╩п╣п╢п╫я▐я▐ п╬п©п╣я─п╟я├п╦я▐ я┐п╥п╩п╟ */ + lccrt_irr_code_ptr code; /* я─п╣п╥я┐п╩я▄я┌п╟я┌ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╡ п╫п╟я┌п╦п╡п╫я▀п╧ п╨п╬п╢ */ + lccrt_irr_reloc_unit_ptr relocs; /* я│п©п╦я│п╬п╨ я─п╣п╩п╬п╨п╣п╧я┬п╣п╫п╬п╡, я┐п╨п╟п╥я▀п╡п╟я▌я┴п╦я┘ п╫п╟ п╢п╟п╫п╫я▀п╧ я┐п╥п╣п╩ */ + uint64_t attrs; /* п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╣ п╟я┌я─п╦п╠я┐я┌я▀ я┐п╥п╩п╟ */ + uint64_t exec_count; /* я│я┤п╣я┌я┤п╦п╨ я┐п╥п╩п╟ */ + uint8_t is_delete; /* я┐п╥п╣п╩ п╢п╬п╩п╤п╣п╫ п╠я▀я┌я▄ я┐п╢п╟п╩п╣п╫ */ #ifdef LCCRT_IRR_BYTECODE_E2K - char *e2k_opers[2]; /* цепочки операций, подготовленных для интерпретатора */ + char *e2k_opers[2]; /* я├п╣п©п╬я┤п╨п╦ п╬п©п╣я─п╟я├п╦п╧, п©п╬п╢пЁп╬я┌п╬п╡п╩п╣п╫п╫я▀я┘ п╢п╩я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ */ #else /* !LCCRT_IRR_BYTECODE_E2K */ - lccrt_irr_bytecode_t *bytecodes; /* цепочки операций, подготовленных для интерпретатора */ + lccrt_irr_bytecode_t *bytecodes; /* я├п╣п©п╬я┤п╨п╦ п╬п©п╣я─п╟я├п╦п╧, п©п╬п╢пЁп╬я┌п╬п╡п╩п╣п╫п╫я▀я┘ п╢п╩я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ */ #endif /* LCCRT_IRR_BYTECODE_E2K */ - /* данные, полученные при компиляции линейного участка */ + /* п╢п╟п╫п╫я▀п╣, п©п╬п╩я┐я┤п╣п╫п╫я▀п╣ п©я─п╦ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟ */ struct { - void *code; /* адрес начала кода */ - lccrt_irr_edge_ptr codes; /* множество групп компиляции, в которые был включен данный узел - (источник дуги - группа, приемник дуги - данный узел) */ + void *code; /* п╟п╢я─п╣я│ п╫п╟я┤п╟п╩п╟ п╨п╬п╢п╟ */ + lccrt_irr_edge_ptr codes; /* п╪п╫п╬п╤п╣я│я┌п╡п╬ пЁя─я┐п©п© п╨п╬п╪п©п╦п╩я▐я├п╦п╦, п╡ п╨п╬я┌п╬я─я▀п╣ п╠я▀п╩ п╡п╨п╩я▌я┤п╣п╫ п╢п╟п╫п╫я▀п╧ я┐п╥п╣п╩ + (п╦я│я┌п╬я┤п╫п╦п╨ п╢я┐пЁп╦ - пЁя─я┐п©п©п╟, п©я─п╦п╣п╪п╫п╦п╨ п╢я┐пЁп╦ - п╢п╟п╫п╫я▀п╧ я┐п╥п╣п╩) */ } comp; lccrt_check_type_t type_check; } lccrt_irr_node_t; /** - * Итератор операций узла промежуточного irr-представления. + * п≤я┌п╣я─п╟я┌п╬я─ п╬п©п╣я─п╟я├п╦п╧ я┐п╥п╩п╟ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬пЁп╬ irr-п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦я▐. */ typedef struct lccrt_irr_oper_iter_r { @@ -279,7 +279,7 @@ typedef struct lccrt_irr_oper_iter_r } lccrt_irr_oper_iter_t; /** - * Результат трансляции физического адреса. + * п═п╣п╥я┐п╩я▄я┌п╟я┌ я┌я─п╟п╫я│п╩я▐я├п╦п╦ я└п╦п╥п╦я┤п╣я│п╨п╬пЁп╬ п╟п╢я─п╣я│п╟. */ typedef struct lccrt_irr_oper_branch_r { @@ -287,26 +287,26 @@ typedef struct lccrt_irr_oper_branch_r } lccrt_irr_oper_branch_t; /** - * Операция промежуточного irr-представления. + * п·п©п╣я─п╟я├п╦я▐ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬пЁп╬ irr-п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦я▐. */ typedef struct lccrt_irr_oper_r { - lccrt_irr_node_ptr node; /* ссылка на охватывающий узел */ - lccrt_irr_oper_ptr prev; /* предыдущая операция в узле */ - lccrt_irr_oper_ptr next; /* следующая операция в узле (либо альтернатива-0 перехода) */ - lccrt_irr_oper_ptr nextif; /* альтернатива-1 перехода */ - lccrt_irr_arg_ptr args; /* массив аргументов */ - lccrt_irr_arg_ptr rarg; /* результат */ - uint64_t ident; /* внутренний идентификатор операции */ - uint64_t func; /* адрес, кода исполняющего операцию для интерпретатора */ - lccrt_irr_oper_branch_t *branch; /* дополнительные данные операции типа branch */ - int num_args; /* количество аргументов */ - lccrt_irr_oper_name_t name; /* название операции */ + lccrt_irr_node_ptr node; /* я│я│я▀п╩п╨п╟ п╫п╟ п╬я┘п╡п╟я┌я▀п╡п╟я▌я┴п╦п╧ я┐п╥п╣п╩ */ + lccrt_irr_oper_ptr prev; /* п©я─п╣п╢я▀п╢я┐я┴п╟я▐ п╬п©п╣я─п╟я├п╦я▐ п╡ я┐п╥п╩п╣ */ + lccrt_irr_oper_ptr next; /* я│п╩п╣п╢я┐я▌я┴п╟я▐ п╬п©п╣я─п╟я├п╦я▐ п╡ я┐п╥п╩п╣ (п╩п╦п╠п╬ п╟п╩я▄я┌п╣я─п╫п╟я┌п╦п╡п╟-0 п©п╣я─п╣я┘п╬п╢п╟) */ + lccrt_irr_oper_ptr nextif; /* п╟п╩я▄я┌п╣я─п╫п╟я┌п╦п╡п╟-1 п©п╣я─п╣я┘п╬п╢п╟ */ + lccrt_irr_arg_ptr args; /* п╪п╟я│я│п╦п╡ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡ */ + lccrt_irr_arg_ptr rarg; /* я─п╣п╥я┐п╩я▄я┌п╟я┌ */ + uint64_t ident; /* п╡п╫я┐я┌я─п╣п╫п╫п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п╬п©п╣я─п╟я├п╦п╦ */ + uint64_t func; /* п╟п╢я─п╣я│, п╨п╬п╢п╟ п╦я│п©п╬п╩п╫я▐я▌я┴п╣пЁп╬ п╬п©п╣я─п╟я├п╦я▌ п╢п╩я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ */ + lccrt_irr_oper_branch_t *branch; /* п╢п╬п©п╬п╩п╫п╦я┌п╣п╩я▄п╫я▀п╣ п╢п╟п╫п╫я▀п╣ п╬п©п╣я─п╟я├п╦п╦ я┌п╦п©п╟ branch */ + int num_args; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡ */ + lccrt_irr_oper_name_t name; /* п╫п╟п╥п╡п╟п╫п╦п╣ п╬п©п╣я─п╟я├п╦п╦ */ lccrt_check_type_t type_check; } lccrt_irr_oper_t; /** - * Типы аргументов. + * п╒п╦п©я▀ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡. */ typedef enum { @@ -317,7 +317,7 @@ typedef enum } lccrt_irr_arg_type_t; /** - * Аргумент операции промежуточного irr-представления. + * п░я─пЁя┐п╪п╣п╫я┌ п╬п©п╣я─п╟я├п╦п╦ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬пЁп╬ irr-п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦я▐. */ typedef struct lccrt_irr_arg_r { @@ -331,12 +331,12 @@ typedef struct lccrt_irr_arg_r } lccrt_irr_arg_t; /** - * Регистр промежуточного irr-представления. + * п═п╣пЁп╦я│я┌я─ п©я─п╬п╪п╣п╤я┐я┌п╬я┤п╫п╬пЁп╬ irr-п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╦я▐. */ typedef struct lccrt_irr_reg_r { - lccrt_irr_reg_type_t type; /* тип регистра */ - int64_t addr; /* номер регистра */ + lccrt_irr_reg_type_t type; /* я┌п╦п© я─п╣пЁп╦я│я┌я─п╟ */ + int64_t addr; /* п╫п╬п╪п╣я─ я─п╣пЁп╦я│я┌я─п╟ */ lccrt_check_type_t type_check; } lccrt_irr_reg_t; diff --git a/lib/irr/lccrt_jit.c b/lib/irr/lccrt_jit.c index c095878..3dbf92b 100644 --- a/lib/irr/lccrt_jit.c +++ b/lib/irr/lccrt_jit.c @@ -22,8 +22,8 @@ static lccrt_irr_oper_t lccrt_irr_oper_reloc = static uint64_t lccrt_irr_bytecode_empty = 0; /** - * Обновление линейных участков с максимальными счетчиками. Передача в компилятор - * линейного участка. Получение из компилятора готового кода. + * п·п╠п╫п╬п╡п╩п╣п╫п╦п╣ п╩п╦п╫п╣п╧п╫я▀я┘ я┐я┤п╟я│я┌п╨п╬п╡ я│ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╪п╦ я│я┤п╣я┌я┤п╦п╨п╟п╪п╦. п÷п╣я─п╣п╢п╟я┤п╟ п╡ п╨п╬п╪п©п╦п╩я▐я┌п╬я─ + * п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟. п÷п╬п╩я┐я┤п╣п╫п╦п╣ п╦п╥ п╨п╬п╪п©п╦п╩я▐я┌п╬я─п╟ пЁп╬я┌п╬п╡п╬пЁп╬ п╨п╬п╢п╟. */ void lccrt_irr_compiler_eval_exec_counts( lccrt_irr_jr_ptr jr, lccrt_irr_node_ptr node) @@ -47,7 +47,7 @@ lccrt_irr_compiler_eval_exec_counts( lccrt_irr_jr_ptr jr, lccrt_irr_node_ptr nod jr->counts_chain.max_node = node; } - /* Если есть готовый (скомпилированный) узел, то линкуем его. */ + /* п∙я│п╩п╦ п╣я│я┌я▄ пЁп╬я┌п╬п╡я▀п╧ (я│п╨п╬п╪п©п╦п╩п╦я─п╬п╡п╟п╫п╫я▀п╧) я┐п╥п╣п╩, я┌п╬ п╩п╦п╫п╨я┐п╣п╪ п╣пЁп╬. */ if ( jr->comp.is_ready ) { lccrt_irr_node_ptr comp_node = jr->comp.node; @@ -57,16 +57,16 @@ lccrt_irr_compiler_eval_exec_counts( lccrt_irr_jr_ptr jr, lccrt_irr_node_ptr nod { if ( comp_node->is_delete ) { - /* В процессе компиляции было запланировано удаление узла. */ + /* п▓ п©я─п╬я├п╣я│я│п╣ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╠я▀п╩п╬ п╥п╟п©п╩п╟п╫п╦я─п╬п╡п╟п╫п╬ я┐п╢п╟п╩п╣п╫п╦п╣ я┐п╥п╩п╟. */ lccrt_irr_node_delete( comp_node); } else { lccrt_irr_reloc_unit_ptr ru; lccrt_irr_reloc_unit_ptr ru_next = 0; - /* Пока берем "простое" решение - обнуляем старые линковки, чтобы - при последующей линковке были установлены ссылки на новую - реализацию узла. */ + /* п÷п╬п╨п╟ п╠п╣я─п╣п╪ "п©я─п╬я│я┌п╬п╣" я─п╣я┬п╣п╫п╦п╣ - п╬п╠п╫я┐п╩я▐п╣п╪ я│я┌п╟я─я▀п╣ п╩п╦п╫п╨п╬п╡п╨п╦, я┤я┌п╬п╠я▀ + п©я─п╦ п©п╬я│п╩п╣п╢я┐я▌я┴п╣п╧ п╩п╦п╫п╨п╬п╡п╨п╣ п╠я▀п╩п╦ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫я▀ я│я│я▀п╩п╨п╦ п╫п╟ п╫п╬п╡я┐я▌ + я─п╣п╟п╩п╦п╥п╟я├п╦я▌ я┐п╥п╩п╟. */ for ( ru = node->relocs; ru; ru = ru_next ) { ru_next = ru->next; @@ -79,7 +79,7 @@ lccrt_irr_compiler_eval_exec_counts( lccrt_irr_jr_ptr jr, lccrt_irr_node_ptr nod } } - /* Если компилятор готов, то отдаем ему новый узел. */ + /* п∙я│п╩п╦ п╨п╬п╪п©п╦п╩я▐я┌п╬я─ пЁп╬я┌п╬п╡, я┌п╬ п╬я┌п╢п╟п╣п╪ п╣п╪я┐ п╫п╬п╡я▀п╧ я┐п╥п╣п╩. */ if ( jr->comp.is_ready ) { lccrt_irr_node_ptr comp_node; @@ -108,7 +108,7 @@ lccrt_irr_compiler_eval_exec_counts( lccrt_irr_jr_ptr jr, lccrt_irr_node_ptr nod } /* lccrt_irr_compiler_eval_exec_counts */ /** - * Создать группу компиляции. + * п║п╬п╥п╢п╟я┌я▄ пЁя─я┐п©п©я┐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ static void lccrt_irr_compiler_make_code( lccrt_irr_jr_ptr jr) @@ -122,7 +122,7 @@ lccrt_irr_compiler_make_code( lccrt_irr_jr_ptr jr) node = jr->comp.node; jr->comp.code = lccrt_irr_code_new( jr, node); - /* Ищем цепочку линейных участков. */ + /* п≤я┴п╣п╪ я├п╣п©п╬я┤п╨я┐ п╩п╦п╫п╣п╧п╫я▀я┘ я┐я┤п╟я│я┌п╨п╬п╡. */ for ( i = 0, cur_node = node; (i < 7) && cur_node; cur_node = next_node ) { next_node = 0; @@ -166,7 +166,7 @@ lccrt_irr_compiler_make_code( lccrt_irr_jr_ptr jr) } /* lccrt_irr_compiler_make_code */ /** - * Положить в буфер reloc-аргумент. + * п÷п╬п╩п╬п╤п╦я┌я▄ п╡ п╠я┐я└п╣я─ reloc-п╟я─пЁя┐п╪п╣п╫я┌. */ static void lccrt_irr_compiler_push_arg_reloc( lccrt_irr_jr_ptr jr, lccrt_irr_arg_ptr arg, lccrt_irr_code_ptr code) @@ -203,7 +203,7 @@ lccrt_irr_compiler_push_arg_reloc( lccrt_irr_jr_ptr jr, lccrt_irr_arg_ptr arg, l } /* lccrt_irr_compiler_push_arg_reloc */ /** - * Положить в буфер стандартный аргумент. + * п÷п╬п╩п╬п╤п╦я┌я▄ п╡ п╠я┐я└п╣я─ я│я┌п╟п╫п╢п╟я─я┌п╫я▀п╧ п╟я─пЁя┐п╪п╣п╫я┌. */ static void lccrt_irr_compiler_push_arg( lccrt_irr_jr_ptr jr, lccrt_irr_arg_ptr arg) @@ -242,7 +242,7 @@ lccrt_irr_compiler_push_arg( lccrt_irr_jr_ptr jr, lccrt_irr_arg_ptr arg) } /* lccrt_irr_compiler_push_arg */ /** - * Положить в буфер стандартную операцию. + * п÷п╬п╩п╬п╤п╦я┌я▄ п╡ п╠я┐я└п╣я─ я│я┌п╟п╫п╢п╟я─я┌п╫я┐я▌ п╬п©п╣я─п╟я├п╦я▌. */ static void lccrt_irr_compiler_push_oper( lccrt_irr_jr_ptr jr, lccrt_bb_oper_name_t name, lccrt_irr_oper_ptr oper) @@ -265,7 +265,7 @@ lccrt_irr_compiler_push_oper( lccrt_irr_jr_ptr jr, lccrt_bb_oper_name_t name, lc } /* lccrt_irr_compiler_push_oper */ /** - * Передать группу компиляции во внешний модуль компиляции. + * п÷п╣я─п╣п╢п╟я┌я▄ пЁя─я┐п©п©я┐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╡п╬ п╡п╫п╣я┬п╫п╦п╧ п╪п╬п╢я┐п╩я▄ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ static void lccrt_irr_compiler_make_backend_bytecode( lccrt_irr_jr_ptr jr) @@ -346,7 +346,7 @@ lccrt_irr_compiler_wait_compilation( lccrt_irr_jr_ptr jr) } /* lccrt_irr_compiler_wait_compilation */ /** - * Поток компиляции линейного участка. + * п÷п╬я┌п╬п╨ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╩п╦п╫п╣п╧п╫п╬пЁп╬ я┐я┤п╟я│я┌п╨п╟. */ void * lccrt_irr_jit_region_compile_node( void *vjr) @@ -365,7 +365,7 @@ lccrt_irr_jit_region_compile_node( void *vjr) pthread_mutex_unlock( &jr->comp.b_sync); lccrt_irr_compiler_wait_compilation( jr); - // Компилируем узел jr->comp.node + // п п╬п╪п©п╦п╩п╦я─я┐п╣п╪ я┐п╥п╣п╩ jr->comp.node // ...; // jr->comp.is_ready = 1; } @@ -1451,7 +1451,7 @@ lccrt_irr_node_simplify( lccrt_irr_n_ptr node) } /* lccrt_irr_node_simplify */ /** - * Создание байт-код операнда. + * п║п╬п╥п╢п╟п╫п╦п╣ п╠п╟п╧я┌-п╨п╬п╢ п╬п©п╣я─п╟п╫п╢п╟. */ static uintptr_t lccrt_irr_oper_make_bytecode_arg( lccrt_irr_execute_context_ptr ec, lccrt_irr_oper_ptr oper, int arg_num) @@ -1498,7 +1498,7 @@ lccrt_irr_oper_make_bytecode_arg( lccrt_irr_execute_context_ptr ec, lccrt_irr_op } /* lccrt_irr_oper_make_bytecode_arg */ /** - * Создание байткод-операций для исполнения в интерпретаторе. + * п║п╬п╥п╢п╟п╫п╦п╣ п╠п╟п╧я┌п╨п╬п╢-п╬п©п╣я─п╟я├п╦п╧ п╢п╩я▐ п╦я│п©п╬п╩п╫п╣п╫п╦я▐ п╡ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╣. */ static void lccrt_irr_node_make_bytecodes( lccrt_irr_node_ptr node, lccrt_irr_execute_context_ptr ec) diff --git a/lib/irr/lccrt_jit.h b/lib/irr/lccrt_jit.h index d094697..ff55ba7 100644 --- a/lib/irr/lccrt_jit.h +++ b/lib/irr/lccrt_jit.h @@ -1,5 +1,5 @@ /** - * lccrt.h - пользовательский интерфейс (динамической) компиляции. + * lccrt.h - п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄я│п╨п╦п╧ п╦п╫я┌п╣я─я└п╣п╧я│ (п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧) п╨п╬п╪п©п╦п╩я▐я├п╦п╦. * * Copyright (c) 1992-2021 AO "MCST". All rights reserved. */ @@ -16,17 +16,17 @@ typedef struct lccrt_link_func_r *lccrt_link_func_ptr; typedef struct lccrt_link_symt_func_entry_r *lccrt_link_symt_func_entry_ptr; /** - * Количество полей в структуре lccrt_link_func_t. + * п п╬п╩п╦я┤п╣я│я┌п╡п╬ п©п╬п╩п╣п╧ п╡ я│я┌я─я┐п╨я┌я┐я─п╣ lccrt_link_func_t. */ #define LCCRT_LINK_FUNC_FNUM (12) /** - * Количество полей в структуре lccrt_link_module_t. + * п п╬п╩п╦я┤п╣я│я┌п╡п╬ п©п╬п╩п╣п╧ п╡ я│я┌я─я┐п╨я┌я┐я─п╣ lccrt_link_module_t. */ #define LCCRT_LINK_MODULE_FNUM (9) /** - * Названия для переменных контроля типа. + * п²п╟п╥п╡п╟п╫п╦я▐ п╢п╩я▐ п©п╣я─п╣п╪п╣п╫п╫я▀я┘ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟. */ #define LCCRT_TCHECK_LINK_FUNC __lccrt_link_func_type_check #define LCCRT_TCHECK_LINK_SYMT_FUNC_ENTRY __lccrt_link_symt_func_entry_type_check @@ -38,7 +38,7 @@ typedef struct lccrt_link_symt_func_entry_r *lccrt_link_symt_func_entry_ptr; #define LCCRT_TCHECK_LINK_MODULE_S LCCRT_TO_STR( __lccrt_link_module_type_check) /** - * Переменные контроля типа. + * п÷п╣я─п╣п╪п╣п╫п╫я▀п╣ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟. */ typedef uint64_t lccrt_link_check_type_t; extern lccrt_link_check_type_t LCCRT_TCHECK_LINK_FUNC; @@ -47,103 +47,103 @@ extern lccrt_link_check_type_t LCCRT_TCHECK_LINK_SYMT_ENTRY; extern lccrt_link_check_type_t LCCRT_TCHECK_LINK_MODULE; /** - * Данные для линковки функции, которые добавляются в компилируемый модуль. + * п■п╟п╫п╫я▀п╣ п╢п╩я▐ п╩п╦п╫п╨п╬п╡п╨п╦ я└я┐п╫п╨я├п╦п╦, п╨п╬я┌п╬я─я▀п╣ п╢п╬п╠п╟п╡п╩я▐я▌я┌я│я▐ п╡ п╨п╬п╪п©п╦п╩п╦я─я┐п╣п╪я▀п╧ п╪п╬п╢я┐п╩я▄. */ typedef struct lccrt_link_func_r { - lccrt_link_module_ptr lm; /* информация о модуле, из которого была - выбрана функция в процессе линковки */ - const char *name; /* имя функции внутри собственного (!) модуля */ - lccrt_function_ptr f; /* ссылка на соответствующую lccrt-функцию (функция создается в runtime'е) */ - void **switch_addr; /* адрес переменной, в которой хранится адрес текущей версии - функции */ - void *externf_addr; /* интерфейсная функция с именем исходной функции */ - void *profgen_addr; /* версия функции с генерацией профиля */ - void *baseopt_addr; /* версия функции с оптимизацией, полученная в статике */ - uintptr_t *profgen_sum_addr; /* адрес переменной с профилем, собранным функцией генерации профиля */ - pthread_mutex_t *profgen_sync_addr; /* адрес мьютекса для синхронизации доступа к профилю */ - uintptr_t init_flag; /* флаг проведенной инициализации */ - uintptr_t init_sync; /* поле для инициализации мьютекса */ - lccrt_link_check_type_t *type_check; /* адрес __lccrt_link_func_type_check - для контроля типа */ + lccrt_link_module_ptr lm; /* п╦п╫я└п╬я─п╪п╟я├п╦я▐ п╬ п╪п╬п╢я┐п╩п╣, п╦п╥ п╨п╬я┌п╬я─п╬пЁп╬ п╠я▀п╩п╟ + п╡я▀п╠я─п╟п╫п╟ я└я┐п╫п╨я├п╦я▐ п╡ п©я─п╬я├п╣я│я│п╣ п╩п╦п╫п╨п╬п╡п╨п╦ */ + const char *name; /* п╦п╪я▐ я└я┐п╫п╨я├п╦п╦ п╡п╫я┐я┌я─п╦ я│п╬п╠я│я┌п╡п╣п╫п╫п╬пЁп╬ (!) п╪п╬п╢я┐п╩я▐ */ + lccrt_function_ptr f; /* я│я│я▀п╩п╨п╟ п╫п╟ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴я┐я▌ lccrt-я└я┐п╫п╨я├п╦я▌ (я└я┐п╫п╨я├п╦я▐ я│п╬п╥п╢п╟п╣я┌я│я▐ п╡ runtime'п╣) */ + void **switch_addr; /* п╟п╢я─п╣я│ п©п╣я─п╣п╪п╣п╫п╫п╬п╧, п╡ п╨п╬я┌п╬я─п╬п╧ я┘я─п╟п╫п╦я┌я│я▐ п╟п╢я─п╣я│ я┌п╣п╨я┐я┴п╣п╧ п╡п╣я─я│п╦п╦ + я└я┐п╫п╨я├п╦п╦ */ + void *externf_addr; /* п╦п╫я┌п╣я─я└п╣п╧я│п╫п╟я▐ я└я┐п╫п╨я├п╦я▐ я│ п╦п╪п╣п╫п╣п╪ п╦я│я┘п╬п╢п╫п╬п╧ я└я┐п╫п╨я├п╦п╦ */ + void *profgen_addr; /* п╡п╣я─я│п╦я▐ я└я┐п╫п╨я├п╦п╦ я│ пЁп╣п╫п╣я─п╟я├п╦п╣п╧ п©я─п╬я└п╦п╩я▐ */ + void *baseopt_addr; /* п╡п╣я─я│п╦я▐ я└я┐п╫п╨я├п╦п╦ я│ п╬п©я┌п╦п╪п╦п╥п╟я├п╦п╣п╧, п©п╬п╩я┐я┤п╣п╫п╫п╟я▐ п╡ я│я┌п╟я┌п╦п╨п╣ */ + uintptr_t *profgen_sum_addr; /* п╟п╢я─п╣я│ п©п╣я─п╣п╪п╣п╫п╫п╬п╧ я│ п©я─п╬я└п╦п╩п╣п╪, я│п╬п╠я─п╟п╫п╫я▀п╪ я└я┐п╫п╨я├п╦п╣п╧ пЁп╣п╫п╣я─п╟я├п╦п╦ п©я─п╬я└п╦п╩я▐ */ + pthread_mutex_t *profgen_sync_addr; /* п╟п╢я─п╣я│ п╪я▄я▌я┌п╣п╨я│п╟ п╢п╩я▐ я│п╦п╫я┘я─п╬п╫п╦п╥п╟я├п╦п╦ п╢п╬я│я┌я┐п©п╟ п╨ п©я─п╬я└п╦п╩я▌ */ + uintptr_t init_flag; /* я└п╩п╟пЁ п©я─п╬п╡п╣п╢п╣п╫п╫п╬п╧ п╦п╫п╦я├п╦п╟п╩п╦п╥п╟я├п╦п╦ */ + uintptr_t init_sync; /* п©п╬п╩п╣ п╢п╩я▐ п╦п╫п╦я├п╦п╟п╩п╦п╥п╟я├п╦п╦ п╪я▄я▌я┌п╣п╨я│п╟ */ + lccrt_link_check_type_t *type_check; /* п╟п╢я─п╣я│ __lccrt_link_func_type_check + п╢п╩я▐ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟ */ } lccrt_link_func_t; /** - * Элемент символьной таблицы функций (__lccrt_link_module_symtab_funcs). + * п╜п╩п╣п╪п╣п╫я┌ я│п╦п╪п╡п╬п╩я▄п╫п╬п╧ я┌п╟п╠п╩п╦я├я▀ я└я┐п╫п╨я├п╦п╧ (__lccrt_link_module_symtab_funcs). */ typedef struct lccrt_link_symt_func_entry_r { - char *name; /* имя функции (внутри текущего lccrt-модуля) */ - lccrt_link_func_ptr lf; /* ссылка на данные о линковке функции */ - lccrt_link_check_type_t *type_check; /* адрес __lccrt_link_symt_func_entry_type_check - для контроля типа */ + char *name; /* п╦п╪я▐ я└я┐п╫п╨я├п╦п╦ (п╡п╫я┐я┌я─п╦ я┌п╣п╨я┐я┴п╣пЁп╬ lccrt-п╪п╬п╢я┐п╩я▐) */ + lccrt_link_func_ptr lf; /* я│я│я▀п╩п╨п╟ п╫п╟ п╢п╟п╫п╫я▀п╣ п╬ п╩п╦п╫п╨п╬п╡п╨п╣ я└я┐п╫п╨я├п╦п╦ */ + lccrt_link_check_type_t *type_check; /* п╟п╢я─п╣я│ __lccrt_link_symt_func_entry_type_check + п╢п╩я▐ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟ */ } lccrt_link_symt_func_entry_t; /** - * Элемент символьной таблицы функций (__lccrt_link_module_symtab). + * п╜п╩п╣п╪п╣п╫я┌ я│п╦п╪п╡п╬п╩я▄п╫п╬п╧ я┌п╟п╠п╩п╦я├я▀ я└я┐п╫п╨я├п╦п╧ (__lccrt_link_module_symtab). */ typedef struct lccrt_link_symt_entry_r { - char *name; /* имя функции или переменной (внутри текущего lccrt-модуля) */ - void *addr; /* фактический адрес этапа исполнения */ - lccrt_link_check_type_t *type_check; /* адрес __lccrt_link_symt_entry_type_check - для контроля типа */ + char *name; /* п╦п╪я▐ я└я┐п╫п╨я├п╦п╦ п╦п╩п╦ п©п╣я─п╣п╪п╣п╫п╫п╬п╧ (п╡п╫я┐я┌я─п╦ я┌п╣п╨я┐я┴п╣пЁп╬ lccrt-п╪п╬п╢я┐п╩я▐) */ + void *addr; /* я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╧ п╟п╢я─п╣я│ я█я┌п╟п©п╟ п╦я│п©п╬п╩п╫п╣п╫п╦я▐ */ + lccrt_link_check_type_t *type_check; /* п╟п╢я─п╣я│ __lccrt_link_symt_entry_type_check + п╢п╩я▐ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟ */ } lccrt_link_symt_entry_t; /** - * Данные lccrt-модуля, которые добавляются в компилируемый модуль. + * п■п╟п╫п╫я▀п╣ lccrt-п╪п╬п╢я┐п╩я▐, п╨п╬я┌п╬я─я▀п╣ п╢п╬п╠п╟п╡п╩я▐я▌я┌я│я▐ п╡ п╨п╬п╪п©п╦п╩п╦я─я┐п╣п╪я▀п╧ п╪п╬п╢я┐п╩я▄. */ typedef struct lccrt_link_module_r { - char *name; /* имя модуля */ - lccrt_module_ptr m; /* ссылка на соответствующий lccrt-модуль (модуль создается в runtime'е) */ - uintptr_t ir_text_size; /* байтовый размер ir в текстовой форме */ - char *ir_text; /* ir в текстовой форме */ - uintptr_t symt_funcs_len; /* количество символов в символьной таблице функций */ - void *symt_funcs; /* символьная таблица функций */ - uintptr_t symt_len; /* количество символов в символьной таблице */ - void *symt; /* символьная таблица */ - lccrt_link_check_type_t *type_check; /* адрес __lccrt_link_module_type_check - для контроля типа */ + char *name; /* п╦п╪я▐ п╪п╬п╢я┐п╩я▐ */ + lccrt_module_ptr m; /* я│я│я▀п╩п╨п╟ п╫п╟ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╦п╧ lccrt-п╪п╬п╢я┐п╩я▄ (п╪п╬п╢я┐п╩я▄ я│п╬п╥п╢п╟п╣я┌я│я▐ п╡ runtime'п╣) */ + uintptr_t ir_text_size; /* п╠п╟п╧я┌п╬п╡я▀п╧ я─п╟п╥п╪п╣я─ ir п╡ я┌п╣п╨я│я┌п╬п╡п╬п╧ я└п╬я─п╪п╣ */ + char *ir_text; /* ir п╡ я┌п╣п╨я│я┌п╬п╡п╬п╧ я└п╬я─п╪п╣ */ + uintptr_t symt_funcs_len; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ я│п╦п╪п╡п╬п╩п╬п╡ п╡ я│п╦п╪п╡п╬п╩я▄п╫п╬п╧ я┌п╟п╠п╩п╦я├п╣ я└я┐п╫п╨я├п╦п╧ */ + void *symt_funcs; /* я│п╦п╪п╡п╬п╩я▄п╫п╟я▐ я┌п╟п╠п╩п╦я├п╟ я└я┐п╫п╨я├п╦п╧ */ + uintptr_t symt_len; /* п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ я│п╦п╪п╡п╬п╩п╬п╡ п╡ я│п╦п╪п╡п╬п╩я▄п╫п╬п╧ я┌п╟п╠п╩п╦я├п╣ */ + void *symt; /* я│п╦п╪п╡п╬п╩я▄п╫п╟я▐ я┌п╟п╠п╩п╦я├п╟ */ + lccrt_link_check_type_t *type_check; /* п╟п╢я─п╣я│ __lccrt_link_module_type_check + п╢п╩я▐ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟ */ } lccrt_link_module_t; /** - * Данные связанные с функцией и используемые для динамической компиляции. + * п■п╟п╫п╫я▀п╣ я│п╡я▐п╥п╟п╫п╫я▀п╣ я│ я└я┐п╫п╨я├п╦п╣п╧ п╦ п╦я│п©п╬п╩я▄п╥я┐п╣п╪я▀п╣ п╢п╩я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct lccrt_function_jit_info_r { lccrt_context_ptr ctx; - void *code; /* ссылка на исполняемый код (после компиляции метода) */ - uint64_t code_len; /* байтовый размер кода */ - lccrt_function_ptr src_func; /* целевая функция */ - lccrt_var_ptr jit_entry; /* ссылка на lccrt_link_symt_func_entry_t целевой функции */ - //lccrt_var_ptr profgen_sum; /* суммарный профиль, насчитанный на функции сбора профиля */ - lccrt_var_ptr profgen_tls; /* tls-профиль, насчитанный на функции сбора профиля */ - //lccrt_var_ptr profgen_sync; /* мьютекс для синхронизации доступа к суммарному профилю */ + void *code; /* я│я│я▀п╩п╨п╟ п╫п╟ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ п╨п╬п╢ (п©п╬я│п╩п╣ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╪п╣я┌п╬п╢п╟) */ + uint64_t code_len; /* п╠п╟п╧я┌п╬п╡я▀п╧ я─п╟п╥п╪п╣я─ п╨п╬п╢п╟ */ + lccrt_function_ptr src_func; /* я├п╣п╩п╣п╡п╟я▐ я└я┐п╫п╨я├п╦я▐ */ + lccrt_var_ptr jit_entry; /* я│я│я▀п╩п╨п╟ п╫п╟ lccrt_link_symt_func_entry_t я├п╣п╩п╣п╡п╬п╧ я└я┐п╫п╨я├п╦п╦ */ + //lccrt_var_ptr profgen_sum; /* я│я┐п╪п╪п╟я─п╫я▀п╧ п©я─п╬я└п╦п╩я▄, п╫п╟я│я┤п╦я┌п╟п╫п╫я▀п╧ п╫п╟ я└я┐п╫п╨я├п╦п╦ я│п╠п╬я─п╟ п©я─п╬я└п╦п╩я▐ */ + lccrt_var_ptr profgen_tls; /* tls-п©я─п╬я└п╦п╩я▄, п╫п╟я│я┤п╦я┌п╟п╫п╫я▀п╧ п╫п╟ я└я┐п╫п╨я├п╦п╦ я│п╠п╬я─п╟ п©я─п╬я└п╦п╩я▐ */ + //lccrt_var_ptr profgen_sync; /* п╪я▄я▌я┌п╣п╨я│ п╢п╩я▐ я│п╦п╫я┘я─п╬п╫п╦п╥п╟я├п╦п╦ п╢п╬я│я┌я┐п©п╟ п╨ я│я┐п╪п╪п╟я─п╫п╬п╪я┐ п©я─п╬я└п╦п╩я▌ */ lccrt_check_type_t type_check; } lccrt_function_jit_info_t; /** - * Данные системы динамической компиляции. + * п■п╟п╫п╫я▀п╣ я│п╦я│я┌п╣п╪я▀ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╨п╬п╪п©п╦п╩я▐я├п╦п╦. */ typedef struct lccrt_jit_r { - uintptr_t init_flag; /* флаг проведенной инициализации */ - uintptr_t init_sync; /* поле для инициализации мьютекса */ - int is_start; /* флаг запуска основной службы */ - int is_work; /* флаг продолжения работы */ - pthread_mutex_t sync; /* мьютекс для синхронного доступа */ - pthread_mutex_t comp_sync; /* мьютекс для синхронного доступа */ - pthread_mutex_t exit_sync; /* мьютекс для синхронного доступа */ - pthread_t work; /* основная служба */ - pthread_t comp; /* служба компиляции */ - lccrt_link_func_ptr comp_link_func; /* информация о функции */ - int is_comp; /* флаг проведения компиляции */ - int line_prof[2]; /* линия связи для сообщений о сборе профиля */ - int line_comp[2]; /* линия связи для сообщений о компиляции */ - lccrt_context_ptr ctx; /* контекст (для создания данных) */ - GHashTable *link_funcs; /* соответствие (фактическийАдрес -> link_func) */ - lccrt_check_type_t type_check; /* адрес переменной для контроля типа */ + uintptr_t init_flag; /* я└п╩п╟пЁ п©я─п╬п╡п╣п╢п╣п╫п╫п╬п╧ п╦п╫п╦я├п╦п╟п╩п╦п╥п╟я├п╦п╦ */ + uintptr_t init_sync; /* п©п╬п╩п╣ п╢п╩я▐ п╦п╫п╦я├п╦п╟п╩п╦п╥п╟я├п╦п╦ п╪я▄я▌я┌п╣п╨я│п╟ */ + int is_start; /* я└п╩п╟пЁ п╥п╟п©я┐я│п╨п╟ п╬я│п╫п╬п╡п╫п╬п╧ я│п╩я┐п╤п╠я▀ */ + int is_work; /* я└п╩п╟пЁ п©я─п╬п╢п╬п╩п╤п╣п╫п╦я▐ я─п╟п╠п╬я┌я▀ */ + pthread_mutex_t sync; /* п╪я▄я▌я┌п╣п╨я│ п╢п╩я▐ я│п╦п╫я┘я─п╬п╫п╫п╬пЁп╬ п╢п╬я│я┌я┐п©п╟ */ + pthread_mutex_t comp_sync; /* п╪я▄я▌я┌п╣п╨я│ п╢п╩я▐ я│п╦п╫я┘я─п╬п╫п╫п╬пЁп╬ п╢п╬я│я┌я┐п©п╟ */ + pthread_mutex_t exit_sync; /* п╪я▄я▌я┌п╣п╨я│ п╢п╩я▐ я│п╦п╫я┘я─п╬п╫п╫п╬пЁп╬ п╢п╬я│я┌я┐п©п╟ */ + pthread_t work; /* п╬я│п╫п╬п╡п╫п╟я▐ я│п╩я┐п╤п╠п╟ */ + pthread_t comp; /* я│п╩я┐п╤п╠п╟ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + lccrt_link_func_ptr comp_link_func; /* п╦п╫я└п╬я─п╪п╟я├п╦я▐ п╬ я└я┐п╫п╨я├п╦п╦ */ + int is_comp; /* я└п╩п╟пЁ п©я─п╬п╡п╣п╢п╣п╫п╦я▐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + int line_prof[2]; /* п╩п╦п╫п╦я▐ я│п╡я▐п╥п╦ п╢п╩я▐ я│п╬п╬п╠я┴п╣п╫п╦п╧ п╬ я│п╠п╬я─п╣ п©я─п╬я└п╦п╩я▐ */ + int line_comp[2]; /* п╩п╦п╫п╦я▐ я│п╡я▐п╥п╦ п╢п╩я▐ я│п╬п╬п╠я┴п╣п╫п╦п╧ п╬ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ */ + lccrt_context_ptr ctx; /* п╨п╬п╫я┌п╣п╨я│я┌ (п╢п╩я▐ я│п╬п╥п╢п╟п╫п╦я▐ п╢п╟п╫п╫я▀я┘) */ + GHashTable *link_funcs; /* я│п╬п╬я┌п╡п╣я┌я│я┌п╡п╦п╣ (я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╧п░п╢я─п╣я│ -> link_func) */ + lccrt_check_type_t type_check; /* п╟п╢я─п╣я│ п©п╣я─п╣п╪п╣п╫п╫п╬п╧ п╢п╩я▐ п╨п╬п╫я┌я─п╬п╩я▐ я┌п╦п©п╟ */ } lccrt_jit_t; extern lccrt_fji_ptr lccrt_fji_new( lccrt_ctx_ptr ctx, lccrt_f_ptr src, diff --git a/lib/irr/lccrt_jite2k.c b/lib/irr/lccrt_jite2k.c index 19948cc..f5c8fa1 100644 --- a/lib/irr/lccrt_jite2k.c +++ b/lib/irr/lccrt_jite2k.c @@ -1191,7 +1191,7 @@ lccrt_irr_node_execute_e2k_testcode_func( lccrt_irr_node_execute_e2k_oper_t *e2k } /* lccrt_irr_node_execute_e2k_testcode_func */ /** - * На текущем линейном участке накоплено NCNT_BOUND срабатываний. + * п²п╟ я┌п╣п╨я┐я┴п╣п╪ п╩п╦п╫п╣п╧п╫п╬п╪ я┐я┤п╟я│я┌п╨п╣ п╫п╟п╨п╬п©п╩п╣п╫п╬ NCNT_BOUND я│я─п╟п╠п╟я┌я▀п╡п╟п╫п╦п╧. */ void lccrt_irr_node_execute_e2k_eval_node_counter_func( lccrt_irr_node_execute_e2k_oper_t *oper) @@ -1223,7 +1223,7 @@ lccrt_irr_node_execute_e2k_eval_node_counter_func( lccrt_irr_node_execute_e2k_op jr->counts_chain.max_node = node; } - /* Если есть готовый (скомпилированный) узел, то линкуем его. */ + /* п∙я│п╩п╦ п╣я│я┌я▄ пЁп╬я┌п╬п╡я▀п╧ (я│п╨п╬п╪п©п╦п╩п╦я─п╬п╡п╟п╫п╫я▀п╧) я┐п╥п╣п╩, я┌п╬ п╩п╦п╫п╨я┐п╣п╪ п╣пЁп╬. */ if ( jr->comp.is_ready ) { lccrt_irr_node_ptr comp_node = jr->comp.node; @@ -1233,16 +1233,16 @@ lccrt_irr_node_execute_e2k_eval_node_counter_func( lccrt_irr_node_execute_e2k_op { if ( comp_node->is_delete ) { - /* В процессе компиляции было запланировано удаление узла. */ + /* п▓ п©я─п╬я├п╣я│я│п╣ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╠я▀п╩п╬ п╥п╟п©п╩п╟п╫п╦я─п╬п╡п╟п╫п╬ я┐п╢п╟п╩п╣п╫п╦п╣ я┐п╥п╩п╟. */ lccrt_irr_node_delete( comp_node); } else { lccrt_irr_reloc_unit_ptr ru; lccrt_irr_reloc_unit_ptr ru_next = 0; - /* Пока берем "простое" решение - обнуляем старые линковки, чтобы - при последующей линковке были установлены ссылки на новую - реализацию узла. */ + /* п÷п╬п╨п╟ п╠п╣я─п╣п╪ "п©я─п╬я│я┌п╬п╣" я─п╣я┬п╣п╫п╦п╣ - п╬п╠п╫я┐п╩я▐п╣п╪ я│я┌п╟я─я▀п╣ п╩п╦п╫п╨п╬п╡п╨п╦, я┤я┌п╬п╠я▀ + п©я─п╦ п©п╬я│п╩п╣п╢я┐я▌я┴п╣п╧ п╩п╦п╫п╨п╬п╡п╨п╣ п╠я▀п╩п╦ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫я▀ я│я│я▀п╩п╨п╦ п╫п╟ п╫п╬п╡я┐я▌ + я─п╣п╟п╩п╦п╥п╟я├п╦я▌ я┐п╥п╩п╟. */ for ( ru = node->relocs; ru; ru = ru_next ) { ru_next = ru->next; @@ -1255,7 +1255,7 @@ lccrt_irr_node_execute_e2k_eval_node_counter_func( lccrt_irr_node_execute_e2k_op } } - /* Если компилятор готов, то отдаем ему новый узел. */ + /* п∙я│п╩п╦ п╨п╬п╪п©п╦п╩я▐я┌п╬я─ пЁп╬я┌п╬п╡, я┌п╬ п╬я┌п╢п╟п╣п╪ п╣п╪я┐ п╫п╬п╡я▀п╧ я┐п╥п╣п╩. */ if ( jr->comp.is_ready ) { if ( (jr->counts_chain.max_node_prev->exec_count > jr->counts_chain.max_node->exec_count) ) diff --git a/lib/irr/lccrt_utils.c b/lib/irr/lccrt_utils.c index ab0b5c1..8907701 100644 --- a/lib/irr/lccrt_utils.c +++ b/lib/irr/lccrt_utils.c @@ -40,7 +40,7 @@ lccrt_irr_edge_new( lccrt_irr_jr_ptr jr, void *src, void *dst, lccrt_irr_edge_pt } /* lccrt_irr_edge_new */ /** - * Удаление дуги. + * пёп╢п╟п╩п╣п╫п╦п╣ п╢я┐пЁп╦. */ void lccrt_irr_edge_delete( lccrt_irr_jr_ptr jr, lccrt_irr_edge_ptr edge, lccrt_irr_edge_ptr *src_list, lccrt_irr_edge_ptr *dst_list) @@ -87,7 +87,7 @@ lccrt_irr_edge_delete( lccrt_irr_jr_ptr jr, lccrt_irr_edge_ptr edge, lccrt_irr_e } /* lccrt_irr_edge_delete */ /** - * Увеличение максимального размера буферв. + * пёп╡п╣п╩п╦я┤п╣п╫п╦п╣ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫п╬пЁп╬ я─п╟п╥п╪п╣я─п╟ п╠я┐я└п╣я─п╡. */ void lccrt_irr_buf_alloc( lccrt_irr_buffer_ptr b, int64_t length) @@ -124,7 +124,7 @@ lccrt_irr_buf_alloc( lccrt_irr_buffer_ptr b, int64_t length) } /* lccrt_irr_buf_alloc */ /** - * Поместить в буфер очередную порцию данных. + * п÷п╬п╪п╣я│я┌п╦я┌я▄ п╡ п╠я┐я└п╣я─ п╬я┤п╣я─п╣п╢п╫я┐я▌ п©п╬я─я├п╦я▌ п╢п╟п╫п╫я▀я┘. */ int64_t lccrt_irr_buf_push( lccrt_irr_buffer_ptr b, char *data, int64_t length)