Добавление cmake-сборки. Обновление README.md и удаление устаревшей irr-компоненты.
This commit is contained in:
parent
8add65e1e8
commit
6fa132aeb4
|
@ -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)
|
20
README.md
20
README.md
|
@ -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)
|
|
@ -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);
|
||||
|
|
566
include/lccrt.h
566
include/lccrt.h
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
/**
|
||||
* Поиск ассемблера.
|
||||
*/
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
#include "lccrt_irv.h"
|
||||
#include "lccrt_jit.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue