Rizin
unix-like reverse engineering framework and cli tools
variable.c File Reference
#include <rz_il/definitions/variable.h>
#include <string.h>
#include <stdlib.h>

Go to the source code of this file.

Functions

RZ_API RZ_OWN RzILVarrz_il_variable_new (RZ_NONNULL const char *name, RzILSortPure sort)
 
RZ_API void rz_il_variable_free (RZ_NULLABLE RzILVar *var)
 
static void var_ht_free (HtPPKv *kv)
 
static void val_ht_free (HtPPKv *kv)
 
RZ_API bool rz_il_var_set_init (RzILVarSet *vs)
 
RZ_API void rz_il_var_set_fini (RzILVarSet *vs)
 
RZ_API void rz_il_var_set_reset (RzILVarSet *vs)
 
RZ_API RZ_BORROW RzILVarrz_il_var_set_create_var (RzILVarSet *vs, const char *name, RzILSortPure sort)
 
RZ_API RZ_OWN RZ_NULLABLE RzILValrz_il_var_set_remove_var (RzILVarSet *vs, const char *name)
 
RZ_API bool rz_il_var_set_bind (RzILVarSet *vs, const char *name, RZ_OWN RzILVal *val)
 
RZ_API RZ_BORROW RzILVarrz_il_var_set_get (RzILVarSet *vs, const char *name)
 
static bool vars_collect_cb (void *user, const void *k, const void *v)
 
RZ_API RZ_OWN RzPVectorrz_il_var_set_get_all (RzILVarSet *vs)
 
RZ_API RZ_BORROW RzILValrz_il_var_set_get_value (RzILVarSet *vs, const char *name)
 
const char * rz_il_var_kind_name (RzILVarKind kind)
 

Function Documentation

◆ rz_il_var_kind_name()

const char* rz_il_var_kind_name ( RzILVarKind  kind)

Get a readable string representation of kind

Definition at line 181 of file variable.c.

181  {
182  switch (kind) {
184  return "global";
186  return "local";
188  return "local pure";
189  default:
190  return "invalid";
191  }
192 }
@ RZ_IL_VAR_KIND_GLOBAL
global var, usually bound to a physical representation like a register.
Definition: variable.h:47
@ RZ_IL_VAR_KIND_LOCAL
local var, defined and assigned by set ops, mutable and useable across effects.
Definition: variable.h:48
@ RZ_IL_VAR_KIND_LOCAL_PURE
local pure var, bound only by let expressions, scope is limited to the let's pure body,...
Definition: variable.h:49

References RZ_IL_VAR_KIND_GLOBAL, RZ_IL_VAR_KIND_LOCAL, and RZ_IL_VAR_KIND_LOCAL_PURE.

Referenced by rz_il_handler_var().

◆ rz_il_var_set_bind()

RZ_API bool rz_il_var_set_bind ( RzILVarSet vs,
const char *  name,
RZ_OWN RzILVal val 
)

Set the contents of the variable called name to val

In order for this to succeed, a variable called name must already exist and the sort of val must match the variable's sort. Checking this is done inside this function, so calling it with invalid args in that sense is fine.

Returns
whether the value was successfully bound

Definition at line 129 of file variable.c.

129  {
130  rz_return_val_if_fail(vs && name && val, NULL);
131  RzILVar *var = ht_pp_find(vs->vars, name, NULL);
132  if (!var || !rz_il_sort_pure_eq(var->sort, rz_il_value_get_sort(val))) {
133  if (!var) {
134  RZ_LOG_ERROR("Attempted to bind value to non-existent variable \"%s\"\n", name);
135  } else {
136  RZ_LOG_ERROR("Attempted to bind mis-sorted value to variable \"%s\"\n", name);
137  }
139  return false;
140  }
141  ht_pp_update(vs->contents, name, val);
142  return true;
143 }
ut16 val
Definition: armass64_const.h:6
#define NULL
Definition: cris-opc.c:27
RZ_API RzILSortPure rz_il_value_get_sort(RZ_NONNULL RzILVal *val)
Definition: value.c:127
RZ_API void rz_il_value_free(RZ_NULLABLE RzILVal *val)
Definition: value.c:107
#define rz_return_val_if_fail(expr, val)
Definition: rz_assert.h:108
#define RZ_LOG_ERROR(fmtstr,...)
Definition: rz_log.h:58
static bool rz_il_sort_pure_eq(RzILSortPure a, RzILSortPure b)
Definition: sort.h:37
Definition: z80asm.h:102
HtPP * vars
Definition: variable.h:32
HtPP * contents
Definition: variable.h:33
Definition of a variable inside the vm.
Definition: variable.h:19
RzILSortPure sort
"type" of the variable
Definition: variable.h:21

References rz_il_var_set_t::contents, NULL, rz_il_sort_pure_eq(), rz_il_value_free(), rz_il_value_get_sort(), RZ_LOG_ERROR, rz_return_val_if_fail, rz_il_var_t::sort, val, and rz_il_var_set_t::vars.

Referenced by rz_il_vm_create_global_var(), rz_il_vm_pop_local_pure_var(), rz_il_vm_push_local_pure_var(), rz_il_vm_set_global_var(), and rz_il_vm_set_local_var().

◆ rz_il_var_set_create_var()

RZ_API RZ_BORROW RzILVar* rz_il_var_set_create_var ( RzILVarSet vs,
const char *  name,
RzILSortPure  sort 
)

Create a new variable of the given name and sort. If a variable of this name already exists, nothing happens.

Definition at line 90 of file variable.c.

90  {
92  if (ht_pp_find(vs->vars, name, NULL)) {
93  return NULL;
94  }
95  RzILVar *var = rz_il_variable_new(name, sort);
96  if (!var) {
97  return NULL;
98  }
99  ht_pp_insert(vs->vars, name, var);
100  return var;
101 }
RZ_API RZ_OWN RzILVar * rz_il_variable_new(RZ_NONNULL const char *name, RzILSortPure sort)
Definition: variable.c:13

References NULL, rz_il_variable_new(), rz_return_val_if_fail, and rz_il_var_set_t::vars.

Referenced by rz_il_vm_create_global_var(), rz_il_vm_pop_local_pure_var(), rz_il_vm_push_local_pure_var(), and rz_il_vm_set_local_var().

◆ rz_il_var_set_fini()

RZ_API void rz_il_var_set_fini ( RzILVarSet vs)

Definition at line 76 of file variable.c.

76  {
77  ht_pp_free(vs->vars);
78  ht_pp_free(vs->contents);
79 }

References rz_il_var_set_t::contents, and rz_il_var_set_t::vars.

Referenced by rz_il_var_set_reset(), and rz_il_vm_fini().

◆ rz_il_var_set_get()

RZ_API RZ_BORROW RzILVar* rz_il_var_set_get ( RzILVarSet vs,
const char *  name 
)

Get the definition of the variable called name

Definition at line 148 of file variable.c.

148  {
149  return ht_pp_find(vs->vars, name, NULL);
150 }

References NULL, and rz_il_var_set_t::vars.

Referenced by rz_il_vm_get_var().

◆ rz_il_var_set_get_all()

RZ_API RZ_OWN RzPVector* rz_il_var_set_get_all ( RzILVarSet vs)

Get a list of all variable definitions in the given set

Definition at line 160 of file variable.c.

160  {
163  if (!r) {
164  return NULL;
165  }
166  ht_pp_foreach(vs->vars, vars_collect_cb, r);
167  return r;
168 }
#define r
Definition: crypto_rc6.c:12
RZ_API RzPVector * rz_pvector_new(RzPVectorFree free)
Definition: vector.c:302
static bool vars_collect_cb(void *user, const void *k, const void *v)
Definition: variable.c:152

References NULL, r, rz_pvector_new(), rz_return_val_if_fail, rz_il_var_set_t::vars, and vars_collect_cb().

Referenced by rz_il_vm_get_all_vars().

◆ rz_il_var_set_get_value()

RZ_API RZ_BORROW RzILVal* rz_il_var_set_get_value ( RzILVarSet vs,
const char *  name 
)

Get the current value of the variable called name

Definition at line 173 of file variable.c.

173  {
175  return ht_pp_find(vs->contents, name, NULL);
176 }

References rz_il_var_set_t::contents, NULL, and rz_return_val_if_fail.

Referenced by rz_il_vm_get_var_value().

◆ rz_il_var_set_init()

RZ_API bool rz_il_var_set_init ( RzILVarSet vs)

Initialize vs as an empty variable set

This makes sure that if a failure occurs, the contents are still zeroed out, so it is safe (but not required) to call rz_il_var_set_fini(), even if the init failed.

Returns
whether the initialization succeeded

Definition at line 60 of file variable.c.

60  {
61  rz_return_val_if_fail(vs, false);
62  memset(vs, 0, sizeof(*vs));
63  vs->vars = ht_pp_new(NULL, var_ht_free, NULL);
64  if (!vs->vars) {
65  return false;
66  }
67  vs->contents = ht_pp_new(NULL, val_ht_free, NULL);
68  if (!vs->contents) {
69  ht_pp_free(vs->vars);
70  vs->vars = NULL;
71  return false;
72  }
73  return true;
74 }
return memset(p, 0, total)
static void val_ht_free(HtPPKv *kv)
Definition: variable.c:47
static void var_ht_free(HtPPKv *kv)
Definition: variable.c:42

References rz_il_var_set_t::contents, memset(), NULL, rz_return_val_if_fail, val_ht_free(), var_ht_free(), and rz_il_var_set_t::vars.

Referenced by rz_il_var_set_reset(), and rz_il_vm_init().

◆ rz_il_var_set_remove_var()

RZ_API RZ_OWN RZ_NULLABLE RzILVal* rz_il_var_set_remove_var ( RzILVarSet vs,
const char *  name 
)

Remove a variable, if it exists

Returns
the variable's variable, to be freed by the caller

Definition at line 107 of file variable.c.

107  {
109  ht_pp_delete(vs->vars, name);
110  HtPPKv *kv = ht_pp_find_kv(vs->contents, name, NULL);
111  if (!kv) {
112  return NULL;
113  }
114  RzILVal *r = kv->value;
115  kv->value = NULL;
116  ht_pp_delete(vs->contents, name);
117  return r;
118 }

References rz_il_var_set_t::contents, NULL, r, rz_return_val_if_fail, and rz_il_var_set_t::vars.

Referenced by rz_il_vm_pop_local_pure_var(), and rz_il_vm_push_local_pure_var().

◆ rz_il_var_set_reset()

RZ_API void rz_il_var_set_reset ( RzILVarSet vs)

Definition at line 81 of file variable.c.

81  {
84 }
RZ_API bool rz_il_var_set_init(RzILVarSet *vs)
Definition: variable.c:60
RZ_API void rz_il_var_set_fini(RzILVarSet *vs)
Definition: variable.c:76

References rz_il_var_set_fini(), and rz_il_var_set_init().

Referenced by rz_il_vm_step().

◆ rz_il_variable_free()

RZ_API void rz_il_variable_free ( RZ_NULLABLE RzILVar var)

Free variable

Parameters
varRzILVar, pointer to RzILVar

Definition at line 32 of file variable.c.

32  {
33  if (!var) {
34  return;
35  }
36  free(var->name);
37  free(var);
38 }
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130

References free().

Referenced by var_ht_free().

◆ rz_il_variable_new()

RZ_API RZ_OWN RzILVar* rz_il_variable_new ( RZ_NONNULL const char *  name,
RzILSortPure  sort 
)

Create a new variable description

Definition at line 13 of file variable.c.

13  {
15  RzILVar *ret = RZ_NEW0(RzILVar);
16  if (!ret) {
17  return NULL;
18  }
19  ret->name = strdup(name);
20  if (!ret->name) {
21  free(ret);
22  return NULL;
23  }
24  ret->sort = sort;
25  return ret;
26 }
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")
#define RZ_NEW0(x)
Definition: rz_types.h:284
char * name
Definition: variable.h:20

References free(), rz_il_var_t::name, NULL, RZ_NEW0, rz_return_val_if_fail, rz_il_var_t::sort, and strdup().

Referenced by rz_il_var_set_create_var().

◆ val_ht_free()

static void val_ht_free ( HtPPKv *  kv)
static

Definition at line 47 of file variable.c.

47  {
48  free(kv->key);
49  rz_il_value_free(kv->value);
50 }

References free(), and rz_il_value_free().

Referenced by rz_il_var_set_init().

◆ var_ht_free()

static void var_ht_free ( HtPPKv *  kv)
static

Definition at line 42 of file variable.c.

42  {
43  free(kv->key);
44  rz_il_variable_free(kv->value);
45 }
RZ_API void rz_il_variable_free(RZ_NULLABLE RzILVar *var)
Definition: variable.c:32

References free(), and rz_il_variable_free().

Referenced by rz_il_var_set_init().

◆ vars_collect_cb()

static bool vars_collect_cb ( void *  user,
const void *  k,
const void *  v 
)
static

Definition at line 152 of file variable.c.

152  {
153  rz_pvector_push(user, (void *)v);
154  return true;
155 }
const char * v
Definition: dsignal.c:12
static void ** rz_pvector_push(RzPVector *vec, void *x)
Definition: rz_vector.h:300

References rz_pvector_push(), and v.

Referenced by rz_il_var_set_get_all().