Rizin
unix-like reverse engineering framework and cli tools
hint.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2013-2020 pancake <pancake@nopcode.org>
2 // SPDX-License-Identifier: LGPL-3.0-only
3 
4 #include <rz_analysis.h>
5 
6 // Common base-struct for hints which affect an entire range as opposed to only one single address
7 // They are saved in a RBTree per hint type.
8 // Each ranged record in a tree affects every address address greater or equal to its specified address until
9 // the next record or the end of the address space.
14 
16  RzAnalysisRangedHintRecordBase base; // MUST be the first member!
17  char *arch; // NULL => reset to global
19 
21  RzAnalysisRangedHintRecordBase base; // MUST be the first member!
22  int bits; // 0 => reset to global
24 
25 static int ranged_hint_record_cmp(const void *incoming, const RBNode *in_tree, void *user) {
26  ut64 addr = *(const ut64 *)incoming;
27  const RzAnalysisRangedHintRecordBase *in_tree_record = container_of(in_tree, const RzAnalysisRangedHintRecordBase, rb);
28  if (addr < in_tree_record->addr) {
29  return -1;
30  } else if (addr > in_tree_record->addr) {
31  return 1;
32  }
33  return 0;
34 }
35 
36 static void addr_hint_record_fini(void *element, void *user) {
37  (void)user;
39  switch (record->type) {
41  free(record->type_offset);
42  break;
44  free(record->syntax);
45  break;
47  free(record->opcode);
48  break;
50  free(record->esil);
51  break;
52  default:
53  break;
54  }
55 }
56 
57 static void addr_hint_record_ht_free(HtUPKv *kv) {
58  rz_vector_free(kv->value);
59 }
60 
61 static void bits_hint_record_free_rb(RBNode *node, void *user) {
63 }
64 
65 static void arch_hint_record_free_rb(RBNode *node, void *user) {
67  free(record->arch);
68  free(record);
69 }
70 
71 // used in analysis.c, but no API needed
73  a->addr_hints = ht_up_new(NULL, addr_hint_record_ht_free, NULL);
74  a->arch_hints = NULL;
75  a->bits_hints = NULL;
76 }
77 
78 // used in analysis.c, but no API needed
80  ht_up_free(a->addr_hints);
83 }
84 
88 }
89 
90 typedef struct {
91  HtUP *ht;
95 
96 static bool addr_hint_range_delete_cb(void *user, const ut64 key, const void *value) {
97  DeleteRangeCtx *ctx = user;
98  if (key < ctx->addr || key >= ctx->addr + ctx->size) {
99  return true;
100  }
101  ht_up_delete(ctx->ht, key);
102  return true;
103 }
104 
106  if (size <= 1) {
107  // only single address
108  ht_up_delete(a->addr_hints, addr);
111  return;
112  }
113  // ranged delete
114  DeleteRangeCtx ctx = { a->addr_hints, addr, size };
115  ht_up_foreach(a->addr_hints, addr_hint_range_delete_cb, &ctx);
116  while (true) { // arch
118  if (!node) {
119  return;
120  }
122  if (base->addr >= addr + size) {
123  break;
124  }
126  }
127  while (true) { // bits
129  if (!node) {
130  return;
131  }
133  if (base->addr >= addr + size) {
134  break;
135  }
137  }
138 }
139 
141  RzVector *records = ht_up_find(analysis->addr_hints, addr, NULL);
142  if (!records) {
143  return;
144  }
145  size_t i;
146  for (i = 0; i < records->len; i++) {
148  if (record->type == type) {
150  rz_vector_remove_at(records, i, NULL);
151  return;
152  }
153  }
154 }
155 
156 // create or return the existing addr hint record of the given type at addr
158  RzVector *records = ht_up_find(analysis->addr_hints, addr, NULL);
159  if (!records) {
161  if (!records) {
162  return NULL;
163  }
164  ht_up_insert(analysis->addr_hints, addr, records);
165  }
166  void *pos;
167  rz_vector_foreach(records, pos) {
169  if (record->type == type) {
170  return record;
171  }
172  }
174  memset(record, 0, sizeof(*record));
175  record->type = type;
176  return record;
177 }
178 
179 #define SET_HINT(type, setcode) \
180  do { \
181  RzAnalysisAddrHintRecord *r = ensure_addr_hint_record(a, type, addr); \
182  if (!r) { \
183  break; \
184  } \
185  setcode \
186  } while (0)
187 
190  if (node) {
192  }
194  memset(record, 0, sz);
195  if (!record) {
196  return NULL;
197  }
198  record->addr = addr;
200  return record;
201 }
202 
203 RZ_API void rz_analysis_hint_set_offset(RzAnalysis *a, ut64 addr, const char *typeoff) {
205  free(r->type_offset);
206  r->type_offset = strdup(typeoff););
207 }
208 
210  SET_HINT(RZ_ANALYSIS_ADDR_HINT_TYPE_NWORD, r->nword = nword;);
211 }
212 
215 }
216 
219 }
220 
223 }
224 
227 }
228 
230  if (base) {
231  SET_HINT(RZ_ANALYSIS_ADDR_HINT_TYPE_IMMBASE, r->immbase = base;);
232  } else {
234  }
235 }
236 
239 }
240 
243 }
244 
247  free(r->syntax);
248  r->syntax = strdup(syn););
249 }
250 
253  free(r->opcode);
254  r->opcode = strdup(opcode););
255 }
256 
259  free(r->esil);
260  r->esil = strdup(esil););
261 }
262 
265 }
266 
269 }
270 
273 }
274 
277 }
278 
281  if (!record) {
282  return;
283  }
284  free(record->arch);
285  record->arch = arch ? strdup(arch) : NULL;
286 }
287 
290  if (!record) {
291  return;
292  }
293  record->bits = bits;
294  if (a->hint_cbs.on_bits) {
295  a->hint_cbs.on_bits(a, addr, bits, true);
296  }
297 }
298 
301 }
302 
305 }
306 
309 }
310 
313 }
314 
317 }
318 
321 }
322 
325 }
326 
329 }
330 
333 }
334 
337 }
338 
341 }
342 
345 }
346 
349 }
350 
353 }
354 
357 }
358 
361 }
362 
365 }
366 
369 }
370 
372  if (h) {
373  free(h->arch);
374  free(h->esil);
375  free(h->opcode);
376  free(h->syntax);
377  free(h->offset);
378  free(h);
379  }
380 }
381 
384  if (!node) {
385  if (hint_addr) {
386  *hint_addr = UT64_MAX;
387  }
388  return NULL;
389  }
391  if (hint_addr) {
392  *hint_addr = record->base.addr;
393  }
394  return record->arch;
395 }
396 
399  if (!node) {
400  if (hint_addr) {
401  *hint_addr = UT64_MAX;
402  }
403  return 0;
404  }
406  if (hint_addr) {
407  *hint_addr = record->base.addr;
408  }
409  return record->bits;
410 }
411 
412 RZ_API RZ_NULLABLE const RzVector /*<const RzAnalysisAddrHintRecord>*/ *rz_analysis_addr_hints_at(RzAnalysis *analysis, ut64 addr) {
413  return ht_up_find(analysis->addr_hints, addr, NULL);
414 }
415 
416 typedef struct {
417  RzAnalysisAddrHintRecordsCb cb;
418  void *user;
420 
421 static bool addr_hint_foreach_cb(void *user, const ut64 key, const void *value) {
422  AddrHintForeachCtx *ctx = user;
423  return ctx->cb(key, value, ctx->user);
424 }
425 
426 RZ_API void rz_analysis_addr_hints_foreach(RzAnalysis *analysis, RzAnalysisAddrHintRecordsCb cb, void *user) {
427  AddrHintForeachCtx ctx = { cb, user };
428  ht_up_foreach(analysis->addr_hints, addr_hint_foreach_cb, &ctx);
429 }
430 
431 RZ_API void rz_analysis_arch_hints_foreach(RzAnalysis *analysis, RzAnalysisArchHintCb cb, void *user) {
432  RBIter iter;
435  bool cont = cb(record->addr, ((RzAnalysisArchHintRecord *)record)->arch, user);
436  if (!cont) {
437  break;
438  }
439  }
440 }
441 
442 RZ_API void rz_analysis_bits_hints_foreach(RzAnalysis *analysis, RzAnalysisBitsHintCb cb, void *user) {
443  RBIter iter;
446  bool cont = cb(record->addr, ((RzAnalysisBitsHintRecord *)record)->bits, user);
447  if (!cont) {
448  break;
449  }
450  }
451 }
452 
454  switch (record->type) {
456  hint->immbase = record->immbase;
457  break;
459  hint->jump = record->jump;
460  break;
462  hint->fail = record->fail;
463  break;
465  hint->stackframe = record->stackframe;
466  break;
468  hint->ptr = record->ptr;
469  break;
471  hint->nword = record->nword;
472  break;
474  hint->ret = record->retval;
475  break;
477  hint->new_bits = record->newbits;
478  break;
480  hint->size = record->size;
481  break;
483  hint->syntax = record->syntax ? strdup(record->syntax) : NULL;
484  break;
486  hint->type = record->optype;
487  break;
489  hint->opcode = record->opcode ? strdup(record->opcode) : NULL;
490  break;
492  hint->offset = record->type_offset ? strdup(record->type_offset) : NULL;
493  break;
495  hint->esil = record->esil ? strdup(record->esil) : NULL;
496  break;
498  hint->high = true;
499  break;
501  hint->val = record->val;
502  break;
503  }
504 }
505 
508  if (!hint) {
509  return NULL;
510  }
511  hint->addr = addr;
512  hint->jump = UT64_MAX;
513  hint->fail = UT64_MAX;
514  hint->ret = UT64_MAX;
515  hint->val = UT64_MAX;
516  hint->stackframe = UT64_MAX;
517  const RzVector *records = rz_analysis_addr_hints_at(a, addr);
518  if (records) {
520  rz_vector_foreach(records, record) {
521  hint_merge(hint, record);
522  }
523  }
524  const char *arch = rz_analysis_hint_arch_at(a, addr, NULL);
525  hint->arch = arch ? strdup(arch) : NULL;
527  if ((!records || rz_vector_empty(records)) && !hint->arch && !hint->bits) {
528  // no hints found
529  free(hint);
530  return NULL;
531  }
532  return hint;
533 }
lzma_index ** i
Definition: index.h:629
ut16 val
Definition: armass64_const.h:6
int jump(int a, int b)
Definition: bcj_test.c:35
int bits(struct state *s, int need)
Definition: blast.c:72
static int value
Definition: cmd_api.c:93
#define RZ_API
#define NULL
Definition: cris-opc.c:27
#define r
Definition: crypto_rc6.c:12
cs_arch arch
Definition: cstool.c:13
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 static offset struct stat static buf void long static basep static whence static length const void static len key
Definition: sflib.h:118
const char * v
Definition: dsignal.c:12
RZ_API void rz_analysis_hint_set_val(RzAnalysis *a, ut64 addr, ut64 v)
Definition: hint.c:275
struct rz_analysis_arch_hint_record_t RzAnalysisArchHintRecord
RZ_API void rz_analysis_hint_set_nword(RzAnalysis *a, ut64 addr, int nword)
Definition: hint.c:209
static void addr_hint_record_fini(void *element, void *user)
Definition: hint.c:36
RZ_API void rz_analysis_hint_unset_nword(RzAnalysis *a, ut64 addr)
Definition: hint.c:319
static RzAnalysisRangedHintRecordBase * ensure_ranged_hint_record(RBTree *tree, ut64 addr, size_t sz)
Definition: hint.c:188
RZ_API void rz_analysis_hint_set_newbits(RzAnalysis *a, ut64 addr, int bits)
Definition: hint.c:221
RZ_API RZ_NULLABLE const RzVector * rz_analysis_addr_hints_at(RzAnalysis *analysis, ut64 addr)
Definition: hint.c:412
RZ_API RzAnalysisHint * rz_analysis_hint_get(RzAnalysis *a, ut64 addr)
Definition: hint.c:506
RZ_API void rz_analysis_hint_set_high(RzAnalysis *a, ut64 addr)
Definition: hint.c:225
static RzAnalysisAddrHintRecord * ensure_addr_hint_record(RzAnalysis *analysis, RzAnalysisAddrHintType type, ut64 addr)
Definition: hint.c:157
RZ_API void rz_analysis_hint_clear(RzAnalysis *a)
Definition: hint.c:85
static bool addr_hint_foreach_cb(void *user, const ut64 key, const void *value)
Definition: hint.c:421
RZ_API void rz_analysis_hint_unset_stackframe(RzAnalysis *a, ut64 addr)
Definition: hint.c:359
RZ_API void rz_analysis_hint_unset_newbits(RzAnalysis *a, ut64 addr)
Definition: hint.c:347
void rz_analysis_hint_storage_fini(RzAnalysis *a)
Definition: hint.c:79
RZ_API void rz_analysis_hint_unset_type(RzAnalysis *a, ut64 addr)
Definition: hint.c:355
RZ_API void rz_analysis_addr_hints_foreach(RzAnalysis *analysis, RzAnalysisAddrHintRecordsCb cb, void *user)
Definition: hint.c:426
static void hint_merge(RzAnalysisHint *hint, RzAnalysisAddrHintRecord *record)
Definition: hint.c:453
RZ_API void rz_analysis_hint_set_stackframe(RzAnalysis *a, ut64 addr, ut64 size)
Definition: hint.c:271
RZ_API void rz_analysis_hint_unset_fail(RzAnalysis *a, ut64 addr)
Definition: hint.c:343
RZ_API void rz_analysis_hint_set_ret(RzAnalysis *a, ut64 addr, ut64 val)
Definition: hint.c:241
RZ_API void rz_analysis_hint_unset_offset(RzAnalysis *a, ut64 addr)
Definition: hint.c:335
RZ_API void rz_analysis_hint_unset_size(RzAnalysis *a, ut64 addr)
Definition: hint.c:299
RZ_API void rz_analysis_hint_unset_syntax(RzAnalysis *a, ut64 addr)
Definition: hint.c:323
static void arch_hint_record_free_rb(RBNode *node, void *user)
Definition: hint.c:65
RZ_API void rz_analysis_hint_unset_jump(RzAnalysis *a, ut64 addr)
Definition: hint.c:339
RZ_API void rz_analysis_hint_set_jump(RzAnalysis *a, ut64 addr, ut64 jump)
Definition: hint.c:213
RZ_API void rz_analysis_hint_unset_arch(RzAnalysis *a, ut64 addr)
Definition: hint.c:363
RZ_API void rz_analysis_hint_set_opcode(RzAnalysis *a, ut64 addr, const char *opcode)
Definition: hint.c:251
RZ_API void rz_analysis_arch_hints_foreach(RzAnalysis *analysis, RzAnalysisArchHintCb cb, void *user)
Definition: hint.c:431
static void unset_addr_hint_record(RzAnalysis *analysis, RzAnalysisAddrHintType type, ut64 addr)
Definition: hint.c:140
RZ_API void rz_analysis_hint_set_bits(RzAnalysis *a, ut64 addr, int bits)
Definition: hint.c:288
RZ_API void rz_analysis_hint_free(RzAnalysisHint *h)
Definition: hint.c:371
RZ_API void rz_analysis_hint_set_syntax(RzAnalysis *a, ut64 addr, const char *syn)
Definition: hint.c:245
RZ_API int rz_analysis_hint_bits_at(RzAnalysis *analysis, ut64 addr, RZ_NULLABLE ut64 *hint_addr)
Definition: hint.c:397
struct rz_analysis_bits_hint_record_t RzAnalysisBitsHintRecord
RZ_API void rz_analysis_hint_del(RzAnalysis *a, ut64 addr, ut64 size)
Definition: hint.c:105
RZ_API RZ_NULLABLE RZ_BORROW const char * rz_analysis_hint_arch_at(RzAnalysis *analysis, ut64 addr, RZ_NULLABLE ut64 *hint_addr)
Definition: hint.c:382
RZ_API void rz_analysis_bits_hints_foreach(RzAnalysis *analysis, RzAnalysisBitsHintCb cb, void *user)
Definition: hint.c:442
static void addr_hint_record_ht_free(HtUPKv *kv)
Definition: hint.c:57
RZ_API void rz_analysis_hint_set_fail(RzAnalysis *a, ut64 addr, ut64 fail)
Definition: hint.c:217
RZ_API void rz_analysis_hint_unset_opcode(RzAnalysis *a, ut64 addr)
Definition: hint.c:307
RZ_API void rz_analysis_hint_unset_esil(RzAnalysis *a, ut64 addr)
Definition: hint.c:303
void rz_analysis_hint_storage_init(RzAnalysis *a)
Definition: hint.c:72
static void bits_hint_record_free_rb(RBNode *node, void *user)
Definition: hint.c:61
RZ_API void rz_analysis_hint_set_esil(RzAnalysis *a, ut64 addr, const char *esil)
Definition: hint.c:257
RZ_API void rz_analysis_hint_unset_immbase(RzAnalysis *a, ut64 addr)
Definition: hint.c:315
static int ranged_hint_record_cmp(const void *incoming, const RBNode *in_tree, void *user)
Definition: hint.c:25
RZ_API void rz_analysis_hint_unset_bits(RzAnalysis *a, ut64 addr)
Definition: hint.c:367
RZ_API void rz_analysis_hint_unset_ret(RzAnalysis *a, ut64 addr)
Definition: hint.c:331
RZ_API void rz_analysis_hint_unset_high(RzAnalysis *a, ut64 addr)
Definition: hint.c:311
RZ_API void rz_analysis_hint_set_arch(RzAnalysis *a, ut64 addr, RZ_NULLABLE const char *arch)
Definition: hint.c:279
RZ_API void rz_analysis_hint_set_offset(RzAnalysis *a, ut64 addr, const char *typeoff)
Definition: hint.c:203
RZ_API void rz_analysis_hint_set_immbase(RzAnalysis *a, ut64 addr, int base)
Definition: hint.c:229
RZ_API void rz_analysis_hint_set_type(RzAnalysis *a, ut64 addr, int type)
Definition: hint.c:263
RZ_API void rz_analysis_hint_unset_val(RzAnalysis *a, ut64 addr)
Definition: hint.c:351
RZ_API void rz_analysis_hint_unset_pointer(RzAnalysis *a, ut64 addr)
Definition: hint.c:327
RZ_API void rz_analysis_hint_set_pointer(RzAnalysis *a, ut64 addr, ut64 ptr)
Definition: hint.c:237
#define SET_HINT(type, setcode)
Definition: hint.c:179
static bool addr_hint_range_delete_cb(void *user, const ut64 key, const void *value)
Definition: hint.c:96
RZ_API void rz_analysis_hint_set_size(RzAnalysis *a, ut64 addr, ut64 size)
Definition: hint.c:267
struct rz_analysis_ranged_hint_record_base_t RzAnalysisRangedHintRecordBase
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
voidpf void uLong size
Definition: ioapi.h:138
return memset(p, 0, total)
void * malloc(size_t size)
Definition: malloc.c:123
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")
int type
Definition: mipsasm.c:17
@ RZ_ANALYSIS_ADDR_HINT_TYPE_SYNTAX
Definition: rz_analysis.h:639
@ RZ_ANALYSIS_ADDR_HINT_TYPE_PTR
Definition: rz_analysis.h:634
@ RZ_ANALYSIS_ADDR_HINT_TYPE_SIZE
Definition: rz_analysis.h:638
@ RZ_ANALYSIS_ADDR_HINT_TYPE_STACKFRAME
Definition: rz_analysis.h:633
@ RZ_ANALYSIS_ADDR_HINT_TYPE_HIGH
Definition: rz_analysis.h:644
@ RZ_ANALYSIS_ADDR_HINT_TYPE_ESIL
Definition: rz_analysis.h:643
@ RZ_ANALYSIS_ADDR_HINT_TYPE_NEW_BITS
Definition: rz_analysis.h:637
@ RZ_ANALYSIS_ADDR_HINT_TYPE_TYPE_OFFSET
Definition: rz_analysis.h:642
@ RZ_ANALYSIS_ADDR_HINT_TYPE_JUMP
Definition: rz_analysis.h:631
@ RZ_ANALYSIS_ADDR_HINT_TYPE_OPTYPE
Definition: rz_analysis.h:640
@ RZ_ANALYSIS_ADDR_HINT_TYPE_RET
Definition: rz_analysis.h:636
@ RZ_ANALYSIS_ADDR_HINT_TYPE_IMMBASE
Definition: rz_analysis.h:630
@ RZ_ANALYSIS_ADDR_HINT_TYPE_NWORD
Definition: rz_analysis.h:635
@ RZ_ANALYSIS_ADDR_HINT_TYPE_FAIL
Definition: rz_analysis.h:632
@ RZ_ANALYSIS_ADDR_HINT_TYPE_OPCODE
Definition: rz_analysis.h:641
@ RZ_ANALYSIS_ADDR_HINT_TYPE_VAL
Definition: rz_analysis.h:645
enum rz_analysis_addr_hint_type_t RzAnalysisAddrHintType
RZ_API RBNode * rz_rbtree_find(RBNode *root, void *data, RBComparator cmp, void *user)
Definition: rbtree.c:267
RZ_API void rz_rbtree_free(RZ_NULLABLE RBNode *root, RBNodeFree freefn, void *user)
Definition: rbtree.c:281
#define rz_rbtree_foreach(root, it, data, struc, rb)
Definition: rz_rbtree.h:101
RZ_API bool rz_rbtree_insert(RBNode **root, void *data, RBNode *node, RBComparator cmp, void *user)
Returns true if the node was inserted successfully.
Definition: rbtree.c:291
RZ_API bool rz_rbtree_delete(RBNode **root, void *data, RBComparator cmp, void *cmp_user, RBNodeFree freefn, void *free_user)
Returns true if a node with an equal key is deleted.
Definition: rbtree.c:263
RZ_API RBNode * rz_rbtree_lower_bound(RBNode *root, void *data, RBComparator cmp, void *user)
Definition: rbtree.c:295
RZ_API RBNode * rz_rbtree_upper_bound(RBNode *root, void *data, RBComparator cmp, void *user)
Definition: rbtree.c:313
#define RZ_NULLABLE
Definition: rz_types.h:65
#define RZ_NEW0(x)
Definition: rz_types.h:284
#define container_of(ptr, type, member)
Definition: rz_types.h:650
#define RZ_BORROW
Definition: rz_types.h:63
#define UT64_MAX
Definition: rz_types_base.h:86
static void * rz_vector_index_ptr(RzVector *vec, size_t index)
Definition: rz_vector.h:88
RZ_API void rz_vector_remove_at(RzVector *vec, size_t index, void *into)
Definition: vector.c:127
RZ_API void * rz_vector_push(RzVector *vec, void *x)
Definition: vector.c:197
#define rz_vector_foreach(vec, it)
Definition: rz_vector.h:169
RZ_API void rz_vector_free(RzVector *vec)
Definition: vector.c:75
RZ_API RzVector * rz_vector_new(size_t elem_size, RzVectorFree free, void *free_user)
Definition: vector.c:42
static bool rz_vector_empty(const RzVector *vec)
Definition: rz_vector.h:74
#define a(i)
Definition: sha256.c:41
#define h(i)
Definition: sha256.c:48
void * user
Definition: hint.c:418
RzAnalysisAddrHintRecordsCb cb
Definition: hint.c:417
ut64 addr
Definition: hint.c:92
ut64 size
Definition: hint.c:93
HtUP * ht
Definition: hint.c:91
RzAnalysisRangedHintRecordBase base
Definition: hint.c:16
RzAnalysisRangedHintRecordBase base
Definition: hint.c:21
HtUP * addr_hints
Definition: rz_analysis.h:596
RBTree bits_hints
Definition: rz_analysis.h:598
RBTree arch_hints
Definition: rz_analysis.h:597
size_t len
Definition: rz_vector.h:47
int pos
Definition: main.c:11
#define fail(test)
Definition: tests.h:29
Definition: tar.h:52
ut64(WINAPI *w32_GetEnabledXStateFeatures)()
static const char * cb[]
Definition: z80_tab.h:176
static int addr
Definition: z80asm.c:58