11 #define ACCESS_CMP(x, y) ((st64)((ut64)(x) - (ut64)((RzAnalysisVarAccess *)y)->offset))
15 case 1:
return "int8_t";
16 case 2:
return "int16_t";
17 case 4:
return "int32_t";
18 case 8:
return "int64_t";
34 char *error_msg =
NULL;
36 if (!result || error_msg) {
37 RZ_LOG_ERROR(
"Invalid var type: %s\n%s", typestr, error_msg);
51 rz_list_foreach (var_list, it, var) {
68 return a->kind ==
b->kind &&
a->isarg ==
b->isarg;
114 if (existing && (existing->
kind != kind || existing->
delta !=
delta)) {
134 RZ_LOG_ERROR(
"Register wasn't found at the given delta\n");
174 if (resolve_overlaps) {
211 if (var->
kind == kind) {
287 if (!inst_accesses) {
305 if (index < var->accesses.len) {
317 if (!inst_accesses) {
335 if (index < var->accesses.len) {
356 RZ_LOG_WARN(
"variable or arg with name `%s` already exist\n", new_name);
360 char *nn =
strdup(new_name);
384 for (
i = 0;
i < arg_max;
i++) {
386 if (reg_arg && !strcmp(
reg->name, reg_arg)) {
406 rz_list_foreach (fcns, it, fcn) {
429 if (used_var == var) {
449 if (index < var->accesses.len) {
464 if (!inst_accesses) {
466 if (!inst_accesses) {
500 if (!inst_accesses) {
533 bool low =
false, high =
false;
537 for (
i = 0;
i <
n;
i += 1) {
539 switch (constr->
cond) {
565 if (low && high &&
i !=
n - 1) {
608 ut64 member_offset = 0;
612 field->name = new_name;
613 field->delta = av->
delta + member_offset;
626 if (ri && (ri->
size == 32) && (analysis->
bits == 64)) {
639 if (!strcmp(varname, var->
name)) {
640 if (var->
kind != kind) {
677 if (
op->src[
i] &&
op->src[
i]->reg &&
op->src[
i]->reg->name) {
678 if (!strcmp(
reg,
op->src[
i]->reg->name)) {
680 if ((
delta > 0 && *sign ==
'+') || (
delta < 0 && *sign ==
'-')) {
693 esil_buf =
strdup(op_esil);
697 char *ptr_end = strstr(esil_buf,
sdb_fmt(
",%s,%s,",
reg, sign));
704 while ((
addr[0] !=
'0' ||
addr[1] !=
'x') &&
addr >= esil_buf + 1 && *
addr !=
',') {
707 if (strncmp(
addr,
"0x", 2)) {
709 if (!
op->stackop &&
op->dst) {
712 const char *rn =
op->dst->reg ?
op->dst->reg->name :
NULL;
713 if (rn && ((bp && !strcmp(bp, rn)) || (
sp && !strcmp(
sp, rn)))) {
714 RZ_LOG_DEBUG(
"Analysis didn't fill op->stackop for instruction that alters stack at 0x%" PFMT64x ".\n",
op->addr);
723 if (ptr &&
op->src[0] && ptr ==
op->src[0]->imm) {
739 if (!
op->src[0] || !
op->dst) {
749 frame_off = ptr - fcn->
stack;
751 frame_off = ptr - fcn->
bp_off;
758 char *varname =
NULL;
762 bool stack_rev = place ? !strcmp(place,
"stack_rev") :
false;
769 from = cnt ? cnt - 1 : cnt;
776 for (
i =
from; stack_rev ?
i >=
to :
i <
to; stack_rev ?
i-- :
i++) {
781 if (sum_sz == frame_off) {
787 sum_sz += bit_sz ? bit_sz / 8 :
bytes;
855 #define STR_EQUAL(s1, s2) (s1 && s2 && !strcmp(s1, s2))
916 RZ_LOG_DEBUG(
"No calling convention for function '%s' to extract register arguments\n", fcn->
name);
932 int callee_rargs = 0;
943 if (cc && !strcmp(fcn->
cc, cc)) {
948 }
else if (!
f->is_variadic && !strcmp(fcn->
cc,
f->cc)) {
953 callee_rargs = callee_rargs
959 for (
i = 0;
i < callee_rargs;
i++) {
963 const char *vname =
NULL;
976 if (!vname && callee) {
985 rz_list_foreach (callee_rargs_l, it,
arg) {
1017 if (reg_set[
i] != 2 && is_used_like_an_arg) {
1023 if (reg_set[
i] == 1 && is_used_like_an_arg) {
1025 }
else if (reg_set[
i] != 2 && is_used_like_an_arg) {
1026 const char *vname =
NULL;
1029 if ((
i < argc) &&
fname) {
1059 if (reg_set[
i] != 2 && is_used_like_an_arg) {
1061 char *vname =
strdup(
"self");
1083 if (reg_set[
i] == 0 &&
STR_EQUAL(opdreg, errorreg)) {
1085 char *vname =
strdup(
"error");
1128 if (var->
kind == kind) {
1177 if (var->
kind != kind) {
1193 field->delta = var->
delta;
1201 return (
a &&
b) ? (
a->delta >
b->delta) - (
a->delta <
b->delta) : 0;
1206 return (
a &&
b) ? (
a->argnum >
b->argnum) - (
a->argnum <
b->argnum) : 0;
1216 rz_list_foreach (cache->rvars, it, var) {
1234 RzAnalysisFcnVarsCache *cache =
NULL;
1237 fcn_name = fcn->name;
1265 if (fcn_name_post) {
1275 for (
i = 0;
i < argc;
i++) {
1283 if (
i == argc - 1) {
1294 cache = reuse_cache;
1296 cache =
RZ_NEW0(RzAnalysisFcnVarsCache);
1298 type_fcn_name =
NULL;
1305 bool arg_bp =
false;
1310 rz_list_foreach (cache->rvars,
iter, var) {
1312 if (!strcmp(var->
name,
"self") || !strcmp(var->
name,
"error")) {
1317 tmp_len = strlen(vartype);
1319 tmp_len && vartype[tmp_len - 1] ==
'*' ?
"" :
" ",
1324 rz_list_foreach (cache->bvars,
iter, var) {
1326 if (!rz_list_empty(cache->rvars) &&
comma) {
1332 tmp_len = strlen(vartype);
1334 tmp_len && vartype[tmp_len - 1] ==
'*' ?
"" :
" ",
1341 const char *maybe_comma =
", ";
1342 rz_list_foreach (cache->svars,
iter, var) {
1344 if (!*maybe_comma || ((arg_bp || !rz_list_empty(cache->rvars)) &&
comma)) {
1349 tmp_len = strlen(vartype);
1356 tmp_len && vartype[tmp_len - 1] ==
'*' ?
"" :
" ",
1357 var->
name, maybe_comma);
1396 RzAnalysisFcnVarsCache cache;
1401 RzList *all_vars = cache.rvars;
1408 rz_list_foreach (all_vars,
iter, var) {
RZ_API RZ_OWN char * rz_analysis_function_name_guess(RzTypeDB *typedb, RZ_NONNULL char *name)
Checks if varions function name variations present in the database.
RZ_API bool rz_analysis_function_is_autonamed(RZ_NONNULL char *name)
Checks if the function name was generated by Rizin automatically.
RZ_API RzAnalysisFunction * rz_analysis_get_function_at(RzAnalysis *analysis, ut64 addr)
RZ_API RzList * rz_analysis_get_functions_in(RzAnalysis *analysis, ut64 addr)
static const char * arg(RzAnalysis *a, csh *handle, cs_insn *insn, char *buf, int n)
RZ_API RZ_BORROW RzBaseType * rz_type_db_get_base_type(const RzTypeDB *typedb, RZ_NONNULL const char *name)
Searches for the RzBaseType in the types database given the name.
RZ_API RZ_OWN RzType * rz_type_parse_string_single(RzTypeParser *parser, const char *code, char **error_msg)
Parses the single C type definition.
RZ_API const char * rz_analysis_cc_func(RzAnalysis *analysis, const char *func_name)
RZ_API const char * rz_analysis_cc_arg(RzAnalysis *analysis, const char *convention, int n)
RZ_API const char * rz_analysis_cc_self(RzAnalysis *analysis, const char *convention)
RZ_API int rz_analysis_cc_max_arg(RzAnalysis *analysis, const char *cc)
RZ_API const char * rz_analysis_cc_error(RzAnalysis *analysis, const char *convention)
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
RZ_API RzFlagItem * rz_flag_get_by_spaces(RzFlag *f, ut64 off,...)
RZ_API char * sdb_fmt(const char *fmt,...)
RZ_API bool rz_type_is_strictly_atomic(const RzTypeDB *typedb, RZ_NONNULL const RzType *type)
Checks if the RzType is strictly atomic.
RZ_API void Ht_() free(HtName_(Ht) *ht)
static void list(RzEgg *egg)
RZ_API RZ_OWN RzList * rz_list_newf(RzListFree f)
Returns a new initialized RzList pointer and sets the free method.
RZ_API RZ_OWN RzList * rz_list_new(void)
Returns a new initialized RzList pointer (free method is not initialized)
RZ_API void rz_list_sort(RZ_NONNULL RzList *list, RZ_NONNULL RzListComparator cmp)
Sorts via merge sort or via insertion sort a list.
RZ_API bool rz_list_join(RZ_NONNULL RzList *list1, RZ_NONNULL RzList *list2)
Joins 2 list into one (list2 pointer needs to be freed by the user)
RZ_API RZ_BORROW RzListIter * rz_list_push(RZ_NONNULL RzList *list, void *item)
Alias for rz_list_append.
RZ_API RZ_BORROW RzListIter * rz_list_append(RZ_NONNULL RzList *list, void *data)
Appends at the end of the list a new element.
RZ_API void rz_list_free(RZ_NONNULL RzList *list)
Empties the list and frees the list pointer.
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
RZ_API ut64 rz_reg_getv(RzReg *reg, const char *name)
RZ_API RzRegItem * rz_reg_get(RzReg *reg, const char *name, int type)
RZ_API const char * rz_reg_get_name(RzReg *reg, int role)
RZ_API RzRegItem * rz_reg_index_get(RzReg *reg, int idx)
RZ_API const char * rz_reg_32_to_64(RzReg *reg, const char *rreg32)
RZ_DEPRECATE struct rz_analysis_var_field_t RzAnalysisVarField
@ RZ_ANALYSIS_OP_DIR_WRITE
@ RZ_ANALYSIS_VAR_ACCESS_TYPE_READ
@ RZ_ANALYSIS_VAR_ACCESS_TYPE_WRITE
@ RZ_ANALYSIS_VAR_KIND_REG
@ RZ_ANALYSIS_VAR_KIND_SPV
@ RZ_ANALYSIS_VAR_KIND_BPV
@ RZ_ANALYSIS_OP_TYPE_SUB
@ RZ_ANALYSIS_OP_TYPE_LOAD
@ RZ_ANALYSIS_OP_TYPE_MUL
@ RZ_ANALYSIS_OP_TYPE_ROL
@ RZ_ANALYSIS_OP_TYPE_AND
@ RZ_ANALYSIS_OP_TYPE_SAL
@ RZ_ANALYSIS_OP_TYPE_NOR
@ RZ_ANALYSIS_OP_TYPE_ROR
@ RZ_ANALYSIS_OP_TYPE_SAR
@ RZ_ANALYSIS_OP_TYPE_CMOV
@ RZ_ANALYSIS_OP_TYPE_CALL
@ RZ_ANALYSIS_OP_TYPE_ADD
@ RZ_ANALYSIS_OP_TYPE_PUSH
@ RZ_ANALYSIS_OP_TYPE_SHR
@ RZ_ANALYSIS_OP_TYPE_POP
@ RZ_ANALYSIS_OP_TYPE_DIV
@ RZ_ANALYSIS_OP_TYPE_CAST
@ RZ_ANALYSIS_OP_TYPE_MOV
@ RZ_ANALYSIS_OP_TYPE_SHL
@ RZ_ANALYSIS_OP_TYPE_UCALL
@ RZ_ANALYSIS_OP_TYPE_NOT
@ RZ_ANALYSIS_OP_TYPE_RET
@ RZ_ANALYSIS_OP_TYPE_LEA
@ RZ_ANALYSIS_OP_TYPE_XOR
#define rz_return_if_fail(expr)
#define rz_return_val_if_fail(expr, val)
#define RZ_FLAGS_FS_IMPORTS
void(* RzListFree)(void *ptr)
int(* RzListComparator)(const void *value, const void *list_data)
#define RZ_LOG_WARN(fmtstr,...)
#define RZ_LOG_DEBUG(fmtstr,...)
#define RZ_LOG_ERROR(fmtstr,...)
RZ_API ut64 rz_num_get(RzNum *num, const char *str)
RZ_API char * rz_str_newf(const char *fmt,...) RZ_PRINTF_CHECK(1
RZ_API bool rz_str_isnumber(const char *str)
RZ_API const char * rz_str_constpool_get(RzStrConstPool *pool, const char *str)
RZ_API RZ_OWN char * rz_strbuf_drain(RzStrBuf *sb)
RZ_API RZ_OWN char * rz_strbuf_drain_nofree(RzStrBuf *sb)
RZ_API char * rz_strbuf_get(RzStrBuf *sb)
RZ_API bool rz_strbuf_slice(RZ_NONNULL RzStrBuf *sb, size_t from, size_t len)
Cuts the current string into a substring.
RZ_API bool rz_strbuf_append(RzStrBuf *sb, const char *s)
RZ_API RzStrBuf * rz_strbuf_new(const char *s)
RZ_API bool rz_strbuf_appendf(RzStrBuf *sb, const char *fmt,...) RZ_PRINTF_CHECK(2
RZ_API void rz_strbuf_init(RzStrBuf *sb)
RZ_API int rz_strbuf_length(RzStrBuf *sb)
@ RZ_BASE_TYPE_KIND_STRUCT
@ RZ_TYPE_COND_LE
Less or equal.
@ RZ_TYPE_COND_GE
Greater or equal.
@ RZ_TYPE_COND_GT
Greater than.
@ RZ_TYPE_COND_LT
Less than.
@ RZ_TYPE_KIND_IDENTIFIER
#define rz_vector_lower_bound(vec, x, i, cmp)
static void * rz_vector_index_ptr(RzVector *vec, size_t index)
RZ_API void rz_pvector_remove_data(RzPVector *vec, void *x)
RZ_API void rz_vector_remove_at(RzVector *vec, size_t index, void *into)
static size_t rz_pvector_len(const RzPVector *vec)
RZ_API void * rz_vector_push(RzVector *vec, void *x)
RZ_API RzPVector * rz_pvector_new(RzPVectorFree free)
static bool rz_pvector_empty(RzPVector *vec)
RZ_API void * rz_pvector_remove_at(RzPVector *vec, size_t index)
#define rz_vector_foreach(vec, it)
static void ** rz_pvector_push(RzPVector *vec, void *x)
RZ_API void ** rz_pvector_contains(RzPVector *vec, void *x)
RZ_API void rz_vector_fini(RzVector *vec)
RZ_API void rz_pvector_free(RzPVector *vec)
RZ_API RzVector * rz_vector_clone(RzVector *vec)
RZ_API void rz_vector_clear(RzVector *vec)
RZ_API void rz_vector_init(RzVector *vec, size_t elem_size, RzVectorFree free, void *free_user)
static bool rz_vector_empty(const RzVector *vec)
RZ_API void * rz_vector_insert(RzVector *vec, size_t index, void *x)
RZ_API void rz_pvector_clear(RzPVector *vec)
static void * rz_pvector_at(const RzPVector *vec, size_t index)
#define rz_pvector_foreach(vec, it)
static struct sockaddr static addrlen static backlog const void static flags void struct sockaddr from
static struct sockaddr static addrlen static backlog const void static flags void struct sockaddr socklen_t static fromlen const void const struct sockaddr to
struct rz_analysis_t * analysis
struct rz_analysis_plugin_t * cur
RzBaseTypeStruct struct_data
int size
in bits> 8,16,32,64 ... 128/256
int index
Index in register profile.
type constrained by the type conditions
struct rz_type_t::@292::@294 identifier
RZ_API bool rz_type_callable_arg_add(RZ_NONNULL RzCallable *callable, RZ_OWN RZ_NONNULL RzCallableArg *arg)
Adds a new argument to the RzCallable.
RZ_API int rz_type_func_args_count(RzTypeDB *typedb, RZ_NONNULL const char *name)
Searches for the RzCallable type in types database and returns arguments' count.
RZ_API RZ_BORROW const char * rz_type_func_args_name(RzTypeDB *typedb, RZ_NONNULL const char *name, int i)
Searches for the RzCallable type in types database and returns argument name.
RZ_API RZ_OWN RzCallable * rz_type_func_new(RzTypeDB *typedb, RZ_NONNULL const char *name, RZ_OWN RZ_NULLABLE RzType *type)
Creates a new RzCallable type.
RZ_API RZ_BORROW RzType * rz_type_func_ret(RzTypeDB *typedb, RZ_NONNULL const char *name)
Searches for the RzCallable type in types database and returns return type.
RZ_API bool rz_type_func_exist(RzTypeDB *typedb, RZ_NONNULL const char *name)
Checks if the RzCallable type exists in the database given the name.
RZ_API RZ_BORROW RzType * rz_type_func_args_type(RzTypeDB *typedb, RZ_NONNULL const char *name, int i)
Searches for the RzCallable type in types database and returns argument type.
RZ_API RZ_OWN RzCallableArg * rz_type_callable_arg_new(RzTypeDB *typedb, RZ_NONNULL const char *name, RZ_OWN RZ_NONNULL RzType *type)
Creates a new RzCallableArg given the name and type.
RZ_API bool rz_type_func_save(RzTypeDB *typedb, RZ_NONNULL RzCallable *callable)
Stores RzCallable type in the types database.
RZ_API ut64 rz_type_db_get_bitsize(const RzTypeDB *typedb, RZ_NONNULL RzType *type)
Returns the type size in bits (target dependent)
RZ_API void rz_type_free(RZ_NULLABLE RzType *type)
Frees the RzType.
RZ_API RZ_OWN RzType * rz_type_clone(RZ_BORROW RZ_NONNULL const RzType *type)
Creates an exact clone of the RzType.
RZ_API RZ_OWN char * rz_type_as_string(const RzTypeDB *typedb, RZ_NONNULL const RzType *type)
Returns the type C representation.
static void var_free(RzAnalysisVar *var)
RZ_API RZ_OWN char * rz_analysis_function_autoname_var(RzAnalysisFunction *fcn, char kind, const char *pfx, int ptr)
RZ_API void rz_analysis_var_clear_accesses(RzAnalysisVar *var)
static int var_comparator(const RzAnalysisVar *a, const RzAnalysisVar *b)
static bool var_same_kind(RzAnalysisVar *a, RzAnalysisVar *b)
RZ_API void rz_analysis_extract_rarg(RzAnalysis *analysis, RzAnalysisOp *op, RzAnalysisFunction *fcn, int *reg_set, int *count)
RZ_API void rz_analysis_fcn_vars_cache_fini(RzAnalysisFcnVarsCache *cache)
static bool arch_destroys_dst(const char *arch)
static bool is_reg_in_src(const char *regname, RzAnalysis *analysis, RzAnalysisOp *op)
RZ_API void rz_analysis_var_resolve_overlaps(RzAnalysisVar *var)
RZ_API void rz_analysis_function_delete_unused_vars(RzAnalysisFunction *fcn)
static void extract_arg(RzAnalysis *analysis, RzAnalysisFunction *fcn, RzAnalysisOp *op, const char *reg, const char *sign, char type)
RZ_API RZ_BORROW RzAnalysisVar * rz_analysis_function_get_var(RzAnalysisFunction *fcn, char kind, int delta)
static bool op_affect_dst(RzAnalysisOp *op)
RZ_API void rz_analysis_function_delete_all_vars(RzAnalysisFunction *fcn)
RZ_API int rz_analysis_var_count(RzAnalysis *a, RzAnalysisFunction *fcn, int kind, int type)
RZ_API void rz_analysis_extract_vars(RzAnalysis *analysis, RzAnalysisFunction *fcn, RzAnalysisOp *op)
RZ_API ut64 rz_analysis_var_addr(RzAnalysisVar *var)
RZ_API void rz_analysis_var_set_access(RzAnalysisVar *var, const char *reg, ut64 access_addr, int access_type, st64 stackptr)
RZ_API bool rz_analysis_function_rebase_vars(RzAnalysis *a, RzAnalysisFunction *fcn)
RZ_API RzList * rz_analysis_var_list(RzAnalysis *a, RzAnalysisFunction *fcn, int kind)
static bool is_used_like_arg(const char *regname, const char *opsreg, const char *opdreg, RzAnalysisOp *op, RzAnalysis *analysis)
static int regvar_comparator(const RzAnalysisVar *a, const RzAnalysisVar *b)
RZ_API void rz_analysis_var_remove_access_at(RzAnalysisVar *var, ut64 address)
RZ_API char * rz_analysis_var_get_constraints_readable(RzAnalysisVar *var)
static void var_field_free(RzAnalysisVarField *field)
static RZ_OWN RzType * var_type_clone_or_default_type(RzAnalysis *analysis, RZ_BORROW RZ_NULLABLE const RzType *type, int size)
RZ_API void rz_analysis_function_delete_vars_by_kind(RzAnalysisFunction *fcn, RzAnalysisVarKind kind)
RZ_API RZ_BORROW RzPVector * rz_analysis_function_get_vars_used_at(RzAnalysisFunction *fcn, ut64 op_addr)
static const char * __int_type_from_size(int size)
RZ_API RZ_BORROW RzAnalysisVar * rz_analysis_function_set_var(RzAnalysisFunction *fcn, int delta, char kind, RZ_BORROW RZ_NULLABLE const RzType *type, int size, bool isarg, RZ_NONNULL const char *name)
RZ_DEPRECATE RZ_API RzList * rz_analysis_var_all_list(RzAnalysis *analysis, RzAnalysisFunction *fcn)
RZ_API void rz_analysis_var_add_constraint(RzAnalysisVar *var, RZ_BORROW RzTypeConstraint *constraint)
RZ_API st64 rz_analysis_function_get_var_stackptr_at(RzAnalysisFunction *fcn, st64 delta, ut64 addr)
RZ_API char * rz_analysis_fcn_format_sig(RZ_NONNULL RzAnalysis *analysis, RZ_NONNULL RzAnalysisFunction *fcn, RZ_NULLABLE char *fcn_name, RZ_NULLABLE RzAnalysisFcnVarsCache *reuse_cache, RZ_NULLABLE const char *fcn_name_pre, RZ_NULLABLE const char *fcn_name_post)
RZ_API bool rz_analysis_var_check_name(const char *name)
RZ_API void rz_analysis_fcn_vars_add_types(RzAnalysis *analysis, RZ_NONNULL RzAnalysisFunction *fcn)
Updates the types database for function arguments.
RZ_API int rz_analysis_var_get_argnum(RzAnalysisVar *var)
RZ_API bool rz_analysis_var_rename(RzAnalysisVar *var, const char *new_name, bool verbose)
RZ_API RZ_BORROW RzAnalysisVar * rz_analysis_function_get_var_byname(RzAnalysisFunction *fcn, const char *name)
RZ_API void rz_analysis_var_delete(RzAnalysisVar *var)
RZ_API RzAnalysisVar * rz_analysis_var_get_dst_var(RzAnalysisVar *var)
static bool var_add_structure_fields_to_list(RzAnalysis *a, RzAnalysisVar *av, RzList *list)
RZ_API const char * rz_analysis_function_get_var_reg_at(RzAnalysisFunction *fcn, st64 delta, ut64 addr)
#define STR_EQUAL(s1, s2)
static RzAnalysisVar * get_stack_var(RzAnalysisFunction *fcn, int delta)
static bool var_overlap(RzAnalysisVar *a, RzAnalysisVar *b, ut64 a_size)
static const char * get_regname(RzAnalysis *analysis, RzAnalysisValue *value)
RZ_API RzAnalysisVarAccess * rz_analysis_var_get_access_at(RzAnalysisVar *var, ut64 addr)
RZ_API void rz_analysis_function_delete_var(RzAnalysisFunction *fcn, RzAnalysisVar *var)
RZ_API void rz_analysis_var_set_type(RzAnalysisVar *var, RZ_OWN RzType *type, bool resolve_overlaps)
static RzList * var_generate_list(RzAnalysis *a, RzAnalysisFunction *fcn, int kind)
RZ_API void rz_analysis_fcn_vars_cache_init(RzAnalysis *analysis, RzAnalysisFcnVarsCache *cache, RzAnalysisFunction *fcn)
RZ_DEPRECATE RZ_API RzList * rz_analysis_function_get_var_fields(RzAnalysisFunction *fcn, int kind)
RZ_DEPRECATE RZ_API RzAnalysisVar * rz_analysis_get_used_function_var(RzAnalysis *analysis, ut64 addr)
ut64(WINAPI *w32_GetEnabledXStateFeatures)()
static char * regname(int reg)