Добавление cmake-сборки. Обновление README.md и удаление устаревшей irr-компоненты.

This commit is contained in:
stepanov_pa 2023-01-27 01:26:18 +03:00
parent 8add65e1e8
commit 6fa132aeb4
9 changed files with 57 additions and 749 deletions

26
CMakeLists.txt Normal file
View File

@ -0,0 +1,26 @@
cmake_minimum_required( VERSION 3.16)
project( lccrt)
set( lccrt_SOURCE
lib/common/lccrt_ctx.c
lib/common/lccrt_fs.c
lib/common/lccrt_hash.c
lib/irv/lccrt_asmout.c
lib/irv/lccrt_func.c
lib/irv/lccrt_irreader.c
lib/irv/lccrt_irwriter.c
lib/irv/lccrt_link.c
lib/irv/lccrt_metadata.c
lib/irv/lccrt_module.c
lib/irv/lccrt_oper.c
lib/irv/lccrt_type.c
lib/irv/lccrt_var.c
)
add_library( lccrt SHARED ${lccrt_SOURCE})
target_include_directories( lccrt PRIVATE include include/internal)
install( TARGETS lccrt
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)

View File

@ -0,0 +1,20 @@
# Проект lccrt.
Основная задача проекта - предоставить компактную библиотеку для создания/хранения модуля в терминах IR и делегации процесса компиляции внешнему бэкенду.
## Промежуточное представление lccrt-IR.
Промежуточное представление lccrt-IR ориентировано на модули полученные из Си-подобного языка. Изначально представление спроектировано как представление выполняющее транзитную функцию между представлением llvm-IR и EIR (компилятора lcc для e2k). Наличие дополнительного слоя в виде lccrt-IR позволяет сделать патч в llvm-project для e2k-платформы opensource-проектом. Внешние бэкенды подключаются как динамические плагины при инициализации библиотеки liblccrt.
Причем проект lccrt реализует самодостаточную библиотеку, формально не зависящую на уровне исходных кодов от других проектов. С этой точки зрения проект lccrt теоретически может рассматриваться как инструмент для преобразования и компиляции llvm-IR в другие IR'ы (предполагается вариант с libgccjit в качестве бэкенда), либо может выступать в качестве внешнего API (закрытого) оптимизирующего бэкенда для e2k-платформы в составе opensource-фронтендов отличных от llvm (если таковые возникнут на практике).
В качестве тестового бэкенда может выступать lcbe-бэкенд (lib/lcbe), который преобразует lccrt-IR в компилируемый и исполняемый Си-код (разработка lcbe не завершена). В таком случае Си-код используется в качестве аналога target-ассемблера.
## Сборка.
* ``mkdir lccrt/build && cd lccrt/build``
* ``cmake ../ && make && make install``
## Использование.
* В трансляторе llvm-IR -> EIR (llvm-часть транслятора: https://gitflic.ru/project/e2khome/llvm-project-e-2-k)

View File

@ -39,12 +39,6 @@ extern "C" {
#define LCCRT_ASM_SFUNC_COMPILE LCCRT_TO_STR( LCCRT_ASM_FUNC_COMPILE)
#define LCCRT_ASM_SFUNC_GETTOOL LCCRT_TO_STR( LCCRT_ASM_FUNC_GETTOOL)
#define LCCRT_IRROBJ_SFUNC_NODE_COMPILE LCCRT_TO_STR( LCCRT_IRROBJ_FUNC_NODE_COMPILE)
#define LCCRT_IRROBJ_SFUNC_NODE_DECOMPILE LCCRT_TO_STR( LCCRT_IRROBJ_FUNC_NODE_DECOMPILE)
#define LCCRT_IRROBJ_SFUNC_RELOC_PATCH LCCRT_TO_STR( LCCRT_IRROBJ_FUNC_RELOC_PATCH)
#define LCCRT_IRROBJ_SFUNC_CODE_EXEC LCCRT_TO_STR( LCCRT_IRROBJ_FUNC_CODE_EXEC)
#define LCCRT_IRROBJ_SFUNC_GETCONF LCCRT_TO_STR( LCCRT_IRROBJ_FUNC_GETCONF)
#define LCCRT_PLUGIN_LIBRARY_NAME_S LCCRT_TO_STR( LCCRT_PLUGIN_LIBRARY_NAME)
#define LCCRT_PLUGIN_LCCRT_VERSION_S LCCRT_TO_STR( LCCRT_PLUGIN_LCCRT_VERSION)
#define LCCRT_PLUGIN_TARGETS_S LCCRT_TO_STR( LCCRT_PLUGIN_TARGETS)
@ -135,7 +129,6 @@ typedef struct
typedef enum
{
LCCRT_PLUGIN_TYPE_ASM,
LCCRT_PLUGIN_TYPE_IRROBJ,
LCCRT_PLUGIN_TYPE_LAST
} lccrt_plugin_type_t;
@ -149,19 +142,6 @@ typedef enum
LCCRT_PLUGIN_ASM_FUNC_LAST
} lccrt_plugin_asm_func_name_t;
/**
* Типы функций в трансляторе из IR-R в объектный код.
*/
typedef enum
{
LCCRT_PLUGIN_IRROBJ_FUNC_NODE_COMPILE,
LCCRT_PLUGIN_IRROBJ_FUNC_NODE_DECOMPILE,
LCCRT_PLUGIN_IRROBJ_FUNC_RELOC_PATCH,
LCCRT_PLUGIN_IRROBJ_FUNC_CODE_EXEC,
LCCRT_PLUGIN_IRROBJ_FUNC_GETCONF,
LCCRT_PLUGIN_IRROBJ_FUNC_LAST
} lccrt_plugin_irrobj_func_name_t;
/**
* Структура внешнего плагина.
*/
@ -262,18 +242,6 @@ lccrt_check_type_declare( lccrt_context_t);
lccrt_check_type_declare( lccrt_plugin_t);
lccrt_check_type_declare( lccrt_fs_t);
lccrt_check_type_declare( lccrt_jit_t);
lccrt_check_type_declare( lccrt_irr_code_area_t);
lccrt_check_type_declare( lccrt_irr_jit_region_t);
lccrt_check_type_declare( lccrt_irr_code_t);
lccrt_check_type_declare( lccrt_irr_execute_context_t);
lccrt_check_type_declare( lccrt_irr_reloc_unit_t);
lccrt_check_type_declare( lccrt_irr_reloc_t);
lccrt_check_type_declare( lccrt_irr_node_t);
lccrt_check_type_declare( lccrt_irr_oper_iter_t);
lccrt_check_type_declare( lccrt_irr_oper_t);
lccrt_check_type_declare( lccrt_irr_arg_t);
lccrt_check_type_declare( lccrt_irr_reg_t);
lccrt_check_type_declare( lccrt_irr_edge_t);
extern void *lccrt_ctx_malloc_func( lccrt_ctx_ptr ctx, uint64_t size);
extern void *lccrt_ctx_realloc_func( lccrt_ctx_ptr ctx, void *ptr, uint64_t size);

View File

@ -36,20 +36,6 @@ typedef struct { intptr_t id; } lccrt_einfo_category_t;
typedef struct { intptr_t data[2]; } lccrt_einfo_field_id_t;
typedef struct lccrt_fs_r *lccrt_fs_ptr;
typedef struct lccrt_irr_jit_region_r *lccrt_irr_jit_region_ptr;
typedef struct lccrt_irr_execute_context_r *lccrt_irr_execute_context_ptr;
typedef struct lccrt_irr_code_r *lccrt_irr_code_ptr;
typedef struct lccrt_irr_node_r *lccrt_irr_node_ptr;
typedef struct lccrt_irr_oper_r *lccrt_irr_oper_ptr;
typedef struct lccrt_irr_oper_iter_r *lccrt_irr_oper_iter_ptr;
typedef struct lccrt_irr_arg_r *lccrt_irr_arg_ptr;
typedef struct lccrt_irr_reg_r *lccrt_irr_reg_ptr;
typedef struct lccrt_irr_label_r *lccrt_irr_label_ptr;
typedef struct lccrt_irr_reloc_r *lccrt_irr_reloc_ptr;
typedef struct lccrt_irr_reloc_unit_r *lccrt_irr_reloc_unit_ptr;
typedef lccrt_irr_node_ptr (* lccrt_irr_resolve_virt_addr_func_t)( void *, uint64_t);
typedef uint64_t lccrt_irr_hex_t;
#define LCCRT_PLUGIN_LIBRARY_NAME lccrt_plugin_library_name
#define LCCRT_PLUGIN_LCCRT_VERSION lccrt_plugin_lccrt_version
#define LCCRT_PLUGIN_TARGETS lccrt_plugin_targets
@ -57,12 +43,6 @@ typedef uint64_t lccrt_irr_hex_t;
#define LCCRT_ASM_FUNC_COMPILE lccrt_asm_compile
#define LCCRT_ASM_FUNC_GETTOOL lccrt_asm_gettool
#define LCCRT_IRROBJ_FUNC_NODE_COMPILE lccrt_irrobj_node_compile
#define LCCRT_IRROBJ_FUNC_NODE_DECOMPILE lccrt_irrobj_node_decompile
#define LCCRT_IRROBJ_FUNC_RELOC_PATCH lccrt_irrobj_reloc_patch
#define LCCRT_IRROBJ_FUNC_CODE_EXEC lccrt_irrobj_code_exec
#define LCCRT_IRROBJ_FUNC_GETCONF lccrt_irrobj_getconf
typedef int (*lccrt_asm_write_t)( void *write_info, char *data, uint64_t length);
/**
@ -92,12 +72,6 @@ typedef struct
typedef int (*lccrt_asm_compile_t)( lccrt_module_ptr m, lccrt_asm_compile_config_t *cnf);
typedef const char *(*lccrt_asm_gettool_t)( const char *targ, const char *type, const char *name);
typedef lccrt_irr_code_ptr (*lccrt_irrobj_node_compile_t)( lccrt_irr_node_ptr n);
typedef int (*lccrt_irrobj_node_decompile_t)( lccrt_irr_node_ptr n);
typedef int (*lccrt_irrobj_reloc_patch_t)( lccrt_irr_reloc_ptr reloc, lccrt_irr_code_ptr code);
typedef int (*lccrt_irrobj_code_exec_t)( lccrt_irr_code_ptr code, lccrt_irr_execute_context_ptr ec);
typedef const char *(*lccrt_irrobj_getconf_t)( const char *targ, const char *name);
extern int LCCRT_ASM_FUNC_COMPILE( lccrt_module_ptr m, lccrt_asm_compile_config_t *cnf);
extern const char *LCCRT_ASM_FUNC_GETTOOL( const char *targ, const char *type, const char *name);
@ -498,8 +472,6 @@ extern lccrt_he_ptr lccrt_hash_next( lccrt_he_ptr he);
* - \ref lccrt_context_new
* - \ref lccrt_context_delete
* - \ref lccrt_context_get_plugin_asm
* - \ref lccrt_context_get_plugin_irrobj
* - \ref lccrt_context_find_plugin_irrobj_for_arch
* - \ref lccrt_context_get_toolchain
*
*/
@ -511,9 +483,6 @@ extern const char *lccrt_context_get_toolchain( lccrt_ctx_ptr ctx, const char *a
const char *targ, const char *tool_type,
const char *tool_name);
extern lccrt_plg_ptr lccrt_context_get_plugin_asm( lccrt_ctx_ptr ctx, const char *plg_name);
extern lccrt_plg_ptr lccrt_context_get_plugin_irrobj( lccrt_ctx_ptr ctx, const char *plg_name);
extern lccrt_plg_ptr lccrt_context_find_plugin_irrobj_for_arch( lccrt_ctx_ptr ctx,
const char *arch);
extern lccrt_err_t lccrt_context_get_err_info( lccrt_ctx_ptr ctx);
extern lccrt_err_t lccrt_context_set_err_info( lccrt_ctx_ptr ctx, lccrt_err_t err);
#define lccrt_context_error( ctx, id, fmt, ...) \
@ -993,541 +962,6 @@ extern int lccrt_fs_delete( lccrt_fs_ptr f);
extern char *lccrt_fs_get_buffer( lccrt_fs_ptr f);
extern void lccrt_asm_print_module( lccrt_fs_ptr fs, lccrt_module_ptr m);
typedef lccrt_irr_jit_region_ptr lccrt_irr_jr_ptr;
typedef lccrt_irr_execute_context_ptr lccrt_irr_ec_ptr;
typedef lccrt_irr_code_ptr lccrt_irr_c_ptr;
typedef lccrt_irr_node_ptr lccrt_irr_n_ptr;
typedef lccrt_irr_oper_ptr lccrt_irr_o_ptr;
typedef lccrt_irr_oper_iter_ptr lccrt_irr_oi_ptr;
typedef lccrt_irr_arg_ptr lccrt_irr_a_ptr;
typedef lccrt_irr_reg_ptr lccrt_irr_r_ptr;
typedef lccrt_irr_label_ptr lccrt_irr_l_ptr;
typedef lccrt_irr_reloc_ptr lccrt_irr_rl_ptr;
typedef lccrt_irr_reloc_unit_ptr lccrt_irr_rlu_ptr;
typedef lccrt_irr_resolve_virt_addr_func_t lccrt_irr_rva_func_t;
#define LCCRT_IRR_TYPE_REGS_MAX (256ULL)
#define LCCRT_IRR_ARG_GET_REG_TYPE( a) ((a)->data.hex / LCCRT_IRR_TYPE_REGS_MAX)
#define LCCRT_IRR_ARG_GET_REG_ADDR( a) ((a)->data.hex % LCCRT_IRR_TYPE_REGS_MAX)
#define LCCRT_IRR_ARG_IS_REG( a, rtype, raddr) \
( \
((a)->type == LCCRT_IRR_ARG_TYPE_REG) \
&& (LCCRT_IRR_ARG_GET_REG_TYPE( a) == rtype) \
&& (LCCRT_IRR_ARG_GET_REG_ADDR( a) == raddr) \
)
typedef enum
{
LCCRT_IRR_REG_SYS,
LCCRT_IRR_REG_PHYS,
LCCRT_IRR_REG_VIRT,
LCCRT_IRR_REG_TYPE_LAST
} lccrt_irr_reg_type_t;
typedef enum
{
LCCRT_IRR_OPER_NOP,
LCCRT_IRR_OPER_ASSERT,
LCCRT_IRR_OPER_MOV_U32,
LCCRT_IRR_OPER_MOV_U64,
LCCRT_IRR_OPER_AND_U64,
LCCRT_IRR_OPER_OR_U64,
LCCRT_IRR_OPER_XOR_U64,
LCCRT_IRR_OPER_SHL_U64,
LCCRT_IRR_OPER_SHR_U64,
LCCRT_IRR_OPER_SAR_U64,
//LCCRT_IRR_OPER_SCL_U64,
//LCCRT_IRR_OPER_SCR_U64,
LCCRT_IRR_OPER_ADD_U64,
LCCRT_IRR_OPER_SUB_U64,
LCCRT_IRR_OPER_MUL_U64,
LCCRT_IRR_OPER_SDIV_U64,
LCCRT_IRR_OPER_UDIV_U64,
LCCRT_IRR_OPER_SMOD_U64,
LCCRT_IRR_OPER_UMOD_U64,
LCCRT_IRR_OPER_EXT_S8,
LCCRT_IRR_OPER_EXT_S16,
LCCRT_IRR_OPER_EXT_S32,
/* Взятие битового поля
arg0 (int64) - источник битового поля
arg1 (int64) - битовое смещение поля
arg2 (int64) - битовая длина поля */
LCCRT_IRR_OPER_GETFIELD,
LCCRT_IRR_OPER_CONV_S32_F32,
LCCRT_IRR_OPER_CONV_S32_F64,
LCCRT_IRR_OPER_CONV_S64_F32,
LCCRT_IRR_OPER_CONV_S64_F64,
LCCRT_IRR_OPER_CONV_F32_F64,
LCCRT_IRR_OPER_CONV_F64_F32,
LCCRT_IRR_OPER_FADD_F32,
LCCRT_IRR_OPER_FADD_F64,
LCCRT_IRR_OPER_FSUB_F32,
LCCRT_IRR_OPER_FSUB_F64,
LCCRT_IRR_OPER_FMUL_F32,
LCCRT_IRR_OPER_FMUL_F64,
LCCRT_IRR_OPER_FDIV_F32,
LCCRT_IRR_OPER_FDIV_F64,
LCCRT_IRR_OPER_FSQRT_F64,
LCCRT_IRR_OPER_CMPE_U64,
LCCRT_IRR_OPER_CMPNE_U64,
LCCRT_IRR_OPER_CMPL_U64,
LCCRT_IRR_OPER_CMPLE_U64,
LCCRT_IRR_OPER_CMPB_U64,
LCCRT_IRR_OPER_CMPBE_U64,
/* Сравнение формата float64 на "не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 vs (bitcast float32/float64)arg1)) */
LCCRT_IRR_OPER_FCMP_U_F32,
LCCRT_IRR_OPER_FCMP_U_F64,
/* Сравнение формата float64 на "упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 vs (bitcast float32/float64)arg1)) */
LCCRT_IRR_OPER_FCMP_O_F32,
LCCRT_IRR_OPER_FCMP_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 == (bitcast float64)arg1) || unordered) */
LCCRT_IRR_OPER_FCMPE_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 == (bitcast float32/float64)arg1)) */
LCCRT_IRR_OPER_FCMPE_O_F32,
LCCRT_IRR_OPER_FCMPE_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 < (bitcast float64)arg1) || unordered) */
LCCRT_IRR_OPER_FCMPL_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 < (bitcast float32/float64)arg1)) */
LCCRT_IRR_OPER_FCMPL_O_F32,
LCCRT_IRR_OPER_FCMPL_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 <= (bitcast float64)arg1) || unordered) */
LCCRT_IRR_OPER_FCMPLE_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 <= (bitcast float32/float64)arg1)) */
LCCRT_IRR_OPER_FCMPLE_O_F32,
LCCRT_IRR_OPER_FCMPLE_O_F64,
/* Выбор значения
arg0 (int64) - итоговое значение, если arg2 == true
arg1 (int64) - итоговое значение, если arg2 == false
arg2 (int64) - предикат выбора
res0 (int64) - (arg2 ? arg0 : arg1) */
LCCRT_IRR_OPER_SELECT_U64,
/* Условная перессылка, если предикат true
arg0 (int64) - итоговое значение, если arg1 == true
arg1 (int64) - предикат выбора
res0 (int64) - (if ( arg1 ) res0 = arg1;) */
LCCRT_IRR_OPER_MOVTHEN_U64,
/* Условная перессылка, если предикат false
arg0 (int64) - итоговое значение, если arg1 == false
arg1 (int64) - предикат выбора
res0 (int64) - (if ( !arg1 ) res0 = arg1;) */
LCCRT_IRR_OPER_MOVELSE_U64,
LCCRT_IRR_OPER_LD_U8,
LCCRT_IRR_OPER_LD_U16,
LCCRT_IRR_OPER_LD_U32,
LCCRT_IRR_OPER_LD_U64,
LCCRT_IRR_OPER_LD_S8,
LCCRT_IRR_OPER_LD_S16,
LCCRT_IRR_OPER_LD_S32,
LCCRT_IRR_OPER_ST_U8,
LCCRT_IRR_OPER_ST_U16,
LCCRT_IRR_OPER_ST_U32,
LCCRT_IRR_OPER_ST_U64,
/* Безусловный переход по литералу "ленивой" линковки
arg0 (reloc) - литерал перехода */
LCCRT_IRR_OPER_BRANCH_RELOC,
/* Условный переход по литералам "ленивой" линковки
arg0 (reloc) - литерал перехода, если arg2 == true
arg1 (reloc) - литерал перехода, если arg2 == false
arg2 (int64) - предикат перехода */
LCCRT_IRR_OPER_BRANCHIF_RELOC,
/* Безусловный переход по виртуальному адресу
arg0 (int64) - виртуальный адрес перехода */
LCCRT_IRR_OPER_BRANCH_DYNAMIC,
/* Выполнить вызов функции void (*)( int64, int64)
arg0 (int64) - адрес вызываемой функции
arg1 (int64) - 1-ый аргумент
arg2 (int64) - 2-ой аргумент */
LCCRT_IRR_OPER_CALL_V_U64U64,
/* Завершить исполнение
arg0 (int64) - возвращаемое значение (через контекст исполнения) */
LCCRT_IRR_OPER_EXIT,
/* Адресуемая метка */
LCCRT_IRR_OPER_LABEL,
/* Проверить совпадение байтовых массивов и вызвать исключение (abort),
если массивы не равны
arg0 (int64) - байтовый размер массивов
arg1 (int64) - адрес первого массива
arg2 (int64) - адрес второго массива */
LCCRT_IRR_OPER_TESTCODE,
/* Вызвать функцию обработчик особой ситуации
arg0 (int64) - адрес функции обработчика
arg1 (int64) - первый аргумент
arg2 (int64) - второй аргумент */
LCCRT_IRR_OPER_BREAKPOINT,
LCCRT_IRR_OPER_LAST
} lccrt_irr_oper_name_t;
#define lccrt_irr_oper_name_is_res( n) \
( \
(LCCRT_IRR_OPER_ASSERT < (n)) && ((n) <= LCCRT_IRR_OPER_LD_S32) \
)
#define lccrt_irr_oper_name_is_arith( n) \
( \
(LCCRT_IRR_OPER_NOP <= (n)) && ((n) <= LCCRT_IRR_OPER_MOVELSE_U64) \
)
#define lccrt_irr_oper_name_is_load( n) \
( \
((LCCRT_IRR_OPER_LD_U8 <= (n)) && ((n) <= LCCRT_IRR_OPER_LD_U64)) \
)
#define lccrt_irr_oper_name_is_store( n) \
( \
((LCCRT_IRR_OPER_ST_U8 <= (n)) && ((n) <= LCCRT_IRR_OPER_ST_U64)) \
)
#define lccrt_irr_oper_name_is_branch( n) \
( \
((LCCRT_IRR_OPER_BRANCH_RELOC <= (n)) && ((n) <= LCCRT_IRR_OPER_BRANCH_DYNAMIC)) \
)
#define lccrt_irr_oper_name_is_exit( n) \
( \
((LCCRT_IRR_OPER_EXIT <= (n)) && ((n) <= LCCRT_IRR_OPER_EXIT)) \
)
extern lccrt_irr_jr_ptr lccrt_irr_jit_region_new( lccrt_ctx_ptr ctx, const char *arch, lccrt_plg_ptr plg);
extern lccrt_irr_c_ptr lccrt_irr_code_new( lccrt_irr_jr_ptr jr, lccrt_irr_n_ptr node);
extern lccrt_irr_n_ptr lccrt_irr_node_new( lccrt_irr_jr_ptr jr, int64_t user_ident);
extern lccrt_irr_ec_ptr lccrt_irr_exec_ctx_new( lccrt_irr_jr_ptr jr, int max_regs[LCCRT_IRR_REG_TYPE_LAST],
uint64_t *regs[LCCRT_IRR_REG_TYPE_LAST]);
extern lccrt_irr_r_ptr lccrt_irr_reg_new( lccrt_irr_jr_ptr jr);
extern lccrt_irr_a_ptr lccrt_irr_arg_new( lccrt_irr_jr_ptr jr);
extern lccrt_irr_oi_ptr lccrt_irr_oper_iter_new( lccrt_irr_jr_ptr jr, lccrt_irr_n_ptr node);
extern lccrt_irr_rl_ptr lccrt_irr_reloc_new( lccrt_irr_jr_ptr jr, int64_t virt_addr, lccrt_irr_c_ptr code);
extern void lccrt_irr_reloc_delete( lccrt_irr_rl_ptr rel);
extern void lccrt_irr_exec_ctx_delete( lccrt_irr_ec_ptr ec);
extern void lccrt_irr_node_delete( lccrt_irr_n_ptr node);
extern void lccrt_irr_reg_delete( lccrt_ctx_ptr ctx, lccrt_irr_r_ptr arg);
extern void lccrt_irr_arg_delete( lccrt_ctx_ptr ctx, lccrt_irr_a_ptr arg);
extern void lccrt_irr_oper_iter_delete( lccrt_irr_oi_ptr oi);
extern lccrt_ctx_ptr lccrt_irr_jit_region_get_context( lccrt_irr_jr_ptr jr);
extern lccrt_plg_ptr lccrt_irr_jit_region_get_plugin_irrobj( lccrt_irr_jr_ptr jr);
extern lccrt_irr_n_ptr lccrt_irr_jit_region_get_virt_addr_node( lccrt_irr_jr_ptr jr, uint64_t vaddr);
extern uint64_t lccrt_irr_jit_region_get_virt_addr_data( lccrt_irr_jr_ptr jr, uint64_t vaddr);
extern void lccrt_irr_jit_region_set_virt_addr_node( lccrt_irr_jr_ptr jr, uint64_t vaddr, lccrt_irr_n_ptr node);
extern void lccrt_irr_jit_region_set_virt_addr_data( lccrt_irr_jr_ptr jr, uint64_t vaddr, uint64_t data);
extern lccrt_irr_rva_func_t lccrt_irr_jit_region_get_ra_func( lccrt_irr_jr_ptr jr);
extern void *lccrt_irr_jit_region_get_ra_data( lccrt_irr_jr_ptr jr);
extern void **lccrt_irr_jit_region_get_ra_table0( lccrt_irr_jr_ptr jr);
extern int lccrt_irr_jit_region_get_ra_level( lccrt_irr_jr_ptr jr);
extern int lccrt_irr_jit_region_get_ra_bits( lccrt_irr_jr_ptr jr);
extern int lccrt_irr_jit_region_get_ra_tail_bits( lccrt_irr_jr_ptr jr);
extern void lccrt_irr_jit_region_set_ra_func( lccrt_irr_jr_ptr jr, lccrt_irr_rva_func_t func, void *data);
extern void lccrt_irr_jit_region_set_ra_table( lccrt_irr_jr_ptr jr, void **table0, int level, int bits, int tail_bits);
extern int lccrt_irr_jit_region_is_debug_exit_all( lccrt_irr_jr_ptr jr);
extern void lccrt_irr_jit_region_set_debug_exit_all( lccrt_irr_jr_ptr jr, int value);
extern lccrt_irr_jr_ptr lccrt_irr_exec_ctx_get_jit_region( lccrt_irr_ec_ptr ec);
extern int lccrt_irr_exec_ctx_get_reg_max( lccrt_irr_ec_ptr ec, lccrt_irr_reg_type_t type);
/*extern uint64_t lccrt_irr_exec_ctx_get_reg( lccrt_irr_ec_ptr ec, lccrt_irr_reg_type_t type,
int64_t num);
extern uint64_t lccrt_irr_exec_ctx_set_reg( lccrt_irr_ec_ptr ec, lccrt_irr_reg_type_t type,
int64_t num, uint64_t value);*/
extern uint64_t *lccrt_irr_exec_ctx_get_reg_addr( lccrt_irr_ec_ptr ec, lccrt_irr_reg_type_t type, int64_t num);
extern int64_t lccrt_irr_exec_ctx_get_exit_value( lccrt_irr_ec_ptr ec);
extern void lccrt_irr_exec_ctx_set_exit_value( lccrt_irr_ec_ptr ec, int64_t exit_value);
extern lccrt_irr_r_ptr lccrt_irr_reg_init( lccrt_irr_r_ptr reg, lccrt_irr_reg_type_t type,
int64_t num);
#define lccrt_irr_reg_init_sys( reg, num) lccrt_irr_reg_init( reg, LCCRT_IRR_REG_SYS, num)
#define lccrt_irr_reg_init_phys( reg, num) lccrt_irr_reg_init( reg, LCCRT_IRR_REG_PHYS, num)
#define lccrt_irr_reg_init_virt( reg, num) lccrt_irr_reg_init( reg, LCCRT_IRR_REG_VIRT, num)
extern lccrt_irr_a_ptr lccrt_irr_arg_init_hex( lccrt_irr_a_ptr arg, lccrt_irr_hex_t c);
extern lccrt_irr_a_ptr lccrt_irr_arg_init_reg( lccrt_irr_a_ptr arg, lccrt_irr_r_ptr reg);
extern lccrt_irr_a_ptr lccrt_irr_arg_init_reloc( lccrt_irr_a_ptr arg, lccrt_irr_rl_ptr reloc);
extern int lccrt_irr_arg_is_hex( lccrt_irr_a_ptr arg);
extern int lccrt_irr_arg_is_reloc( lccrt_irr_a_ptr arg);
extern int lccrt_irr_arg_is_reg( lccrt_irr_a_ptr arg);
extern int lccrt_irr_arg_is_reg_type( lccrt_irr_a_ptr arg, lccrt_irr_reg_type_t type);
extern int64_t lccrt_irr_arg_get_hex( lccrt_irr_a_ptr arg);
extern lccrt_irr_rl_ptr lccrt_irr_arg_get_reloc( lccrt_irr_a_ptr arg);
extern int64_t lccrt_irr_arg_get_reg_addr( lccrt_irr_a_ptr arg);
extern lccrt_irr_reg_type_t lccrt_irr_arg_get_reg_type( lccrt_irr_a_ptr arg);
extern lccrt_irr_oi_ptr lccrt_irr_oper_iter_init( lccrt_irr_oi_ptr oi, lccrt_irr_n_ptr node);
extern lccrt_irr_oi_ptr lccrt_irr_oper_iter_init_after( lccrt_irr_oi_ptr j, lccrt_irr_n_ptr node,
lccrt_irr_o_ptr oper);
extern lccrt_irr_oi_ptr lccrt_irr_oper_iter_init_before( lccrt_irr_oi_ptr j, lccrt_irr_n_ptr node,
lccrt_irr_o_ptr oper);
extern lccrt_irr_n_ptr lccrt_irr_oper_iter_get_node( lccrt_irr_oi_ptr oi);
extern lccrt_irr_o_ptr lccrt_irr_oper_iter_get_prev( lccrt_irr_oi_ptr oi);
extern lccrt_irr_o_ptr lccrt_irr_oper_iter_get_next( lccrt_irr_oi_ptr oi);
extern lccrt_irr_oi_ptr lccrt_irr_oper_iter_shift( lccrt_irr_oi_ptr oi, int is_next);
#define lccrt_irr_oper_iter_shift_next( oi) lccrt_irr_oper_iter_shift( oi, 1)
#define lccrt_irr_oper_iter_shift_prev( oi) lccrt_irr_oper_iter_shift( oi, 0)
extern lccrt_irr_o_ptr lccrt_irr_oper_new( lccrt_irr_n_ptr node, lccrt_irr_oper_name_t name,
int num_args, lccrt_irr_a_ptr args[],
lccrt_irr_a_ptr res, lccrt_irr_oi_ptr iter);
extern void lccrt_irr_oper_delete( lccrt_irr_o_ptr oper);
extern lccrt_irr_oper_name_t lccrt_irr_oper_get_name( lccrt_irr_o_ptr oper);
extern int lccrt_irr_oper_get_num_args( lccrt_irr_o_ptr oper);
extern lccrt_irr_a_ptr lccrt_irr_oper_get_arg( lccrt_irr_o_ptr oper, int arg_num);
extern lccrt_irr_a_ptr lccrt_irr_oper_get_res( lccrt_irr_o_ptr oper);
extern lccrt_irr_c_ptr lccrt_irr_label_get_code( lccrt_irr_l_ptr lb);
extern void lccrt_irr_label_bind_code( lccrt_irr_l_ptr lb, lccrt_irr_c_ptr code);
extern void lccrt_irr_label_bind_node( lccrt_irr_l_ptr lb, lccrt_irr_n_ptr node);
extern lccrt_irr_jr_ptr lccrt_irr_node_get_jit_region( lccrt_irr_n_ptr node);
extern uint64_t lccrt_irr_node_get_ident( lccrt_irr_n_ptr node);
extern lccrt_irr_c_ptr lccrt_irr_node_get_code( lccrt_irr_n_ptr node);
extern void lccrt_irr_node_set_code( lccrt_irr_n_ptr node, lccrt_irr_c_ptr code);
extern uint64_t *lccrt_irr_node_get_count_addr( lccrt_irr_n_ptr node);
extern uint64_t lccrt_irr_node_get_attrs( lccrt_irr_n_ptr node);
extern uint64_t lccrt_irr_node_set_attrs( lccrt_irr_n_ptr node, uint64_t attrs);
extern int lccrt_irr_node_get_attr( lccrt_irr_n_ptr node, int index);
extern int lccrt_irr_node_set_attr( lccrt_irr_n_ptr node, int index, int attr);
extern void lccrt_irr_node_simplify( lccrt_irr_n_ptr node);
extern int lccrt_irr_code_get_num_relocs( lccrt_irr_c_ptr code);
extern lccrt_irr_jr_ptr lccrt_irr_code_get_jit_region( lccrt_irr_c_ptr code);
extern void lccrt_irr_code_set_phys_addr( lccrt_irr_c_ptr code, uint64_t addr, int64_t length);
extern uint64_t lccrt_irr_code_get_phys_addr( lccrt_irr_c_ptr code);
extern int64_t lccrt_irr_code_get_phys_len( lccrt_irr_c_ptr code);
extern void *lccrt_irr_code_get_relocs( lccrt_irr_c_ptr code);
extern void lccrt_irr_code_set_relocs( lccrt_irr_c_ptr code, void *relocs);
extern lccrt_irr_jr_ptr lccrt_irr_reloc_get_jit_region( lccrt_irr_rl_ptr reloc);
extern uint64_t lccrt_irr_reloc_get_virt_addr( lccrt_irr_rl_ptr reloc);
extern void lccrt_irr_reloc_set_phys_addr( lccrt_irr_rl_ptr reloc, uint64_t phys_addr);
extern void *lccrt_irr_reloc_get_link( lccrt_irr_rl_ptr reloc);
extern void lccrt_irr_reloc_set_link( lccrt_irr_rl_ptr reloc, void *link);
//extern void lccrt_irr_reloc_link( lccrt_irr_rl_ptr reloc, lccrt_irr_n_ptr node);
extern void lccrt_irr_reloc_unlink( lccrt_irr_rlu_ptr reloc_unit);
extern lccrt_irr_c_ptr lccrt_irr_node_compile_code( lccrt_irr_n_ptr node);
extern int lccrt_irr_node_decompile_code( lccrt_irr_n_ptr node);
extern int lccrt_irr_reloc_patch( lccrt_irr_rl_ptr reloc, lccrt_irr_c_ptr code);
extern int64_t lccrt_irr_node_execute( lccrt_irr_n_ptr node, lccrt_irr_execute_context_ptr ec);
extern int lccrt_irr_node_print( lccrt_irr_n_ptr node);
extern int lccrt_irr_oper_print( lccrt_irr_o_ptr oper, int is_ln);
extern int lccrt_irr_oper_fprint( FILE *fout, lccrt_irr_o_ptr oper, int is_ln);
extern int lccrt_irr_arg_fprint( FILE *fout, lccrt_irr_a_ptr a, int is_ln);
extern const char *lccrt_irr_oper_name_get_str( lccrt_irr_oper_name_t name);
#define lccrt_irr_emit_oper_r0a0( b, l, n) lccrt_irr_emit_oper_r1a2( b, l, n, 0, 0, 0)
#define lccrt_irr_emit_oper_r1a0( b, l, n, r) lccrt_irr_emit_oper_r1a2( b, l, n, r, 0, 0)
#define lccrt_irr_emit_oper_r0a1( b, l, n, a0) lccrt_irr_emit_oper_r1a2( b, l, n, 0, a0, 0)
#define lccrt_irr_emit_oper_r1a1( b, l, n, r, a0) lccrt_irr_emit_oper_r1a2( b, l, n, r, a0, 0)
#define lccrt_irr_emit_oper_r0a2( b, l, n, a0, a1) lccrt_irr_emit_oper_r1a2( b, l, n, 0, a0, a1)
extern int64_t lccrt_irr_emit_oper_r1a2( void *buffer, int64_t max_length, lccrt_irr_oper_name_t name,
lccrt_irr_a_ptr r, lccrt_irr_a_ptr a0, lccrt_irr_a_ptr a1);
extern int64_t lccrt_irr_emit_bind_rel( void *inst, int64_t offset);
/**
* Кодировка операции для Backend Bytecode (BB).
* name : 2
* num_args : 2
* arg_1
* type : 1
* value : 1,2,4,8
* ...
* arg_N
* ...
* num_attrs : 2
* attr_1
* size : 2
* type : 1
* value : ...
* ...
* attr_K
* ...
* Если у операции есть результат, то он передается в качестве первого аргумента.
* Имя операции задается значениями lccrt_bb_oper_name_t.
* Тип аргумента задается значениями lccrt_bb_arg_type_t.
* Если num_args = 0, то у операции нет аргументов.
* Если num_attrs = 0, то у операции нет атрибутов.
* Поле attr.size определяет байтовый размер поля attr.value, если attr.size = 0, то
* это означает, что поле value отсутствует.
* Тип атрибута задается значениями lccrt_bb_attr_type_t.
*/
/**
* Тип аргумента операции Backend Bytecode (BB).
*/
typedef enum
{
LCCRT_BB_ARG_TYPE_HEX8 = 0,
LCCRT_BB_ARG_TYPE_HEX16,
LCCRT_BB_ARG_TYPE_HEX32,
LCCRT_BB_ARG_TYPE_HEX64,
LCCRT_BB_ARG_TYPE_LABEL8 = 8,
LCCRT_BB_ARG_TYPE_LABEL16,
LCCRT_BB_ARG_TYPE_LABEL32,
LCCRT_BB_ARG_TYPE_LABEL64,
LCCRT_BB_ARG_TYPE_REG_SYS = 16,
LCCRT_BB_ARG_TYPE_REG_GLOB,
LCCRT_BB_ARG_TYPE_REG_PHYS,
LCCRT_BB_ARG_TYPE_REG_VIRT,
} lccrt_bb_arg_type_t;
/**
* Тип аргумента операции Backend Bytecode (BB).
*/
typedef enum
{
LCCRT_BB_ATTR_TYPE_COUNTER,
LCCRT_BB_ATTR_TYPE_LAST
} lccrt_bb_attr_type_t;
/**
* Название операции Backend Bytecode (BB).
*/
typedef enum
{
LCCRT_BB_OPER_NOP,
/* Самая первая операция. */
LCCRT_BB_OPER_START,
/* Самая последняя операция. */
LCCRT_BB_OPER_STOP,
LCCRT_BB_OPER_MOV_U32,
LCCRT_BB_OPER_MOV_U64,
LCCRT_BB_OPER_EXT_S8,
LCCRT_BB_OPER_EXT_S16,
LCCRT_BB_OPER_EXT_S32,
LCCRT_BB_OPER_CONV_S32_F32,
LCCRT_BB_OPER_CONV_S32_F64,
LCCRT_BB_OPER_CONV_S64_F32,
LCCRT_BB_OPER_CONV_S64_F64,
LCCRT_BB_OPER_CONV_F32_F64,
LCCRT_BB_OPER_CONV_F64_F32,
LCCRT_BB_OPER_AND_U64,
LCCRT_BB_OPER_OR_U64,
LCCRT_BB_OPER_XOR_U64,
LCCRT_BB_OPER_SHL_U64,
LCCRT_BB_OPER_SHR_U64,
LCCRT_BB_OPER_SAR_U64,
LCCRT_BB_OPER_ADD_U64,
LCCRT_BB_OPER_SUB_U64,
LCCRT_BB_OPER_MUL_U64,
LCCRT_BB_OPER_SDIV_U64,
LCCRT_BB_OPER_UDIV_U64,
LCCRT_BB_OPER_SMOD_U64,
LCCRT_BB_OPER_UMOD_U64,
/* Взятие битового поля
arg0 (int64) - источник битового поля
arg1 (int64) - битовое смещение поля
arg2 (int64) - битовая длина поля */
LCCRT_BB_OPER_GETFIELD,
LCCRT_BB_OPER_FADD_F32,
LCCRT_BB_OPER_FADD_F64,
LCCRT_BB_OPER_FSUB_F32,
LCCRT_BB_OPER_FSUB_F64,
LCCRT_BB_OPER_FMUL_F32,
LCCRT_BB_OPER_FMUL_F64,
LCCRT_BB_OPER_FDIV_F32,
LCCRT_BB_OPER_FDIV_F64,
LCCRT_BB_OPER_FSQRT_F64,
LCCRT_BB_OPER_CMPE_U64,
LCCRT_BB_OPER_CMPNE_U64,
LCCRT_BB_OPER_CMPL_U64,
LCCRT_BB_OPER_CMPLE_U64,
LCCRT_BB_OPER_CMPB_U64,
LCCRT_BB_OPER_CMPBE_U64,
/* Сравнение формата float64 на "не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 vs (bitcast float32/float64)arg1)) */
LCCRT_BB_OPER_FCMP_U_F32,
LCCRT_BB_OPER_FCMP_U_F64,
/* Сравнение формата float64 на "упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 vs (bitcast float32/float64)arg1)) */
LCCRT_BB_OPER_FCMP_O_F32,
LCCRT_BB_OPER_FCMP_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 == (bitcast float64)arg1) || unordered) */
LCCRT_BB_OPER_FCMPE_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 == (bitcast float32/float64)arg1)) */
LCCRT_BB_OPER_FCMPE_O_F32,
LCCRT_BB_OPER_FCMPE_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 < (bitcast float64)arg1) || unordered) */
LCCRT_BB_OPER_FCMPL_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 < (bitcast float32/float64)arg1)) */
LCCRT_BB_OPER_FCMPL_O_F32,
LCCRT_BB_OPER_FCMPL_O_F64,
/* Сравнение формата float64 на "равно или не упорядочено"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float64)arg0 <= (bitcast float64)arg1) || unordered) */
LCCRT_BB_OPER_FCMPLE_U_F64,
/* Сравнение формата float64 на "равно"
arg0 (int64) - первый аргумент
arg1 (int64) - второй аргумент
res0 (int64) - (((bitcast float32/float64)arg0 <= (bitcast float32/float64)arg1)) */
LCCRT_BB_OPER_FCMPLE_O_F32,
LCCRT_BB_OPER_FCMPLE_O_F64,
/* Условная перессылка, если предикат true
arg0 (int64) - итоговое значение, если arg1 == true
arg1 (int64) - предикат выбора
res0 (int64) - (if ( arg1 ) res0 = arg1;) */
LCCRT_BB_OPER_MOVTHEN_U64,
/* Условная перессылка, если предикат false
arg0 (int64) - итоговое значение, если arg1 == false
arg1 (int64) - предикат выбора
res0 (int64) - (if ( !arg1 ) res0 = arg1;) */
LCCRT_BB_OPER_MOVELSE_U64,
LCCRT_BB_OPER_LD_U8,
LCCRT_BB_OPER_LD_U16,
LCCRT_BB_OPER_LD_U32,
LCCRT_BB_OPER_LD_U64,
LCCRT_BB_OPER_LD_S8,
LCCRT_BB_OPER_LD_S16,
LCCRT_BB_OPER_LD_S32,
LCCRT_BB_OPER_ST_U8,
LCCRT_BB_OPER_ST_U16,
LCCRT_BB_OPER_ST_U32,
LCCRT_BB_OPER_ST_U64,
/* Безусловный переход по литералу "ленивой" линковки
arg0 (reloc) - литерал перехода */
LCCRT_BB_OPER_BRANCH_RELOC,
/* Условный переход по литералам "ленивой" линковки
arg0 (reloc) - литерал перехода, если arg2 == true
arg1 (reloc) - литерал перехода, если arg2 == false
arg2 (int64) - предикат перехода */
LCCRT_BB_OPER_BRANCHIF_RELOC,
LCCRT_BB_OPER_BRANCH_DYNAMIC,
LCCRT_BB_OPER_CALL_V_U64U64,
/* Адресуемая метка */
LCCRT_BB_OPER_LABEL,
LCCRT_BB_OPER_LAST
} lccrt_bb_oper_name_t;
#if defined(__cplusplus)
}
#endif

View File

@ -21,7 +21,6 @@
#include <unistd.h>
#include "lccrt_irv.h"
#include "lccrt_jit.h"
#define LCCRT_CTX_PLUGIN_MAX_NUMBER (256)
#define LCCRT_CTX_PLUGIN_TARGET_MAX_NUMBER (256)
@ -44,18 +43,6 @@ lccrt_check_type_define( lccrt_einfo_block_t);
lccrt_check_type_define( lccrt_einfo_link_t);
lccrt_check_type_define( lccrt_context_t);
lccrt_check_type_define( lccrt_plugin_t);
lccrt_check_type_define( lccrt_irr_code_area_t);
lccrt_check_type_define( lccrt_irr_jit_region_t);
lccrt_check_type_define( lccrt_irr_code_t);
lccrt_check_type_define( lccrt_irr_execute_context_t);
lccrt_check_type_define( lccrt_irr_reloc_unit_t);
lccrt_check_type_define( lccrt_irr_reloc_t);
lccrt_check_type_define( lccrt_irr_node_t);
lccrt_check_type_define( lccrt_irr_oper_iter_t);
lccrt_check_type_define( lccrt_irr_oper_t);
lccrt_check_type_define( lccrt_irr_arg_t);
lccrt_check_type_define( lccrt_irr_reg_t);
lccrt_check_type_define( lccrt_irr_edge_t);
/**
* Данные стандартного менеджера вывода сообщений в файл.
@ -366,7 +353,7 @@ lccrt_ctx_load_plugin_lib( lccrt_plugin_t *a, const char *lib_name)
const char *(*targs)[];
int is_asm = (a->type == LCCRT_PLUGIN_TYPE_ASM);
a->num_funcs = is_asm ? LCCRT_PLUGIN_ASM_FUNC_LAST : LCCRT_PLUGIN_IRROBJ_FUNC_LAST;
a->num_funcs = LCCRT_PLUGIN_ASM_FUNC_LAST;
a->funcs = lccrt_ctx_mallocn( ctx, void *, a->num_funcs);
if ( is_asm )
{
@ -382,31 +369,7 @@ lccrt_ctx_load_plugin_lib( lccrt_plugin_t *a, const char *lib_name)
}
} else
{
a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_NODE_COMPILE] = dlsym( a->lib, LCCRT_IRROBJ_SFUNC_NODE_COMPILE);
a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_NODE_DECOMPILE] = dlsym( a->lib, LCCRT_IRROBJ_SFUNC_NODE_DECOMPILE);
a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_RELOC_PATCH] = dlsym( a->lib, LCCRT_IRROBJ_SFUNC_RELOC_PATCH);
a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_CODE_EXEC] = dlsym( a->lib, LCCRT_IRROBJ_SFUNC_CODE_EXEC);
a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_GETCONF] = dlsym( a->lib, LCCRT_IRROBJ_SFUNC_GETCONF);
if ( !a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_NODE_COMPILE] )
{
lccrt_ctx_error_plugin_sym( ctx, cur_name, LCCRT_IRROBJ_SFUNC_NODE_COMPILE);
} else if ( !a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_NODE_DECOMPILE] )
{
lccrt_ctx_error_plugin_sym( ctx, cur_name, LCCRT_IRROBJ_SFUNC_NODE_DECOMPILE);
} else if ( !a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_RELOC_PATCH] )
{
lccrt_ctx_error_plugin_sym( ctx, cur_name, LCCRT_IRROBJ_SFUNC_RELOC_PATCH);
} else if ( !a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_CODE_EXEC] )
{
lccrt_ctx_error_plugin_sym( ctx, cur_name, LCCRT_IRROBJ_SFUNC_CODE_EXEC);
} else if ( !a->funcs[LCCRT_PLUGIN_IRROBJ_FUNC_GETCONF] )
{
lccrt_ctx_error_plugin_sym( ctx, cur_name, LCCRT_IRROBJ_SFUNC_GETCONF);
}
lccrt_assert( 0);
}
lname = dlsym( a->lib, LCCRT_PLUGIN_LIBRARY_NAME_S);
@ -551,84 +514,6 @@ lccrt_ctx_find_home_path( lccrt_ctx_ptr ctx)
return (s);
} /* lccrt_ctx_find_home_path */
#if 0
/**
* Инициализация home-директории.
*/
void
lccrt_context_init_paths( lccrt_context_ptr ctx)
{
const char *s;
s = getenv( "LCCRT_HOME");
if ( s )
{
s = lccrt_ctx_copy_str( ctx, s);
} else
{
Dl_info dli;
char *t = 0;
dladdr( &lccrt_context_init_paths, &dli);
t = realpath( dli.dli_fname, 0);
if ( !t )
{
lccrt_ctx_error( ctx, 0, "Can't resolve real path of lccrt-library's location [%s]\n", dli.dli_fname);
}
s = dirname( t);
if ( !s )
{
lccrt_ctx_error( ctx, 0, "Can't resolve directory of lccrt-library's location [%s]\n", t);
}
s = lccrt_ctx_cat_strs( ctx, s, "/lccrt");
free( t);
}
ctx->paths.home = (char *)s;
if ( getenv( "LCCRT_HOME_PLUGIN") )
{
ctx->paths.plugin = lccrt_ctx_copy_str( ctx, getenv( "LCCRT_HOME_PLUGIN"));
} else
{
ctx->paths.plugin = lccrt_ctx_cat_strs( ctx, ctx->paths.home, "/plugin");
}
if ( getenv( "LCCRT_HOME_PLUGIN_ASM") )
{
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM] = getenv( "LCCRT_HOME_PLUGIN_ASM");
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM] = lccrt_ctx_copy_str( ctx, ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM];
} else
{
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM] = lccrt_ctx_cat_strs( ctx, ctx->paths.plugin, "/asm");
}
if ( getenv( "LCCRT_HOME_PLUGIN_IRROBJ") )
{
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ] = getenv( "LCCRT_HOME_PLUGIN_IRROBJ");
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ] = lccrt_ctx_copy_str( ctx, ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ];
} else
{
ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ] = lccrt_ctx_cat_strs( ctx, ctx->paths.plugin, "/irrobj");
}
if ( ctx->verbose.is_base )
{
fprintf( stderr, "\nLCCRT library config:\n\n");
fprintf( stderr, " LCCRT_VERBOSE : %s\n", getenv( "LCCRT_VERBOSE"));
fprintf( stderr, " LCCRT_HOME : %s\n", ctx->paths.home);
fprintf( stderr, " LCCRT_HOME_PLUGIN : %s\n", ctx->paths.plugin);
fprintf( stderr, " LCCRT_HOME_PLUGIN_ASM : %s\n", ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM]);
fprintf( stderr, " LCCRT_HOME_PLUGIN_IRROBJ : %s\n", ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ]);
}
return;
} /* lccrt_context_init_paths */
#endif
/**
* Загрузка плагина.
*/
@ -785,7 +670,6 @@ lccrt_context_new( lccrt_mem_ptr mem, lccrt_err_ptr err)
}
lccrt_ctx_load_plugin( ctx, LCCRT_PLUGIN_TYPE_ASM, "LCCRT_PLUGIN_TYPE_ASM", "asm");
lccrt_ctx_load_plugin( ctx, LCCRT_PLUGIN_TYPE_IRROBJ, "LCCRT_PLUGIN_TYPE_IRROBJ", "irrobj");
return (ctx);
} /* lccrt_context_new */
@ -814,7 +698,6 @@ lccrt_context_delete( lccrt_context_ptr ctx)
lccrt_ctx_free( ctx, ctx->paths.home);
lccrt_ctx_free( ctx, ctx->paths.plugin);
lccrt_ctx_free( ctx, ctx->paths.plugins[LCCRT_PLUGIN_TYPE_ASM]);
lccrt_ctx_free( ctx, ctx->paths.plugins[LCCRT_PLUGIN_TYPE_IRROBJ]);
lccrt_check_type_done( ctx, lccrt_context_t);
(*ctx->mem.pfree)( ctx->mem.pool, ctx);
@ -919,28 +802,6 @@ lccrt_context_get_plugin_asm( lccrt_ctx_ptr ctx, const char *plg_name)
return (r);
} /* lccrt_context_get_plugin_asm */
/**
* Получить ссылку на плагин.
*/
lccrt_plg_ptr
lccrt_context_get_plugin_irrobj( lccrt_ctx_ptr ctx, const char *plg_name)
{
lccrt_plg_ptr r = lccrt_context_find_plugin( ctx, LCCRT_PLUGIN_TYPE_IRROBJ, plg_name, 1);
return (r);
} /* lccrt_context_get_plugin_irrobj */
/**
* Получить ссылку на плагин.
*/
lccrt_plg_ptr
lccrt_context_find_plugin_irrobj_for_arch( lccrt_ctx_ptr ctx, const char *arch)
{
lccrt_plg_ptr r = lccrt_context_find_plugin_for_arch( ctx, LCCRT_PLUGIN_TYPE_IRROBJ, arch);
return (r);
} /* lccrt_context_find_plugin_irrobj_for_arch */
/**
* Поиск ассемблера.
*/

View File

@ -13,7 +13,6 @@
#include <stdarg.h>
#include "lccrt_irv.h"
#include "lccrt_jit.h"
typedef enum
{

View File

@ -2122,7 +2122,7 @@ lccrt_irreader_read_einfocat( lccrt_irreader_t *irr)
|| (lccrt_module_find_einfo_category( m, cname).id >= 0) )
{
lccrt_irreader_error( irr, "duplicate definition einfo-category '%%c%jd = %s', [%s]",
cident, lccrt_irreader_print_head( irr, 64, s));
cident, cname, lccrt_irreader_print_head( irr, 64, s));
} else
{
lccrt_eic_t ecat = lccrt_module_new_einfo_category( m, cname);
@ -3086,7 +3086,7 @@ lccrt_irreader_get_label( lccrt_irreader_t *irr, const char *name)
if ( !r )
{
lccrt_irreader_error( irr, "unknown label [%s] in function [%s], [%s ...]",
name, lccrt_function_get_name( fi->f));
name, fi->f->name, lccrt_function_get_name( fi->f));
}
return (r);

View File

@ -356,18 +356,18 @@ lccrt_irwriter_define_type( lccrt_irwriter_t *irw, lccrt_type_ptr t_src, lccrt_t
{
if ( lccrt_type_get_sign( t) )
{
tlen = snprintf( tname, 256, "i%d", (int)8*lccrt_type_get_bytesize( t));
tlen = snprintf( tname, 256, "i%d", (int)(8*lccrt_type_get_bytesize( t)));
} else
{
tlen = snprintf( tname, 256, "u%d", (int)8*lccrt_type_get_bytesize( t));
tlen = snprintf( tname, 256, "u%d", (int)(8*lccrt_type_get_bytesize( t)));
}
} else if ( lccrt_type_is_float( t) )
{
tlen = snprintf( tname, 256, "f%d", (int)8*lccrt_type_get_bytesize( t));
tlen = snprintf( tname, 256, "f%d", (int)(8*lccrt_type_get_bytesize( t)));
} else
{
is_simple = 0;
tlen = snprintf( tname, 256, "%%t%d", irw->tident);
tlen = snprintf( tname, 256, "%%t%jd", irw->tident);
irw->tident++;
}
@ -579,7 +579,7 @@ lccrt_irwriter_print_names( lccrt_irwriter_t *irw)
for ( v = lccrt_module_get_first_var( m); v; v = lccrt_var_get_next_var( v) )
{
snprintf( nname, 256, "@n%d", irw->nident);
snprintf( nname, 256, "@n%jd", irw->nident);
irw->nident++;
e = lccrt_hash_push( irw->snames, (uintptr_t)v, 0);
lccrt_hash_set( e, (uintptr_t)lccrt_ctx_copy_str( irw->ctx, nname));
@ -591,7 +591,7 @@ lccrt_irwriter_print_names( lccrt_irwriter_t *irw)
for ( g = lccrt_module_get_first_func( m); g; g = lccrt_function_get_next_func( g) )
{
snprintf( nname, 256, "@n%d", irw->nident);
snprintf( nname, 256, "@n%jd", irw->nident);
irw->nident++;
e = lccrt_hash_push( irw->snames, (uintptr_t)g, 0);
lccrt_hash_set( e, (uintptr_t)lccrt_ctx_copy_str( irw->ctx, nname));

View File

@ -278,7 +278,7 @@ lccrt_module_name_new_global( lccrt_m_ptr module, const char *name)
lccrt_check_type_assert( module, lccrt_module_t);
if ( !name )
{
snprintf( str, 1024, "__lccrt_g%j", module->global_name_id);
snprintf( str, 1024, "__lccrt_g%jd", module->global_name_id);
module->global_name_id++;
q = str;
}