lccrt/include/lccrt.h

1540 lines
74 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Part of the Lccrt Project, under the Apache License v2.0
* See http://www.apache.org/licenses/LICENSE-2.0.txt for license information.
* SPDX-License-Identifier: Apache-2.0
*
* lccrt.h - пользовательский интерфейс (динамической) компиляции.
*/
#ifndef LCCRT_H
#define LCCRT_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#define LCCRT_VERSION "0.0.8"
typedef struct lccrt_mem_r *lccrt_mem_ptr;
typedef struct lccrt_err_r *lccrt_err_ptr;
typedef struct lccrt_context_r *lccrt_context_ptr;
typedef struct lccrt_plugin_r *lccrt_plugin_ptr;
typedef struct lccrt_module_r *lccrt_module_ptr;
typedef struct lccrt_function_r *lccrt_function_ptr;
typedef struct lccrt_function_jit_info_r *lccrt_function_jit_info_ptr;
typedef struct lccrt_var_r *lccrt_var_ptr;
typedef struct lccrt_varinit_r *lccrt_varinit_ptr;
typedef struct lccrt_type_r *lccrt_type_ptr;
typedef struct lccrt_oper_r *lccrt_oper_ptr;
typedef struct lccrt_oper_iterator_r *lccrt_oper_iterator_ptr;
typedef struct { intptr_t data[2]; } lccrt_einfo_reference_t;
typedef struct lccrt_einfo_tydescr_r *lccrt_einfo_tydescr_ptr;
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
#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);
/**
* Структура с настройками процесса компиляции.
*/
typedef struct
{
const char *target; /* результирующая платформа */
void *write_info; /* выходной поток */
lccrt_asm_write_t write; /* функция записи в выходной поток */
const char *out_type; /* тип выходной информации ("asm", "obj") */
int opt_level; /* уровень оптимизации */
int8_t is_pic; /* флаг PIC-режима */
int8_t pie_level; /* только для PIC-режима: 0 - not pie, 1 - small pie, 2 - large pie */
int8_t is_jit; /* включить режим компиляции */
int8_t dbg_level; /* уровень отладочной информации в формате dwarf2 */
int8_t function_sections; /* включить опцию -ffunction-sections */
int8_t data_sections; /* включить опцию -fdata-sections */
int8_t asm_verbose; /* включить опцию -fverbose-asm */
int8_t is_llvmir_embed_static_only; /* включить режим "встроенный llvm-IR только в статике" */
const char *eh_personality; /* название personality-функции */
const char *cpu_arch; /* архитектура процессора */
const char *cflags; /* дополнительные опции компиляции, которые могут быть не доступны в виде
самостоятельных параметров */
} lccrt_asm_compile_config_t;
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);
/**
* Типы данных для функций выделения/освобождения памяти.
*/
typedef void * (*lccrt_alloc_t)( void *pool, uint64_t size);
typedef void * (*lccrt_realloc_t)( void *pool, void *ptr, uint64_t size);
typedef void (*lccrt_free_t)( void *pool, void *ptr);
/**
* Данные менеджера (аллокатора) памяти.
*/
typedef struct lccrt_mem_r
{
void *pool; /*!< собственные данные менеджера (первый параметр методов) */
lccrt_alloc_t palloc; /*!< функция выделения памяти */
lccrt_realloc_t prealloc; /*!< функция увелечения размера памяти */
lccrt_free_t pfree; /*!< функция освобождения памяти */
} lccrt_mem_t;
extern void lccrt_mem_init( lccrt_mem_t *mem, void *pool,
lccrt_alloc_t alloc_func, lccrt_realloc_t realloc_func,
lccrt_free_t free_func);
/**
* Тип данных для выдачи события о возникновении ошибки.
*/
typedef void (*lccrt_errmsg_t)( void *data, int errid, const char *fmt, ...);
/**
* Данные для менеджера вывода сообщений об ошибках и сообщений с предупреждениями.
*/
typedef struct lccrt_err_r
{
void *data; /* собственные данные менеджера (первый параметр методов) */
lccrt_errmsg_t error_func; /* функция вывода сообщения об ошибке */
lccrt_errmsg_t warning_func; /* функция вывода сообщения с предупреждением */
} lccrt_err_t;
extern void lccrt_err_init( lccrt_err_t *mem, void *data,
lccrt_errmsg_t error_func, lccrt_errmsg_t warning_func);
extern lccrt_err_ptr lccrt_err_new( lccrt_err_ptr err, void *data, lccrt_errmsg_t err_func,
lccrt_errmsg_t warning_func);
extern lccrt_err_ptr lccrt_err_delete( lccrt_err_ptr err);
typedef enum
{
LCCRT_HASH_KEY_INTPTR,
LCCRT_HASH_KEY_STRING,
LCCRT_HASH_KEY_LAST
} lccrt_hash_key_type_t;
extern int lccrt_exec_with_fork( const char *path, char *argv[], pid_t *wpid, int fds[2]);
/**
* Тип размещения переменной.
*/
typedef enum
{
LCCRT_VAR_LOC_GLOB = 0, /* глобальная переменная (модуля) */
LCCRT_VAR_LOC_EXT, /* декларация глобальной переменной */
LCCRT_VAR_LOC_CONSTARG, /* глобальная переменная для константных аргументов */
LCCRT_VAR_LOC_LOCAL, /* локальная переменная (функции) */
LCCRT_VAR_LOC_ARG, /* параметр функции */
LCCRT_VAR_LOC_SYSARG, /* (специальный) параметр функции */
LCCRT_VAR_LOC_ASM, /* основной параметр (описание) asm-вставки */
LCCRT_VAR_LOC_LAST
} lccrt_var_loc_t;
#define lccrt_loc_is_ext( l) ((l) == LCCRT_VAR_LOC_EXT)
#define lccrt_loc_is_constarg( l) ((l) == LCCRT_VAR_LOC_CONSTARG)
#define lccrt_loc_is_global( l) \
( \
((l) == LCCRT_VAR_LOC_GLOB) \
|| lccrt_loc_is_constarg( l) \
|| lccrt_loc_is_ext( l) \
)
#define lccrt_loc_is_local( l) \
( \
((l) == LCCRT_VAR_LOC_LOCAL) \
|| ((l) == LCCRT_VAR_LOC_ARG) \
|| ((l) == LCCRT_VAR_LOC_SYSARG) \
|| lccrt_loc_is_asm( l) \
)
#define lccrt_loc_is_asm( l) \
( \
((l) == LCCRT_VAR_LOC_ASM) \
)
/**
* Тип старшинства при линковке.
*/
typedef enum
{
LCCRT_LINK_BND_NO = 0,
LCCRT_LINK_BND_GLOBAL,
LCCRT_LINK_BND_WEAK,
LCCRT_LINK_BND_LOCAL,
LCCRT_LINK_BND_LAST
} lccrt_link_bind_t;
/**
* Тип видимости при линковке.
*/
typedef enum
{
LCCRT_LINK_VIS_DEFAULT = 0,
LCCRT_LINK_VIS_INTERNAL,
LCCRT_LINK_VIS_HIDDEN,
LCCRT_LINK_VIS_PROTECTED,
LCCRT_LINK_VIS_LAST
} lccrt_link_visibility_t;
/**
* TLS-тип линковки.
*/
typedef enum
{
LCCRT_LINK_TLS_NO = 0,
LCCRT_LINK_TLS_DYNAMIC_G,
LCCRT_LINK_TLS_DYNAMIC_L,
LCCRT_LINK_TLS_EXEC_I,
LCCRT_LINK_TLS_EXEC_L,
LCCRT_LINK_TLS_LAST
} lccrt_link_tls_t;
typedef uint64_t lccrt_link_t;
/**
* Разновидности флагов инициализации для функции.
*/
typedef enum lccrt_function_init_type_r
{
LCCRT_FUNC_INIT_NONE,
LCCRT_FUNC_INIT_CTOR,
LCCRT_FUNC_INIT_DTOR,
LCCRT_FUNC_INIT_LAST
} lccrt_function_init_type_t;
/**
* Названия IR-типов данных.
*/
typedef enum lccrt_type_name_r
{
LCCRT_TYPE_VOID,
LCCRT_TYPE_BOOL,
LCCRT_TYPE_INT,
LCCRT_TYPE_FLOAT,
LCCRT_TYPE_PTR,
LCCRT_TYPE_ARRAY,
LCCRT_TYPE_VLA_ARRAY,
LCCRT_TYPE_VECTOR,
LCCRT_TYPE_STRUCT,
LCCRT_TYPE_FIELD,
LCCRT_TYPE_FUNC,
LCCRT_TYPE_ELLIPSIS,
LCCRT_TYPE_NAME,
LCCRT_TYPE_LAST
} lccrt_type_name_t;
/**
* Нумерация целых IR-типов данных.
*/
typedef enum lccrt_type_name_int_r
{
LCCRT_INT_SUBTYPE_8 = 0,
LCCRT_INT_SUBTYPE_16,
LCCRT_INT_SUBTYPE_32,
LCCRT_INT_SUBTYPE_64,
LCCRT_INT_SUBTYPE_128,
LCCRT_INT_SUBTYPE_LAST
} lccrt_type_name_int_t;
/**
* Нумерация плавающих IR-типов данных.
*/
typedef enum lccrt_type_name_float_r
{
LCCRT_FLOAT_SUBTYPE_32 = 0,
LCCRT_FLOAT_SUBTYPE_64,
LCCRT_FLOAT_SUBTYPE_80,
LCCRT_FLOAT_SUBTYPE_128,
LCCRT_FLOAT_SUBTYPE_LAST
} lccrt_type_name_float_t;
/**
* Виды инициализаторов.
*/
typedef enum
{
LCCRT_VARINIT_HEX, /* битовое представление скаляра (не более 64-бит) */
LCCRT_VARINIT_STR, /* строка */
LCCRT_VARINIT_ARR, /* массив (в том числе структура как массив собственных полей) */
LCCRT_VARINIT_ZERO, /* инициализация типа нулями */
LCCRT_VARINIT_ADDR_VAR, /* адрес переменной */
LCCRT_VARINIT_ADDR_FUNC, /* адрес функции */
LCCRT_VARINIT_LAST
} lccrt_varinit_inittype_t;
/**
* Названия операций.
*/
typedef enum
{
LCCRT_OPER_LABEL,
LCCRT_OPER_CMP,
LCCRT_OPER_BRANCH,
LCCRT_OPER_BRANCHIF,
LCCRT_OPER_SWITCH,
LCCRT_OPER_RET,
LCCRT_OPER_RETVAL,
LCCRT_OPER_CALLPROC,
LCCRT_OPER_CALLFUNC,
LCCRT_OPER_INVOKEPROC,
LCCRT_OPER_INVOKEFUNC,
LCCRT_OPER_LANDINGPAD,
LCCRT_OPER_VA_ARG,
LCCRT_OPER_ALLOCA,
LCCRT_OPER_BITCAST,
LCCRT_OPER_SELECT,
LCCRT_OPER_MOVE,
LCCRT_OPER_VARPTR,
LCCRT_OPER_ELEMPTR,
LCCRT_OPER_ELEMREAD,
LCCRT_OPER_ELEMWRITE,
LCCRT_OPER_SHUFFLE,
LCCRT_OPER_LOAD,
LCCRT_OPER_STORE,
LCCRT_OPER_SEXT,
LCCRT_OPER_ZEXT,
LCCRT_OPER_TRUNC,
LCCRT_OPER_FPTOFP,
LCCRT_OPER_FPTOUI,
LCCRT_OPER_FPTOSI,
LCCRT_OPER_UITOFP,
LCCRT_OPER_SITOFP,
LCCRT_OPER_ADD,
LCCRT_OPER_SUB,
LCCRT_OPER_MUL,
LCCRT_OPER_UDIV,
LCCRT_OPER_SDIV,
LCCRT_OPER_UMOD,
LCCRT_OPER_SMOD,
LCCRT_OPER_SHL,
LCCRT_OPER_SHR,
LCCRT_OPER_SAR,
LCCRT_OPER_AND,
LCCRT_OPER_OR,
LCCRT_OPER_XOR,
LCCRT_OPER_FNEG,
LCCRT_OPER_FADD,
LCCRT_OPER_FMUL,
LCCRT_OPER_FSUB,
LCCRT_OPER_FDIV,
LCCRT_OPER_FMOD,
LCCRT_OPER_LAST
} lccrt_oper_name_t;
/**
* Операция формирует результат в переменной.
*/
#define lccrt_oper_name_is_res( n) \
( ((n) == LCCRT_OPER_CMP) \
|| ((n) == LCCRT_OPER_CALLFUNC) \
|| ((n) == LCCRT_OPER_INVOKEFUNC) \
|| ((n) == LCCRT_OPER_LANDINGPAD) \
|| ((n) == LCCRT_OPER_VA_ARG) \
|| ((n) == LCCRT_OPER_ALLOCA) \
|| ((n) == LCCRT_OPER_BITCAST) \
|| ((n) == LCCRT_OPER_SELECT) \
|| ((n) == LCCRT_OPER_MOVE) \
|| ((n) == LCCRT_OPER_VARPTR) \
|| ((n) == LCCRT_OPER_ELEMPTR) \
|| ((n) == LCCRT_OPER_ELEMREAD) \
|| ((n) == LCCRT_OPER_SHUFFLE) \
|| ((n) == LCCRT_OPER_LOAD) \
|| ((n) == LCCRT_OPER_SEXT) \
|| ((n) == LCCRT_OPER_ZEXT) \
|| ((n) == LCCRT_OPER_TRUNC) \
|| ((n) == LCCRT_OPER_FPTOFP) \
|| ((n) == LCCRT_OPER_FPTOUI) \
|| ((n) == LCCRT_OPER_FPTOSI) \
|| ((n) == LCCRT_OPER_UITOFP) \
|| ((n) == LCCRT_OPER_SITOFP) \
|| ((n) == LCCRT_OPER_ADD) \
|| ((n) == LCCRT_OPER_SUB) \
|| ((n) == LCCRT_OPER_MUL) \
|| ((n) == LCCRT_OPER_UDIV) \
|| ((n) == LCCRT_OPER_SDIV) \
|| ((n) == LCCRT_OPER_UMOD) \
|| ((n) == LCCRT_OPER_SMOD) \
|| ((n) == LCCRT_OPER_SHL) \
|| ((n) == LCCRT_OPER_SHR) \
|| ((n) == LCCRT_OPER_SAR) \
|| ((n) == LCCRT_OPER_AND) \
|| ((n) == LCCRT_OPER_OR) \
|| ((n) == LCCRT_OPER_XOR) \
|| ((n) == LCCRT_OPER_FNEG) \
|| ((n) == LCCRT_OPER_FADD) \
|| ((n) == LCCRT_OPER_FSUB) \
|| ((n) == LCCRT_OPER_FMUL) \
|| ((n) == LCCRT_OPER_FDIV) \
|| ((n) == LCCRT_OPER_FMOD) \
)
/**
* Детализация типа сравнения.
*/
typedef enum lccrt_cmp_name_r
{
LCCRT_CMP_EQ,
LCCRT_CMP_NE,
/* Знаковые целочисленные сравнения. */
LCCRT_CMP_LT_I,
LCCRT_CMP_LE_I,
LCCRT_CMP_GT_I,
LCCRT_CMP_GE_I,
/* Беззнаковые целочисленные сравнения. */
LCCRT_CMP_LT_U,
LCCRT_CMP_LE_U,
LCCRT_CMP_GT_U,
LCCRT_CMP_GE_U,
/* Плавающие сравнения с проверкой упорядоченности. */
LCCRT_CMP_FO,
LCCRT_CMP_EQ_FO,
LCCRT_CMP_NE_FO,
LCCRT_CMP_LT_FO,
LCCRT_CMP_LE_FO,
LCCRT_CMP_GT_FO,
LCCRT_CMP_GE_FO,
/* Плавающие сравнения без проверки упорядоченности. */
LCCRT_CMP_FU,
LCCRT_CMP_EQ_FU,
LCCRT_CMP_NE_FU,
LCCRT_CMP_LT_FU,
LCCRT_CMP_LE_FU,
LCCRT_CMP_GT_FU,
LCCRT_CMP_GE_FU,
LCCRT_CMP_LAST
} lccrt_cmp_name_t;
/**
* Аргумент операции.
*/
typedef union lccrt_arg_r
{
lccrt_oper_ptr op; /* аргумент-операция */
lccrt_var_ptr v; /* аргумент-переменная */
} lccrt_arg_t;
/**
* Значение 'val', для которого нужно сделать переход на 'dst'.
*/
typedef struct lccrt_switch_alts_r
{
lccrt_varinit_ptr val; /* значение */
lccrt_oper_ptr dst; /* точка перехода */
} lccrt_switch_alts_t;
typedef lccrt_context_ptr lccrt_ctx_ptr;
typedef lccrt_plugin_ptr lccrt_plg_ptr;
typedef lccrt_module_ptr lccrt_m_ptr;
typedef lccrt_function_ptr lccrt_f_ptr;
typedef lccrt_function_jit_info_ptr lccrt_fji_ptr;
typedef lccrt_type_ptr lccrt_t_ptr;
typedef lccrt_var_ptr lccrt_v_ptr;
typedef lccrt_varinit_ptr lccrt_vi_ptr;
typedef lccrt_oper_ptr lccrt_o_ptr;
typedef lccrt_oper_iterator_ptr lccrt_oi_ptr;
typedef lccrt_einfo_reference_t lccrt_eir_t;
typedef lccrt_einfo_tydescr_ptr lccrt_eitd_ptr;
typedef lccrt_einfo_category_t lccrt_eic_t;
typedef lccrt_einfo_field_id_t lccrt_eifi_t;
typedef lccrt_hash_key_type_t lccrt_hkt_t;
typedef struct lccrt_hash_entry_r *lccrt_hash_entry_ptr;
typedef struct lccrt_hash_r *lccrt_hash_ptr;
typedef lccrt_hash_entry_ptr lccrt_he_ptr;
typedef lccrt_hash_ptr lccrt_h_ptr;
extern lccrt_h_ptr lccrt_hash_new( lccrt_ctx_ptr ctx, lccrt_hkt_t type);
extern void lccrt_hash_delete( lccrt_h_ptr ht);
extern int64_t lccrt_hash_length( lccrt_h_ptr ht);
extern lccrt_he_ptr lccrt_hash_push( lccrt_h_ptr ht, uintptr_t key, int *is_new);
extern lccrt_he_ptr lccrt_hash_find( lccrt_h_ptr ht, uintptr_t key);
extern uintptr_t lccrt_hash_remove( lccrt_he_ptr he);
extern uintptr_t lccrt_hash_get_key( lccrt_he_ptr he);
extern uintptr_t lccrt_hash_get( lccrt_he_ptr he);
extern uintptr_t lccrt_hash_set( lccrt_he_ptr he, uintptr_t data);
extern lccrt_he_ptr lccrt_hash_first( lccrt_h_ptr ht);
extern lccrt_he_ptr lccrt_hash_next( lccrt_he_ptr he);
/**
* \defgroup tyCtxFns Методы структуры lccrt_context_t
*
* Список основных методов:
* - \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
*
*/
extern lccrt_ctx_ptr lccrt_context_new( lccrt_mem_ptr mem, lccrt_err_ptr err);
extern void lccrt_context_delete( lccrt_ctx_ptr ctx);
extern int lccrt_context_get_verbose_ir( lccrt_ctx_ptr ctx);
extern void lccrt_context_set_verbose_ir( lccrt_ctx_ptr ctx, int value);
extern const char *lccrt_context_get_toolchain( lccrt_ctx_ptr ctx, const char *asm_lib,
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, ...) \
({ \
lccrt_err_t e = lccrt_context_get_err_info( ctx); \
if ( e.error_func ) \
{ \
e.error_func( e.data, id, fmt, ##__VA_ARGS__); \
} \
0; \
})
extern lccrt_m_ptr lccrt_module_new( lccrt_ctx_ptr ctx, const char *mname, int is_m32);
extern void lccrt_module_delete( lccrt_m_ptr m);
extern void lccrt_module_rename( lccrt_m_ptr m, const char *new_name);
extern lccrt_ctx_ptr lccrt_module_get_context( lccrt_m_ptr m);
extern const char *lccrt_module_get_name( lccrt_m_ptr m);
extern void *lccrt_module_get_funcs_list( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_module_get_first_type( lccrt_m_ptr m);
extern lccrt_v_ptr lccrt_module_get_first_var( lccrt_m_ptr m);
extern lccrt_f_ptr lccrt_module_get_first_func( lccrt_m_ptr m);
extern const char *lccrt_module_get_inline_asm( lccrt_m_ptr m);
extern void lccrt_module_set_inline_asm( lccrt_m_ptr m, const char *asm_text);
extern int lccrt_module_apply_jit_support( lccrt_m_ptr m);
extern int lccrt_module_compile_asm( lccrt_m_ptr m, const char *asm_lib,
lccrt_asm_compile_config_t *cnf);
extern int lccrt_module_is_jit( lccrt_m_ptr m);
extern int lccrt_module_is_ptr32( lccrt_module_ptr m);
extern lccrt_f_ptr lccrt_module_find_function( lccrt_m_ptr m, const char *name);
extern lccrt_eic_t lccrt_module_new_einfo_category( lccrt_m_ptr m, const char *name);
extern lccrt_eic_t lccrt_module_find_einfo_category( lccrt_m_ptr m, const char *name);
extern lccrt_eir_t lccrt_module_get_einfo( lccrt_m_ptr m, lccrt_einfo_category_t eic);
extern void lccrt_module_set_einfo( lccrt_m_ptr m, lccrt_eic_t eic, lccrt_eir_t value);
extern int lccrt_module_print( lccrt_asm_compile_config_t *acc, lccrt_module_ptr m, int fd);
extern int lccrt_module_print_stdout( lccrt_asm_compile_config_t *acc, lccrt_module_ptr m);
extern lccrt_m_ptr lccrt_module_load( lccrt_ctx_ptr ctx, int fd, lccrt_asm_compile_config_t *acc);
extern lccrt_einfo_tydescr_ptr lccrt_einfo_tydescr_get_elem( lccrt_eitd_ptr eitd, int elem_k);
extern int lccrt_einfo_is_tydescr_i64( lccrt_einfo_tydescr_ptr eitd);
extern int lccrt_einfo_is_tydescr_raw( lccrt_einfo_tydescr_ptr eitd);
extern lccrt_eitd_ptr lccrt_einfo_make_tydescr_i64( lccrt_m_ptr m);
extern lccrt_eitd_ptr lccrt_einfo_make_tydescr_raw( lccrt_m_ptr m);
extern lccrt_eitd_ptr lccrt_einfo_make_tydescr_array( lccrt_m_ptr m, lccrt_eitd_ptr elem_type);
extern lccrt_eitd_ptr lccrt_einfo_make_tydescr_struct( lccrt_m_ptr m, const char *name, int num_flds,
const char **flds_names, lccrt_eitd_ptr *flds_types);
extern lccrt_eitd_ptr lccrt_einfo_make_tydescr_union( lccrt_m_ptr m, int num_flds,
lccrt_eitd_ptr *flds_types);
extern lccrt_eifi_t lccrt_einfo_find_tydescr_field( lccrt_einfo_tydescr_ptr eitd, const char *fld_name);
extern lccrt_eir_t lccrt_einfo_new_empty();
extern lccrt_eir_t lccrt_einfo_new_i64( uint64_t value);
extern lccrt_eir_t lccrt_einfo_new_raw( lccrt_m_ptr m, int length, const uint8_t *data);
extern lccrt_eir_t lccrt_einfo_new_raw_by_string( lccrt_m_ptr m, const char *data);
extern lccrt_eir_t lccrt_einfo_new_struct( lccrt_eitd_ptr eitd);
extern lccrt_eir_t lccrt_einfo_new_array( lccrt_eitd_ptr eitd, int alloc_elems);
extern lccrt_einfo_tydescr_ptr lccrt_einfo_get_tydescr( lccrt_eir_t einfo);
extern lccrt_einfo_category_t lccrt_einfo_category_empty();
extern int lccrt_einfo_category_is_valued( lccrt_einfo_category_t ecat);
extern int lccrt_einfo_is_empty( lccrt_eir_t einfo);
extern int lccrt_einfo_is_valued( lccrt_eir_t einfo);
extern int lccrt_einfo_get_num_args( lccrt_eir_t einfo);
extern uint64_t lccrt_einfo_get_i64( lccrt_eir_t einfo);
extern lccrt_eir_t lccrt_einfo_get_field( lccrt_eir_t einfo, lccrt_eifi_t fid);
extern void lccrt_einfo_set_field( lccrt_eir_t einfo, lccrt_eifi_t fid, lccrt_eir_t value);
extern lccrt_eir_t lccrt_einfo_get_elem( lccrt_eir_t einfo, int elem_ident);
extern void lccrt_einfo_set_elem( lccrt_eir_t einfo, int elem_ident, lccrt_eir_t value);
extern void lccrt_einfo_push_elem( lccrt_eir_t einfo, lccrt_eir_t value);
extern uint8_t *lccrt_einfo_get_raw_data( lccrt_eir_t einfo);
extern int lccrt_einfo_get_raw_length( lccrt_eir_t einfo);
extern int lccrt_einfo_get_array_length( lccrt_eir_t einfo);
extern lccrt_f_ptr lccrt_function_new( lccrt_m_ptr m, lccrt_t_ptr fsig,
const char *fname, const char *asm_fname,
lccrt_link_t link, int is_declaration,
int is_builtin);
extern lccrt_m_ptr lccrt_function_get_module( lccrt_f_ptr func);
extern const char *lccrt_function_get_comdat( lccrt_f_ptr func);
extern void lccrt_function_set_comdat( lccrt_f_ptr func, const char *comdat);
extern lccrt_v_ptr lccrt_function_get_arg( lccrt_f_ptr func, int arg_num);
extern lccrt_v_ptr lccrt_function_get_sysarg( lccrt_f_ptr func, int arg_num);
extern void lccrt_function_set_arg( lccrt_f_ptr func, int k_arg, lccrt_v_ptr arg);
extern void lccrt_function_add_arg( lccrt_f_ptr func, int k_arg, lccrt_v_ptr arg);
extern void lccrt_function_set_sysarg( lccrt_f_ptr func, int k_arg, lccrt_v_ptr arg);
extern void lccrt_function_add_sysarg( lccrt_f_ptr func, int k_arg, lccrt_v_ptr arg);
extern lccrt_link_t lccrt_function_get_link( lccrt_f_ptr func);
extern void lccrt_function_set_link( lccrt_f_ptr func, lccrt_link_t li);
extern void lccrt_function_set_section( lccrt_f_ptr func, const char *section);
extern void lccrt_function_set_init_type( lccrt_f_ptr func, lccrt_function_init_type_t init_type);
extern void lccrt_function_set_init_priority( lccrt_f_ptr func, int priority);
extern int lccrt_function_get_attr_does_not_throw( lccrt_f_ptr func);
extern int lccrt_function_set_attr_does_not_throw( lccrt_f_ptr func, int value);
extern int lccrt_function_get_attr_extern_inline( lccrt_f_ptr func);
extern int lccrt_function_set_attr_extern_inline( lccrt_f_ptr func, int value);
extern int lccrt_function_get_attr_used( lccrt_f_ptr func);
extern int lccrt_function_set_attr_used( lccrt_f_ptr func, int value);
extern int lccrt_function_set_declaration( lccrt_f_ptr func, int is_declaration);
extern lccrt_f_ptr lccrt_function_get_next_func( lccrt_f_ptr func);
extern lccrt_t_ptr lccrt_function_get_type( lccrt_f_ptr func);
extern lccrt_v_ptr lccrt_function_get_arg( lccrt_f_ptr func, int arg_num);
extern const char *lccrt_function_get_name( lccrt_f_ptr func);
extern const char *lccrt_function_get_asm_name( lccrt_f_ptr func);
extern const char *lccrt_function_get_section( lccrt_f_ptr func);
extern lccrt_function_init_type_t lccrt_function_get_init_type( lccrt_f_ptr func);
extern int lccrt_function_get_init_priority( lccrt_f_ptr func);
extern lccrt_fji_ptr lccrt_function_get_jit_info( lccrt_f_ptr func);
extern int lccrt_function_get_num_args( lccrt_f_ptr func);
extern int lccrt_function_get_num_sysargs( lccrt_f_ptr func);
extern lccrt_v_ptr lccrt_function_get_first_var( lccrt_f_ptr func);
extern lccrt_o_ptr lccrt_function_get_first_oper( lccrt_f_ptr func);
extern int lccrt_function_is_var_arg( lccrt_f_ptr f);
extern int lccrt_function_is_declaration( lccrt_f_ptr func);
extern int lccrt_function_is_builtin( lccrt_f_ptr func);
extern int lccrt_function_is_used( lccrt_f_ptr func);
extern int lccrt_function_is_profgen( lccrt_f_ptr func);
extern void lccrt_function_set_einfo( lccrt_f_ptr func, lccrt_eic_t eic, lccrt_eir_t value);
extern lccrt_eir_t lccrt_function_get_einfo( lccrt_f_ptr func, lccrt_eic_t eic);
extern lccrt_v_ptr lccrt_fji_get_profgen_tls( lccrt_fji_ptr fji);
extern lccrt_v_ptr lccrt_fji_get_jit_entry( lccrt_fji_ptr fji);
extern lccrt_type_name_t lccrt_type_get_name( lccrt_t_ptr type);
extern lccrt_t_ptr lccrt_type_get_next_type( lccrt_t_ptr type);
extern lccrt_t_ptr lccrt_type_get_parent( lccrt_t_ptr type);
extern uint64_t lccrt_type_get_num_args( lccrt_t_ptr type);
extern lccrt_t_ptr lccrt_type_get_arg( lccrt_t_ptr type, int arg_num);
extern uint64_t lccrt_type_get_bytealign( lccrt_t_ptr type);
extern uint64_t lccrt_type_get_bytesize( lccrt_t_ptr type);
extern uint64_t lccrt_type_get_byteshift( lccrt_t_ptr type);
extern uint64_t lccrt_type_get_bitsubshift( lccrt_t_ptr type);
extern uint64_t lccrt_type_get_bitsubsize( lccrt_t_ptr type);
extern lccrt_v_ptr lccrt_type_get_vla_size( lccrt_t_ptr type);
extern int lccrt_type_get_sign( lccrt_t_ptr type);
extern int lccrt_type_is_void( lccrt_t_ptr type);
extern int lccrt_type_is_bool( lccrt_t_ptr type);
extern int lccrt_type_is_int( lccrt_t_ptr type);
extern int lccrt_type_is_float( lccrt_t_ptr type);
extern int lccrt_type_is_pointer( lccrt_t_ptr type);
extern int lccrt_type_is_typename( lccrt_t_ptr type);
extern int lccrt_type_is_ellipsis( lccrt_t_ptr type);
extern int lccrt_type_is_field( lccrt_t_ptr type);
extern int lccrt_type_is_struct( lccrt_t_ptr type);
extern int lccrt_type_is_union( lccrt_t_ptr type);
extern int lccrt_type_is_array( lccrt_t_ptr type);
extern int lccrt_type_is_vector( lccrt_t_ptr type);
extern int lccrt_type_is_function( lccrt_t_ptr type);
extern int lccrt_type_is_class_elems( lccrt_t_ptr type);
extern int lccrt_type_is_class_struct( lccrt_t_ptr type);
extern int lccrt_type_is_function_var_arg( lccrt_t_ptr type);
extern lccrt_type_name_int_t lccrt_type_int_find_by_bitsize( uint64_t bitsize);
extern lccrt_type_name_float_t lccrt_type_float_find_by_bitsize( uint64_t bitsize);
extern lccrt_t_ptr lccrt_type_make( lccrt_m_ptr m, int type_name,
lccrt_t_ptr parent, lccrt_t_ptr *args,
uint64_t num_args, lccrt_v_ptr vnum,
const char *sym_name, int is_sign, uint64_t bytealign,
uint64_t bytesize, uint64_t byteshift, int bitsubshift,
int bitsubsize, int is_union);
extern int lccrt_type_print( lccrt_t_ptr type, int is_ln);
extern void lccrt_type_set_parent( lccrt_t_ptr ty, lccrt_t_ptr pt);
extern void lccrt_type_set_arg( lccrt_t_ptr ty, int arg_num, lccrt_t_ptr arg);
extern void lccrt_type_set_typename_bytesize( lccrt_t_ptr ty, uint64_t bytesize);
extern void lccrt_type_set_typename_bytealign( lccrt_t_ptr ty, uint64_t bytealign);
extern lccrt_m_ptr lccrt_type_get_module( lccrt_t_ptr ty);
extern lccrt_t_ptr lccrt_type_make_void( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_bool( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_ellipsis( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_int( lccrt_m_ptr m, uint64_t bytesize, int sign);
extern lccrt_t_ptr lccrt_type_make_float( lccrt_m_ptr m, uint64_t bytesize);
extern lccrt_t_ptr lccrt_type_make_intptr( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_pintptr( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_pvoid( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_pbyte( lccrt_m_ptr m);
extern lccrt_t_ptr lccrt_type_make_pchar( lccrt_m_ptr m);
#define lccrt_type_make_u8( m) lccrt_type_make_int( m, 1, 0)
#define lccrt_type_make_u16( m) lccrt_type_make_int( m, 2, 0)
#define lccrt_type_make_u32( m) lccrt_type_make_int( m, 4, 0)
#define lccrt_type_make_u64( m) lccrt_type_make_int( m, 8, 0)
#define lccrt_type_make_u128( m) lccrt_type_make_int( m, 16, 0)
#define lccrt_type_make_f32( m) lccrt_type_make_float( m, 4)
#define lccrt_type_make_f64( m) lccrt_type_make_float( m, 8)
extern lccrt_t_ptr lccrt_type_make_ptr_type( lccrt_t_ptr parent);
extern lccrt_t_ptr lccrt_type_make_func( lccrt_t_ptr ret_type, int num_args,
lccrt_t_ptr *args);
extern lccrt_t_ptr lccrt_type_make_array( lccrt_t_ptr elem, uint64_t num_elems);
extern lccrt_t_ptr lccrt_type_make_vector( lccrt_t_ptr elem, uint64_t num_elems);
extern lccrt_t_ptr lccrt_type_make_vla( lccrt_t_ptr elem, lccrt_v_ptr vnum);
extern lccrt_t_ptr lccrt_type_make_field( lccrt_t_ptr parent, uint64_t bytealign, uint64_t byteshift,
int bitsubshift, int bitsubsize);
extern lccrt_t_ptr lccrt_type_make_struct( lccrt_m_ptr m, uint64_t bytealign, uint64_t bytesize,
int num_flds, lccrt_t_ptr *flds, int is_union);
extern lccrt_t_ptr lccrt_type_make_typename( lccrt_m_ptr m, const char *name,
lccrt_t_ptr type);
#define lccrt_type_make_ptypename( m, name) \
( \
lccrt_type_make_ptr_type( lccrt_type_make_typename( m, name, 0)) \
)
extern lccrt_link_t lccrt_link_get( lccrt_link_bind_t bind, lccrt_link_visibility_t vis,
lccrt_link_tls_t tls, int is_cnst, int is_alias);
extern lccrt_link_tls_t lccrt_link_get_tls( lccrt_link_t link);
extern lccrt_link_bind_t lccrt_link_get_bnd( lccrt_link_t link);
extern lccrt_link_visibility_t lccrt_link_get_vis( lccrt_link_t link);
extern int lccrt_link_is_alias( lccrt_link_t link);
extern int lccrt_link_is_const( lccrt_link_t link);
extern lccrt_v_ptr lccrt_var_new( void *holder, lccrt_var_loc_t loc,
lccrt_t_ptr type, const char *name,
const char *asm_name, lccrt_link_t link,
unsigned align);
extern void lccrt_var_delete( lccrt_v_ptr var);
extern lccrt_v_ptr lccrt_var_new_local( lccrt_f_ptr f, lccrt_t_ptr type,
const char *name);
extern lccrt_v_ptr lccrt_var_new_asm( lccrt_f_ptr f, lccrt_t_ptr type,
const char *asm_text, const char *asm_cnstr);
extern lccrt_v_ptr lccrt_var_new_declaration( lccrt_m_ptr m, lccrt_t_ptr type,
const char *name, lccrt_link_t link);
extern lccrt_v_ptr lccrt_var_new_constarg( lccrt_m_ptr m, lccrt_t_ptr type, lccrt_vi_ptr vi);
extern lccrt_v_ptr lccrt_var_new_constarg_hex( lccrt_m_ptr m, lccrt_t_ptr type, uint64_t value);
extern lccrt_v_ptr lccrt_var_new_constarg_str( lccrt_m_ptr m, uint64_t s_len, const char *s);
extern const char *lccrt_var_get_comdat( lccrt_v_ptr var);
extern const char *lccrt_var_get_section( lccrt_v_ptr v);
extern lccrt_link_t lccrt_var_get_link( lccrt_v_ptr var);
extern int lccrt_var_get_attr_common( lccrt_v_ptr var);
extern int lccrt_var_get_attr_used( lccrt_v_ptr var);
extern int lccrt_var_get_attr_restrict( lccrt_v_ptr var);
extern const char *lccrt_var_get_name( lccrt_v_ptr var);
extern const char *lccrt_var_get_asm_name( lccrt_v_ptr var);
extern lccrt_link_t lccrt_var_get_link( lccrt_v_ptr var);
extern unsigned lccrt_var_get_align( lccrt_v_ptr var);
extern lccrt_var_loc_t lccrt_var_get_loc( lccrt_v_ptr var);
extern void lccrt_var_set_comdat( lccrt_v_ptr var, const char *comdat);
extern void lccrt_var_set_section( lccrt_v_ptr v, const char *section_name);
extern lccrt_link_t lccrt_var_set_link( lccrt_v_ptr var, lccrt_link_t li);
extern int lccrt_var_set_attr_common( lccrt_v_ptr var, int value);
extern int lccrt_var_set_attr_used( lccrt_v_ptr var, int value);
extern int lccrt_var_set_attr_restrict( lccrt_v_ptr var, int value);
extern lccrt_m_ptr lccrt_var_get_module( lccrt_v_ptr var);
extern lccrt_t_ptr lccrt_var_get_type( lccrt_v_ptr var);
extern uint64_t lccrt_var_get_bytesize( lccrt_v_ptr var);
extern lccrt_vi_ptr lccrt_var_get_init_value( lccrt_v_ptr var);
extern lccrt_v_ptr lccrt_var_get_next_var( lccrt_v_ptr var);
extern uint64_t lccrt_var_get_constarg_hex64( lccrt_v_ptr v);
extern int64_t lccrt_var_get_constarg_int64( lccrt_v_ptr v);
extern const char *lccrt_var_get_constarg_str( lccrt_v_ptr v);
extern lccrt_f_ptr lccrt_var_get_constarg_func( lccrt_v_ptr v);
extern lccrt_t_ptr lccrt_var_expand_array( lccrt_v_ptr var, lccrt_t_ptr type);
extern void lccrt_var_set_init_value( lccrt_v_ptr v, lccrt_vi_ptr iv);
extern void lccrt_var_set_init_value_reduce( lccrt_v_ptr v, lccrt_vi_ptr iv);
extern void lccrt_var_set_einfo( lccrt_v_ptr v, lccrt_eic_t eic, lccrt_eir_t value);
extern lccrt_eir_t lccrt_var_get_einfo( lccrt_v_ptr v, lccrt_eic_t eic);
extern int lccrt_var_is_local( lccrt_v_ptr v);
extern int lccrt_var_is_global( lccrt_v_ptr v);
extern int lccrt_var_is_const( lccrt_var_ptr var);
extern int lccrt_var_is_constarg( lccrt_v_ptr v);
extern int lccrt_var_is_constarg_hex( lccrt_v_ptr v);
extern int lccrt_var_is_constarg_int( lccrt_v_ptr v);
extern int lccrt_var_is_constarg_addr_var( lccrt_v_ptr v);
extern int lccrt_var_is_constarg_addr_func( lccrt_v_ptr v);
extern lccrt_vi_ptr lccrt_varinit_new_zero( lccrt_t_ptr type);
extern lccrt_vi_ptr lccrt_varinit_new_scalar( lccrt_t_ptr type, uint64_t value);
extern lccrt_vi_ptr lccrt_varinit_new_str( lccrt_t_ptr type, uint64_t value_len,
const char *value);
extern lccrt_vi_ptr lccrt_varinit_new_array( lccrt_t_ptr type, uint64_t num_init_elems,
lccrt_vi_ptr *init_data);
extern lccrt_vi_ptr lccrt_varinit_new_addr_var( lccrt_v_ptr var, uint64_t shift);
extern lccrt_vi_ptr lccrt_varinit_new_addr_func( lccrt_f_ptr func, uint64_t shift);
extern lccrt_t_ptr lccrt_varinit_get_type( lccrt_vi_ptr vi);
extern lccrt_varinit_inittype_t lccrt_varinit_get_inittype( lccrt_vi_ptr vi);
extern uint64_t lccrt_varinit_get_num_elems( lccrt_vi_ptr vi);
extern uint64_t lccrt_varinit_get_hex64( lccrt_vi_ptr vi);
extern uint64_t lccrt_varinit_get_zero_or_hex64( lccrt_vi_ptr vi);
extern const char *lccrt_varinit_get_str( lccrt_vi_ptr vi);
extern lccrt_vi_ptr lccrt_varinit_get_elem( lccrt_vi_ptr vi, uint64_t elem_num);
extern lccrt_v_ptr lccrt_varinit_get_addr_var( lccrt_vi_ptr vi);
extern lccrt_f_ptr lccrt_varinit_get_addr_func( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_hex( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_zero( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_zero_or_hex( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_array( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_str( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_addr_var( lccrt_vi_ptr vi);
extern int lccrt_varinit_is_addr_func( lccrt_vi_ptr vi);
extern lccrt_oi_ptr lccrt_oper_iterator_new( lccrt_ctx_ptr ctx);
extern lccrt_oi_ptr lccrt_oper_iterator_delete( lccrt_oi_ptr iter);
extern lccrt_oi_ptr lccrt_oper_iterator_set( lccrt_oi_ptr iter, lccrt_o_ptr oper);
extern lccrt_oi_ptr lccrt_oper_iterator_set_prev( lccrt_oi_ptr iter, lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_iterator_get_prev( lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_iterator_get_next( lccrt_oi_ptr iter);
extern lccrt_v_ptr lccrt_oper_iterator_get_res( lccrt_oper_ptr iter);
#define lccrt_oper_iterator_get_next_res( i) \
( \
lccrt_oper_iterator_get_res( lccrt_oper_iterator_get_next( i)) \
)
extern lccrt_o_ptr lccrt_oper_iterator_shift( lccrt_oi_ptr i);
extern lccrt_oper_name_t lccrt_oper_get_name( lccrt_o_ptr oper);
extern lccrt_t_ptr lccrt_oper_get_type( lccrt_o_ptr oper);
extern int lccrt_oper_get_num_args( lccrt_o_ptr oper);
extern int lccrt_oper_get_num_sysargs( lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_get_arg_oper( lccrt_o_ptr oper, int arg_num);
extern lccrt_v_ptr lccrt_oper_get_arg_var( lccrt_o_ptr oper, int arg_num);
extern void lccrt_oper_set_arg_var( lccrt_o_ptr oper, int arg_num, lccrt_v_ptr arg);
extern void lccrt_oper_set_arg_oper( lccrt_o_ptr oper, int arg_num, lccrt_o_ptr arg);
extern lccrt_o_ptr lccrt_oper_get_prev( lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_get_next( lccrt_o_ptr oper);
extern lccrt_v_ptr lccrt_oper_get_res( lccrt_o_ptr oper);
extern void lccrt_oper_set_res( lccrt_o_ptr oper, lccrt_v_ptr res);
extern int lccrt_oper_is_atomic( lccrt_o_ptr oper);
extern int lccrt_oper_is_volatile( lccrt_o_ptr oper);
extern int lccrt_oper_is_cleanup( lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_invoke_get_normal( lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_invoke_get_unwind( lccrt_o_ptr oper);
extern void lccrt_oper_invoke_set_normal( lccrt_o_ptr oper, lccrt_o_ptr normal);
extern void lccrt_oper_invoke_set_unwind( lccrt_o_ptr oper, lccrt_o_ptr unwind);
extern int lccrt_oper_name_is_arg_var( lccrt_oper_name_t name, int arg_num);
extern int lccrt_oper_name_is_arg_oper( lccrt_oper_name_t name, int arg_num);
extern lccrt_o_ptr lccrt_oper_new( lccrt_f_ptr f, int oper_name, lccrt_t_ptr type,
int num_args, lccrt_arg_t *args, int num_sysargs,
lccrt_v_ptr res, lccrt_oi_ptr i);
extern int lccrt_oper_print( lccrt_o_ptr oper, int is_ln);
extern int lccrt_oper_snprint( lccrt_o_ptr op, int is_ln, char *s, int l);
extern void lccrt_oper_set_volatile( lccrt_oper_ptr oper, int value);
extern void lccrt_oper_set_atomic( lccrt_oper_ptr oper, int value);
extern void lccrt_oper_set_cleanup( lccrt_oper_ptr oper, int value);
extern int lccrt_oper_is_branch( lccrt_oper_ptr o);
extern int lccrt_oper_is_switch( lccrt_oper_ptr o);
extern int lccrt_oper_is_call( lccrt_oper_ptr o);
extern int lccrt_oper_is_invoke( lccrt_oper_ptr o);
extern int lccrt_oper_is_landingpad( lccrt_oper_ptr o);
extern int lccrt_oper_is_label( lccrt_oper_ptr o);
extern int lccrt_oper_is_ret( lccrt_oper_ptr o);
extern int lccrt_oper_is_retval( lccrt_oper_ptr o);
extern void lccrt_oper_delete( lccrt_o_ptr o);
extern lccrt_f_ptr lccrt_oper_get_function( lccrt_o_ptr oper);
extern lccrt_t_ptr lccrt_oper_get_res_type( lccrt_o_ptr oper);
extern const char *lccrt_oper_get_label( lccrt_o_ptr oper);
extern lccrt_o_ptr lccrt_oper_new_label( lccrt_f_ptr func, const char *name,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_branch( lccrt_f_ptr func, lccrt_oper_ptr dst,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_branchif( lccrt_f_ptr func, lccrt_v_ptr predct,
lccrt_o_ptr dst_true, lccrt_o_ptr dst_false,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_switch( lccrt_f_ptr f, lccrt_v_ptr pa, int num_alts,
lccrt_switch_alts_t *alts, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_va_arg( lccrt_f_ptr f, lccrt_v_ptr pa, lccrt_t_ptr pt,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_alloca( lccrt_f_ptr f, lccrt_v_ptr pa,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_cmp( lccrt_f_ptr f, lccrt_varinit_ptr pn,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pres, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_load( lccrt_f_ptr f, lccrt_v_ptr pa, lccrt_v_ptr pres,
lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_store( lccrt_f_ptr f, lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_sext( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_zext( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_trunc( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_fptofp( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_fptoui( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_fptosi( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_uitofp( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_sitofp( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_bitcast( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_t_ptr t,
lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_select( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_v_ptr b,
lccrt_v_ptr c, lccrt_v_ptr r, lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_move( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_v_ptr r,
lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_varptr( lccrt_f_ptr f, lccrt_v_ptr a, lccrt_v_ptr r,
lccrt_oi_ptr i);
extern lccrt_o_ptr lccrt_oper_new_add( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_sub( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_mul( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_udiv( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_sdiv( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_umod( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_smod( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_shl( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_shr( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_sar( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_and( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_or( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_xor( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fneg( lccrt_f_ptr f,
lccrt_v_ptr pa,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fadd( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fsub( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fmul( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fdiv( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_fmod( lccrt_f_ptr f,
lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pr, lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_return( lccrt_f_ptr f, lccrt_v_ptr pa,
lccrt_oi_ptr pi);
extern lccrt_o_ptr lccrt_oper_new_call( lccrt_f_ptr func, lccrt_t_ptr sig, int num_args,
lccrt_v_ptr *args, int num_sysargs,
lccrt_v_ptr *sysargs, lccrt_v_ptr res,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_invoke( lccrt_f_ptr func, lccrt_t_ptr sig, int num_args,
lccrt_v_ptr *args, int num_sysargs,
lccrt_v_ptr *sysargs, lccrt_o_ptr normal,
lccrt_o_ptr unwind, lccrt_v_ptr res,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_landingpad( lccrt_f_ptr func, int num_args,
lccrt_v_ptr *args, lccrt_t_ptr t,
lccrt_v_ptr res, lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_elemptr( lccrt_f_ptr func,
int num_args, lccrt_v_ptr *args, lccrt_v_ptr res,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_elemread( lccrt_f_ptr func, int num_args,
lccrt_v_ptr *args, lccrt_v_ptr res,
lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_elemwrite( lccrt_f_ptr func, int num_args,
lccrt_v_ptr *args, lccrt_oi_ptr iter);
extern lccrt_o_ptr lccrt_oper_new_shuffle( lccrt_f_ptr func, lccrt_v_ptr pa, lccrt_v_ptr pb,
lccrt_v_ptr pm, lccrt_v_ptr pr, lccrt_oi_ptr iter);
extern void lccrt_oper_set_einfo( lccrt_o_ptr oper, lccrt_eic_t eic, lccrt_eir_t value);
extern lccrt_eir_t lccrt_oper_get_einfo( lccrt_o_ptr oper, lccrt_eic_t eic);
extern lccrt_fs_ptr lccrt_fs_new_file( lccrt_ctx_ptr ctx, FILE *file);
extern lccrt_fs_ptr lccrt_fs_open_file( lccrt_ctx_ptr ctx, const char *name, int is_load);
extern lccrt_fs_ptr lccrt_fs_new_buffer( lccrt_ctx_ptr ctx, char *buff, uint64_t buff_size);
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
/**
* @}
*/
#endif /* LCCRT_H */