975 lines
47 KiB
C
975 lines
47 KiB
C
/**
|
||
* 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;
|
||
|
||
#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
|
||
|
||
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);
|
||
|
||
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_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_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 int lccrt_varinit_cmp( lccrt_t_ptr t0, lccrt_vi_ptr vi0, lccrt_t_ptr t1, lccrt_vi_ptr vi1);
|
||
|
||
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);
|
||
|
||
#if defined(__cplusplus)
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* LCCRT_H */
|