Stackdb
Stackdb is a stackable, multi-target and -level source debugger and memory forensics library.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
value.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, 2012, 2013, 2014 The University of Utah
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include <glib.h>
20 
21 #include "glib_wrapper.h"
22 #include "target_api.h"
23 #include "target.h"
24 #include "memcache.h"
25 #include "dwdebug.h"
26 #include "dwdebug_priv.h"
27 
28 int value_set_addr(struct value *value,ADDR addr) {
29  value->res.addr = addr;
30  value->res_ip = target_read_creg(value->thread->target,value->thread->tid,
31  CREG_IP);
32  return 0;
33 }
34 
35 int value_set_mmap(struct value *value,ADDR addr,struct memcache_mmap_entry *mme,
36  char *offset_ptr) {
37  value->ismmap = 1;
38  value->buf = offset_ptr;
39  value->res.addr = addr;
40  value->res_ip = target_read_creg(value->thread->target,value->thread->tid,
41  CREG_IP);
42  return 0;
43 }
44 
45 int value_set_reg(struct value *value,REG reg) {
46  value->isreg = 1;
47  value->res.reg = reg;
48  value->res_ip = target_read_creg(value->thread->target,value->thread->tid,
49  CREG_IP);
50  return 0;
51 }
52 
53 int value_set_child(struct value *value,struct value *parent_value,ADDR addr) {
54  if (addr < parent_value->res.addr
55  || addr >= (parent_value->res.addr + parent_value->bufsiz))
56  return -1;
57 
58  value->parent_value = parent_value;
59  value->buf = parent_value->buf + (addr - parent_value->res.addr);
60  value->res.addr = addr;
61  value->range = parent_value->range;
62  value->res_ip = target_read_creg(value->thread->target,value->thread->tid,
63  CREG_IP);
64 
65  return 0;
66 }
67 
68 void value_set_strlen(struct value *value,int len) {
69  value->bufsiz = len;
70  value->isstring = 1;
71 }
72 
73 void value_set_const(struct value *value) {
74  value->isconst = 1;
75 }
76 
78  struct target_thread *tthread,
79  struct memrange *range,int len) {
80  struct value *value;
81 
82  if (!(value = malloc(sizeof(struct value))))
83  return NULL;
84  memset(value,0,sizeof(struct value));
85 
86  if (tthread)
87  value->thread = tthread;
88  else
89  value->thread = target->global_thread;
90  value->range = range;
91 
92  value->buf = malloc(len);
93  if (!value->buf) {
94  free(value);
95  return NULL;
96  }
97  value->bufsiz = len;
98 
99  return value;
100 }
101 
103  struct memrange *range,struct symbol *type) {
104  struct value *value;
105  int len = symbol_type_full_bytesize(type);
106 
107  if (len < 1) {
108  verror("type %s (ref 0x%"PRIxSMOFFSET") had 0-byte size!\n",
109  type->name,type->ref);
110  return NULL;
111  }
112 
113  if (!(value = malloc(sizeof(struct value))))
114  return NULL;
115  memset(value,0,sizeof(struct value));
116 
117  if (thread)
118  value->thread = thread;
119  else if (range)
120  value->thread = range->region->space->target->global_thread;
121  else
122  vwarn("value without thread being created; BUG!\n");
123  value->range = range;
124 
125  RHOLD(type,value);
126  value->type = type;
127 
128  value->buf = malloc(len);
129  if (!value->buf) {
130  free(value);
131  return NULL;
132  }
133  value->bufsiz = len;
134 
135  return value;
136 }
137 
139  struct lsymbol *lsymbol,struct symbol *type) {
140  struct value *value = value_create_type(thread,range,type);
141 
142  if (!value)
143  return NULL;
144 
145  if (lsymbol) {
146  RHOLD(lsymbol,value);
147  value->lsymbol = lsymbol;
148  }
149 
150  return value;
151 }
152 
154  struct memrange *range,
155  struct lsymbol *lsymbol,struct symbol *type) {
156  struct value *value;
157  int len = symbol_type_full_bytesize(type);
158 
159  /*
160  * NB: don't check this because we want to create NULL values sometimes!
161  */
162 #if 0
163  if (len < 1) {
164  verror("type %s (ref 0x%"PRIxSMOFFSET") had 0-byte size!\n",
165  type->name,type->ref);
166  return NULL;
167  }
168 #endif
169 
170  if (!(value = malloc(sizeof(struct value))))
171  return NULL;
172  memset(value,0,sizeof(struct value));
173 
174  if (thread)
175  value->thread = thread;
176  else
177  value->thread = thread->target->global_thread;
178  value->range = range;
179 
180  if (type) {
181  RHOLD(type,value);
182  value->type = type;
183  }
184 
185  if (lsymbol) {
186  RHOLD(lsymbol,value);
187  value->lsymbol = lsymbol;
188  }
189 
190  value->bufsiz = len;
191 
192  return value;
193 }
194 
195 struct value *value_clone(struct value *in) {
196  struct value *out = (struct value *)calloc(1,sizeof(*out));
197  if (!out)
198  return NULL;
199 
200  if (in->type) {
201  out->type = in->type;
202  RHOLD(out->type,out);
203  }
204  if (in->lsymbol) {
205  out->lsymbol = in->lsymbol;
206  RHOLD(out->lsymbol,out);
207  }
208  out->thread = in->thread;
209  out->range = in->range;
210  out->ismmap = in->ismmap;
211  out->isreg = in->isreg;
212  out->isstring = in->isstring;
213  out->res.addr = in->res.addr;
214  out->res.reg = in->res.reg;
215  out->res_ip = in->res_ip;
216 
217  out->buf = malloc(in->bufsiz);
218  memcpy(out->buf,in->buf,in->bufsiz);
219  out->bufsiz = in->bufsiz;
220 
221  return out;
222 }
223 
224 void value_free(struct value *value) {
225  REFCNT trefcnt;
226 
227  if (value->ismmap) {
228  /*
229  * XXX: if we ever link mmaps and values, handle refcnt stuff here.
230  */
231  }
232  else if (!value->parent_value)
233  free(value->buf);
234 
235  if (value->type)
236  RPUT(value->type,symbol,value,trefcnt);
237 
238  if (value->lsymbol)
239  RPUT(value->lsymbol,lsymbol,value,trefcnt);
240 
241  free(value);
242 }
243 
245  if (value->isreg) {
246  errno = EINVAL;
247  return 0;
248  }
249 
250  return value->res.addr;
251 }
252 
253 /*
254  * Do our best to see if the value needs to be reloaded; if so, reload
255  * it.
256  *
257  * There are several ways we can do this. If we have page tracking, and
258  * we know if a page has been updated since we last saw it, we can check
259  * that. If the value is mmap'd, we can just check content if
260  * necessary. Otherwise, we have to load the value again.
261  *
262  * If the value has a parent, we can only reload the parent if
263  * @recursive is set. Ugh, don't want that, but there is no other way.
264  *
265  * Wow, there are tons of complications involved with tracking values --
266  * the thread could be gone; the value (symbol) could be out of scope;
267  * it could have been a raw address on the stack; the value (symbol)
268  * could be in scope but unavailable for load; ...
269  */
270 
271 int value_refresh(struct value *value,int recursive) {
272  struct target *target;
273  REGVAL regval;
274 
275  if (!value->thread) {
276  vwarn("value no longer associated with a thread!\n");
277  errno = EADDRNOTAVAIL;
278  return -1;
279  }
280  if (!value->thread->target) {
281  vwarn("value thread no longer associated with a target!\n");
282  errno = EADDRNOTAVAIL;
283  return -1;
284  }
285  if (value->parent_value && !recursive) {
286  vwarn("value has a parent and you did not force recursive!\n");
287  errno = EBUSY;
288  return -1;
289  }
290 
291  target = value->thread->target;
292 
293  /*
294  * For now, just do it!
295  */
296  if (value->isreg) {
297  errno = 0;
298  regval = target_read_reg(target,value->thread->tid,value->res.reg);
299  if (errno) {
300  verror("could not read reg %d in target %s!\n",
301  value->res.reg,target->name);
302  return -1;
303  }
304  memcpy(value->buf,&regval,value->bufsiz);
305  }
306  else {
307  if (!target_read_addr(target,value->res.addr,value->bufsiz,
308  (unsigned char *)value->buf)) {
309  verror("could not read 0x%"PRIxADDR" in target %s!\n",
310  value->res.addr,target->name);
311  if (!errno)
312  errno = EFAULT;
313  return -1;
314  }
315  }
316 
317  return 0;
318 }
319 
320 int value_refresh_diff(struct value *value,int recurse,value_diff_t *vdiff,
321  char **old_buf,int *old_bufsiz,value_hash_t *old_vhash) {
322  verror("not supported yet!\n");
323  errno = ENOTSUP;
324  return -1;
325 }
326 
327 signed char v_c(struct value *v) { return *((signed char *)v->buf); }
328 unsigned char v_uc(struct value *v) { return *((unsigned char *)v->buf); }
329 wchar_t v_wc(struct value *v) { return *((wchar_t *)v->buf); }
330 uint8_t v_u8(struct value *v) { return *((uint8_t *)v->buf); }
331 uint16_t v_u16(struct value *v) { return *((uint16_t *)v->buf); }
332 uint32_t v_u32(struct value *v) { return *((uint32_t *)v->buf); }
333 uint64_t v_u64(struct value *v) { return *((uint64_t *)v->buf); }
334 int8_t v_i8(struct value *v) { return *((int8_t *)v->buf); }
335 int16_t v_i16(struct value *v) { return *((int16_t *)v->buf); }
336 int32_t v_i32(struct value *v) { return *((int32_t *)v->buf); }
337 int64_t v_i64(struct value *v) { return *((int64_t *)v->buf); }
338 num_t v_num(struct value *v) {
339  if (v->bufsiz == (signed)sizeof(int64_t))
340  return v_i64(v);
341  else if (v->bufsiz == (signed)sizeof(int32_t))
342  return v_i32(v);
343  else if (v->bufsiz == (signed)sizeof(int16_t))
344  return v_i16(v);
345  else if (v->bufsiz == (signed)sizeof(int8_t))
346  return v_i8(v);
347  else {
348  errno = EINVAL;
349  return -1;
350  }
351  return 0;
352 }
353 unum_t v_unum(struct value *v){
354  if (v->bufsiz == (signed)sizeof(uint64_t))
355  return v_u64(v);
356  else if (v->bufsiz == (signed)sizeof(uint32_t))
357  return v_u32(v);
358  else if (v->bufsiz == (signed)sizeof(uint16_t))
359  return v_u16(v);
360  else if (v->bufsiz == (signed)sizeof(uint8_t))
361  return v_u8(v);
362  else {
363  errno = EINVAL;
364  return -1;
365  }
366  return 0;
367 }
368 float v_f(struct value *v) { return *((float *)v->buf); }
369 double v_d(struct value *v) { return *((double *)v->buf); }
370 long double v_dd(struct value *v) { return *((long double *)v->buf); }
371 ADDR v_addr(struct value *v){ return *((ADDR *)v->buf); }
372 char * v_string(struct value *v){ return v->buf; }
373 
374 int value_update(struct value *value,const char *buf,int bufsiz) {
375  if (bufsiz < 0) {
376  errno = EINVAL;
377  return -1;
378  }
379  else if (bufsiz > value->bufsiz) {
380  errno = EOVERFLOW;
381  return -1;
382  }
383  else if (bufsiz > 0)
384  memcpy(value->buf,buf,bufsiz);
385 
386  return 0;
387 }
388 
389 int value_update_zero(struct value *value,const char *buf,int bufsiz) {
390  if (bufsiz < 0) {
391  errno = EINVAL;
392  return -1;
393  }
394  else if (bufsiz > value->bufsiz) {
395  errno = EOVERFLOW;
396  return -1;
397  }
398  else if (bufsiz > 0)
399  memcpy(value->buf,buf,bufsiz);
400 
401  if (bufsiz < value->bufsiz)
402  memset(value->buf + bufsiz,0,value->bufsiz - bufsiz);
403 
404  return 0;
405 }
406 
407 int value_update_c(struct value *value,signed char v) {
408  if ((signed)sizeof(signed char) > value->bufsiz) {
409  errno = EOVERFLOW;
410  return -1;
411  }
412  memcpy(value->buf,&v,sizeof(signed char));
413  return 0;
414 }
415 int value_update_uc(struct value *value,unsigned char v) {
416  if ((signed)sizeof(signed char) > value->bufsiz) {
417  errno = EOVERFLOW;
418  return -1;
419  }
420  memcpy(value->buf,&v,sizeof(signed char));
421  return 0;
422 }
423 int value_update_wc(struct value *value,wchar_t v) {
424  if ((signed)sizeof(signed char) > value->bufsiz) {
425  errno = EOVERFLOW;
426  return -1;
427  }
428  memcpy(value->buf,&v,sizeof(signed char));
429  return 0;
430 }
431 int value_update_u8(struct value *value,uint8_t v) {
432  if ((signed)sizeof(uint8_t) > value->bufsiz) {
433  errno = EOVERFLOW;
434  return -1;
435  }
436  memcpy(value->buf,&v,sizeof(uint8_t));
437  return 0;
438 }
439 int value_update_u16(struct value *value,uint16_t v) {
440  if ((signed)sizeof(uint16_t) > value->bufsiz) {
441  errno = EOVERFLOW;
442  return -1;
443  }
444  memcpy(value->buf,&v,sizeof(uint16_t));
445  return 0;
446 }
447 int value_update_u32(struct value *value,uint32_t v) {
448  if ((signed)sizeof(uint32_t) > value->bufsiz) {
449  errno = EOVERFLOW;
450  return -1;
451  }
452  memcpy(value->buf,&v,sizeof(uint32_t));
453  return 0;
454 }
455 int value_update_u64(struct value *value,uint64_t v) {
456  if ((signed)sizeof(uint64_t) > value->bufsiz) {
457  errno = EOVERFLOW;
458  return -1;
459  }
460  memcpy(value->buf,&v,sizeof(uint64_t));
461  return 0;
462 }
463 int value_update_i8(struct value *value,int8_t v) {
464  if ((signed)sizeof(int8_t) > value->bufsiz) {
465  errno = EOVERFLOW;
466  return -1;
467  }
468  memcpy(value->buf,&v,sizeof(int8_t));
469  return 0;
470 }
471 int value_update_i16(struct value *value,int16_t v) {
472  if ((signed)sizeof(int16_t) > value->bufsiz) {
473  errno = EOVERFLOW;
474  return -1;
475  }
476  memcpy(value->buf,&v,sizeof(int16_t));
477  return 0;
478 }
479 int value_update_i32(struct value *value,int32_t v) {
480  if ((signed)sizeof(int32_t) > value->bufsiz) {
481  errno = EOVERFLOW;
482  return -1;
483  }
484  memcpy(value->buf,&v,sizeof(int32_t));
485  return 0;
486 }
487 int value_update_i64(struct value *value,int64_t v) {
488  if ((signed)sizeof(int64_t) > value->bufsiz) {
489  errno = EOVERFLOW;
490  return -1;
491  }
492  memcpy(value->buf,&v,sizeof(int64_t));
493  return 0;
494 }
495 int value_update_f(struct value *value,float v) {
496  if ((signed)sizeof(float) > value->bufsiz) {
497  errno = EOVERFLOW;
498  return -1;
499  }
500  memcpy(value->buf,&v,sizeof(float));
501  return 0;
502 }
503 int value_update_d(struct value *value,double v) {
504  if ((signed)sizeof(double) > value->bufsiz) {
505  errno = EOVERFLOW;
506  return -1;
507  }
508  memcpy(value->buf,&v,sizeof(double));
509  return 0;
510 }
511 int value_update_dd(struct value *value,long double v) {
512  if ((signed)sizeof(long double) > value->bufsiz) {
513  errno = EOVERFLOW;
514  return -1;
515  }
516  memcpy(value->buf,&v,sizeof(long double));
517  return 0;
518 }
520  if (value->bufsiz <= (signed)sizeof(ADDR)) {
521  memcpy(value->buf,&v,value->bufsiz);
522  }
523  else /* if (value->bufsiz > sizeof(ADDR)) */ {
524  memcpy(value->buf,&v,sizeof(ADDR));
525  }
526  return 0;
527 }
529  if (value->bufsiz == (signed)sizeof(int64_t))
530  return value_update_i64(value,v);
531  else if (value->bufsiz == (signed)sizeof(int32_t))
532  return value_update_i32(value,(int32_t)v);
533  else if (value->bufsiz == (signed)sizeof(int16_t))
534  return value_update_i16(value,(int16_t)v);
535  else if (value->bufsiz == (signed)sizeof(int8_t))
536  return value_update_i8(value,(int8_t)v);
537  else {
538  errno = EINVAL;
539  return -1;
540  }
541  return 0;
542 }
544  if (value->bufsiz == (signed)sizeof(uint64_t))
545  return value_update_u64(value,v);
546  else if (value->bufsiz == (signed)sizeof(uint32_t))
547  return value_update_u32(value,(uint32_t)v);
548  else if (value->bufsiz == (signed)sizeof(uint16_t))
549  return value_update_u16(value,(uint16_t)v);
550  else if (value->bufsiz == (signed)sizeof(uint8_t))
551  return value_update_u8(value,(uint8_t)v);
552  else {
553  errno = EINVAL;
554  return -1;
555  }
556  return 0;
557 }
558 
559 static inline int __d2hs(char *buf,unsigned int len,char *str) {
560  unsigned int i;
561  uint8_t hi,lo;
562 
563  i = 0;
564  while (i < len) {
565  lo = buf[i] & 0xf;
566  hi = (buf[i] >> 4) & 0xf;
567 
568  if (lo <= 9) str[i*2+1] = '0' + lo;
569  else str[i*2+1] = 'a' + (lo - 10);
570 
571  if (hi <= 9) str[i*2] = '0' + hi;
572  else str[i*2] = 'a' + (hi - 10);
573 
574  ++i;
575  }
576 
577  return 0;
578 }
579 
580 
581 int value_snprintf(struct value *value,char *buf,int buflen) {
582  int nrc;
583  struct symbol *tmpsym;
584  struct value fake_value;
585  OFFSET offset;
586  int *indicies;
587  int i;
588  int j;
589  int found;
590  uint32_t tbytesize;
591  struct symbol *datatype = value->type;
592  struct symbol *datatype2;
593  GSList *gsltmp;
594  loctype_t ltrc;
595  struct location tloc;
596  int unprintable;
597 
598  nrc = 0;
599 
600 #define VSBP(msg) \
601  do { \
602  int _trc = 0; \
603  _trc = snprintf(buf,buflen - nrc,"<"msg"::"); \
604  if (_trc < 0) \
605  return -1; \
606  nrc += _trc; \
607  _trc = ((value->bufsiz * 2) > (buflen - nrc - 1)) \
608  ? (buflen - nrc - 1) / 2 : value->bufsiz; \
609  __d2hs(value->buf,_trc,buf + nrc); \
610  nrc += _trc * 2; \
611  if (nrc < (buflen - 1)) { \
612  buf[nrc++] = '>'; \
613  buf[nrc++] = '\0'; \
614  } \
615  else if (nrc < buflen) \
616  buf[nrc++] = '\0'; \
617  else \
618  buf[buflen - 1] = '\0'; \
619  } \
620  while (0)
621 #define VSBPA(msg,...) \
622  do { \
623  int _trc = 0; \
624  _trc = snprintf(buf,buflen - nrc,"<"msg"::", ## __VA_ARGS__); \
625  if (_trc < 0) \
626  return -1; \
627  nrc += _trc; \
628  _trc = ((value->bufsiz * 2) > (buflen - nrc - 1)) \
629  ? (buflen - nrc - 1) / 2 : value->bufsiz; \
630  __d2hs(value->buf,_trc,buf + nrc); \
631  nrc += _trc * 2; \
632  if (nrc < (buflen - 1)) { \
633  buf[nrc++] = '>'; \
634  buf[nrc++] = '\0'; \
635  } \
636  else if (nrc < buflen) \
637  buf[nrc++] = '\0'; \
638  else \
639  buf[buflen - 1] = '\0'; \
640  } \
641  while (0)
642 
643  /* Handle AUTO_STRING specially. */
644  if (value->isstring) {
645  unprintable = 0;
646  for (j = 0; j < value->bufsiz && value->buf[j] != '\0'; ++j) {
647  if (!isgraph(value->buf[j]) && !isspace(value->buf[j])) {
648  unprintable = 1;
649  break;
650  }
651  }
652  if (unprintable) {
653  VSBP("BINARY_STRING");
654  }
655  else
656  nrc = snprintf(buf,buflen,"\"%s\"",value->buf);
657  goto out;
658  }
659 
660  if (!datatype)
661  return -1;
662 
663  datatype = symbol_type_skip_qualifiers(datatype);
664  tbytesize = symbol_get_bytesize(datatype);
665 
666  switch (datatype->datatype_code) {
667  case DATATYPE_BASE:;
668  encoding_t enc = SYMBOLX_ENCODING_V(datatype);
669  if (enc == ENCODING_ADDRESS) {
670  if (tbytesize == 1)
671  nrc = snprintf(buf,buflen,"%"PRIx8,v_u8(value));
672  else if (tbytesize == 2)
673  nrc = snprintf(buf,buflen,"%"PRIx16,v_u16(value));
674  else if (tbytesize == 4)
675  nrc = snprintf(buf,buflen,"%"PRIx32,v_u32(value));
676  else if (tbytesize == 8)
677  nrc = snprintf(buf,buflen,"%"PRIx64,v_u64(value));
678  else
679  VSBPA("UNSUP_ENC_%d",enc);
680  }
681  else if (enc == ENCODING_BOOLEAN
682  || enc == ENCODING_UNSIGNED) {
683  if (tbytesize == 1)
684  nrc = snprintf(buf,buflen,"%"PRIu8,v_u8(value));
685  else if (tbytesize == 2)
686  nrc = snprintf(buf,buflen,"%"PRIu16,v_u16(value));
687  else if (tbytesize == 4)
688  nrc = snprintf(buf,buflen,"%"PRIu32,v_u32(value));
689  else if (tbytesize == 8)
690  nrc = snprintf(buf,buflen,"%"PRIu64,v_u64(value));
691  else
692  VSBPA("UNSUP_ENC_%d",enc);
693  }
694  else if (enc == ENCODING_SIGNED) {
695  if (tbytesize == 1)
696  nrc = snprintf(buf,buflen,"%"PRIi8,v_i8(value));
697  else if (tbytesize == 2)
698  nrc = snprintf(buf,buflen,"%"PRIi16,v_i16(value));
699  else if (tbytesize == 4)
700  nrc = snprintf(buf,buflen,"%"PRIi32,v_i32(value));
701  else if (tbytesize == 8)
702  nrc = snprintf(buf,buflen,"%"PRIi64,v_i64(value));
703  else
704  VSBPA("UNSUP_ENC_%d",enc);
705  }
706  else if (enc == ENCODING_FLOAT) {
707  if (tbytesize == 4)
708  nrc = snprintf(buf,buflen,"%f",(double)v_f(value));
709  else if (tbytesize == 8)
710  nrc = snprintf(buf,buflen,"%f",v_d(value));
711  else if (tbytesize == 16)
712  nrc = snprintf(buf,buflen,"%Lf",v_dd(value));
713  else
714  VSBPA("UNSUP_ENC_%d",enc);
715  }
716  else if (enc == ENCODING_SIGNED_CHAR
717  || enc == ENCODING_UNSIGNED_CHAR) {
718  if (tbytesize == 1)
719  nrc = snprintf(buf,buflen,"%c",(int)v_c(value));
720  else if (tbytesize == 2)
721  nrc = snprintf(buf,buflen,"%lc",(wint_t)v_wc(value));
722  else
723  VSBPA("UNSUP_ENC_%d",enc);
724  }
725  else if (enc == ENCODING_COMPLEX_FLOAT) {
726  VSBPA("UNSUP_ENC_%d",enc);
727  }
728  else if (enc == ENCODING_IMAGINARY_FLOAT) {
729  VSBPA("UNSUP_ENC_%d",enc);
730  }
731  else if (enc == ENCODING_PACKED_DECIMAL) {
732  VSBPA("UNSUP_ENC_%d",enc);
733  }
734  else if (enc == ENCODING_NUMERIC_STRING) {
735  VSBPA("UNSUP_ENC_%d",enc);
736  }
737  else if (enc == ENCODING_EDITED) {
738  VSBPA("UNSUP_ENC_%d",enc);
739  }
740  else if (enc == ENCODING_SIGNED_FIXED) {
741  VSBPA("UNSUP_ENC_%d",enc);
742  }
743  else if (enc == ENCODING_UNSIGNED_FIXED) {
744  VSBPA("UNSUP_ENC_%d",enc);
745  }
746  else {
747  VSBPA("UNSUP_ENC_%d",enc);
748  }
749  break;
750  case DATATYPE_PTR:
751  if (tbytesize == 4)
752  nrc = snprintf(buf,buflen,"0x%"PRIx32,v_u32(value));
753  else if (tbytesize == 8)
754  nrc = snprintf(buf,buflen,"0x%"PRIx64,v_u64(value));
755  else
756  VSBP("UNSUP_PTR");
757  break;
758  case DATATYPE_ARRAY:;
759  GSList *subranges = SYMBOLX_SUBRANGES(datatype);
760  int subrange_first;
761  int subrange;
762  int llen;
763 
764  if (!subranges) {
765  nrc = snprintf(buf,buflen,"[ ]");
766  break;
767  }
768 
769  llen = g_slist_length(subranges);
770  subrange_first = (int)(uintptr_t)g_slist_nth_data(subranges,0);
771 
772  datatype2 = symbol_get_datatype(datatype);
773 
774  /* First, if it's a single-index char array, print as a string
775  * if AUTO_STRING.
776  */
777  if (llen == 1 && symbol_type_is_char(datatype2)) {
778  nrc = snprintf(buf,buflen,"\"%.*s\"",subrange_first,value->buf);
779  break;
780  }
781 
782  nrc = 0;
783  /* Otherwise, just dump the members of the array. */
784  indicies = malloc(sizeof(int)*llen);
785  for (i = 0; i < llen; ++i) {
786  indicies[i] = 0;
787  nrc += snprintf(buf + nrc,buflen - nrc,"[ ");
788  }
789  fake_value.bufsiz = symbol_get_bytesize(datatype2);
790  fake_value.buf = value->buf;
791  fake_value.type = datatype2;
792  again:
793  while (1) { /* fake_value.buf < (value->buf + value->bufsiz)) {
794  */
795  nrc += value_snprintf(&fake_value,buf + nrc,buflen - nrc);
796  nrc += snprintf(buf + nrc,buflen - nrc,", ");
797 
798  /* calc current offset */
799  fake_value.buf += symbol_get_bytesize(datatype2);
800 
801  /* close brackets */
802  for (j = llen - 1; j > -1; --j) {
803  ++indicies[j];
804  subrange = (int)(uintptr_t)g_slist_nth_data(subranges,j);
805 
806  if (indicies[j] >= subrange) {
807  nrc += snprintf(buf + nrc,buflen - nrc," ],");
808  if (j == 0)
809  /* Break to outer loop and the main termination */
810  break;
811  indicies[j] = 0;
812  }
813  else
814  goto again;
815  }
816 
817  /* terminate if we're done */
818  if (indicies[0] >= subrange_first)
819  break;
820 
821  for ( ; j < llen; ++j)
822  nrc += snprintf(buf + nrc,buflen - nrc," [ ");
823  }
824  free(indicies);
825 
826  break;
827  case DATATYPE_STRUCT:
828  case DATATYPE_UNION:
829  case DATATYPE_CLASS:
830  nrc = snprintf(buf,buflen,"{");
831  gsltmp = NULL;
832  v_g_slist_foreach(SYMBOLX_MEMBERS(datatype),gsltmp,tmpsym) {
833  if (symbol_get_name(tmpsym))
834  nrc += snprintf(buf + nrc,buflen - nrc,
835  " .%s = ",symbol_get_name(tmpsym));
836  else
837  nrc += snprintf(buf + nrc,buflen - nrc," ");
838  memset(&tloc,0,sizeof(tloc));
839  ltrc = symbol_resolve_location(tmpsym,NULL,&tloc);
840  if (ltrc != LOCTYPE_MEMBER_OFFSET) {
841  nrc += snprintf(buf + nrc,buflen - nrc,"?,");
842  }
843  else {
844  offset = LOCATION_OFFSET(&tloc);
845  fake_value.buf = value->buf + offset;
846  fake_value.type = symbol_get_datatype(tmpsym);
847  fake_value.lsymbol = NULL;
848  fake_value.bufsiz = symbol_get_bytesize(fake_value.type);
849  nrc += value_snprintf(&fake_value,buf + nrc,buflen - nrc);
850  nrc += snprintf(buf + nrc,buflen - nrc,",");
851  }
852  location_internal_free(&tloc);
853  }
854  nrc += snprintf(buf + nrc,buflen - nrc," }");
855  break;
856  case DATATYPE_ENUM:
857  found = 0;
858  nrc = 0;
859  gsltmp = NULL;
860  v_g_slist_foreach(SYMBOLX_MEMBERS(datatype),gsltmp,tmpsym) {
861  char *constval = SYMBOLX_VAR_CONSTVAL(tmpsym);
862  if (!constval)
863  continue;
864  if (strncmp((char *)constval,value->buf,
865  symbol_type_full_bytesize(datatype)) == 0) {
866  nrc += snprintf(buf + nrc,buflen - nrc,
867  "%s",symbol_get_name(tmpsym));
868  found = 1;
869  break;
870  }
871  }
872  if (!found)
873  nrc += snprintf(buf + nrc,buflen - nrc,"%"PRIuNUM" (0x%"PRIxNUM")",
874  v_unum(value),v_unum(value));
875  break;
876  case DATATYPE_CONST:
877  VSBPA("UNSUP_CONST_%s",symbol_get_name(datatype));
878  break;
879  case DATATYPE_VOL:
880  VSBPA("UNSUP_VOL_%s",symbol_get_name(datatype));
881  break;
882  case DATATYPE_TYPEDEF:
883  VSBPA("UNSUP_TYPEDEF_%s",symbol_get_name(datatype));
884  break;
885  case DATATYPE_FUNC:
886  VSBPA("UNSUP_FUNCTION_%s",symbol_get_name(datatype));
887  break;
888  case DATATYPE_VOID:
889  nrc = snprintf(buf,buflen,"NULL");
890  break;
891  default:
892  nrc = 0;
893  break;
894  }
895 
896  out:
897  return nrc;
898 }
899 
900 void __value_dump(struct value *value,struct dump_info *ud) {
901  struct symbol *tmpsym;
902  struct value fake_value;
903  OFFSET offset;
904  int *indicies;
905  int i;
906  int j;
907  int found;
908  uint32_t tbytesize;
909  struct symbol *datatype = value->type;
910  struct symbol *datatype2;
911  GSList *gsltmp;
912  loctype_t ltrc;
913  struct location tloc;
914 
915  /* Handle AUTO_STRING specially. */
916  if (value->isstring) {
917  fprintf(ud->stream,"\"%s\"",value->buf);
918  goto out;
919  }
920 
921  if (datatype)
922  datatype = symbol_type_skip_qualifiers(datatype);
923  tbytesize = symbol_get_bytesize(datatype);
924 
925  switch (datatype->datatype_code) {
926  case DATATYPE_BASE:;
927  encoding_t enc = SYMBOLX_ENCODING_V(datatype);
928  if (enc == ENCODING_ADDRESS) {
929  if (tbytesize == 1)
930  fprintf(ud->stream,"%"PRIx8,v_u8(value));
931  else if (tbytesize == 2)
932  fprintf(ud->stream,"%"PRIx16,v_u16(value));
933  else if (tbytesize == 4)
934  fprintf(ud->stream,"%"PRIx32,v_u32(value));
935  else if (tbytesize == 8)
936  fprintf(ud->stream,"%"PRIx64,v_u64(value));
937  else
938  fprintf(ud->stream,"<UNSUPPORTED_BYTESIZE_%d>",tbytesize);
939  }
940  else if (enc == ENCODING_BOOLEAN
941  || enc == ENCODING_UNSIGNED) {
942  if (tbytesize == 1)
943  fprintf(ud->stream,"%"PRIu8,v_u8(value));
944  else if (tbytesize == 2)
945  fprintf(ud->stream,"%"PRIu16,v_u16(value));
946  else if (tbytesize == 4)
947  fprintf(ud->stream,"%"PRIu32,v_u32(value));
948  else if (tbytesize == 8)
949  fprintf(ud->stream,"%"PRIu64,v_u64(value));
950  else
951  fprintf(ud->stream,"<UNSUPPORTED_BYTESIZE_%d>",tbytesize);
952  }
953  else if (enc == ENCODING_SIGNED) {
954  if (tbytesize == 1)
955  fprintf(ud->stream,"%"PRIi8,v_i8(value));
956  else if (tbytesize == 2)
957  fprintf(ud->stream,"%"PRIi16,v_i16(value));
958  else if (tbytesize == 4)
959  fprintf(ud->stream,"%"PRIi32,v_i32(value));
960  else if (tbytesize == 8)
961  fprintf(ud->stream,"%"PRIi64,v_i64(value));
962  else
963  fprintf(ud->stream,"<UNSUPPORTED_BYTESIZE_%d>",tbytesize);
964  }
965  else if (enc == ENCODING_FLOAT) {
966  if (tbytesize == 4)
967  fprintf(ud->stream,"%f",(double)v_f(value));
968  else if (tbytesize == 8)
969  fprintf(ud->stream,"%f",v_d(value));
970  else if (tbytesize == 16)
971  fprintf(ud->stream,"%Lf",v_dd(value));
972  else
973  fprintf(ud->stream,"<UNSUPPORTED_BYTESIZE_%d>",tbytesize);
974  }
975  else if (enc == ENCODING_SIGNED_CHAR
976  || enc == ENCODING_UNSIGNED_CHAR) {
977  if (tbytesize == 1)
978  fprintf(ud->stream,"%c",(int)v_c(value));
979  else if (tbytesize == 2)
980  fprintf(ud->stream,"%lc",(wint_t)v_wc(value));
981  else
982  fprintf(ud->stream,"<UNSUPPORTED_BYTESIZE_%d>",tbytesize);
983  }
984  else if (enc == ENCODING_COMPLEX_FLOAT) {
985  fprintf(ud->stream,"<UNSUPPORTED_COMPLEX_FLOAT_%d>",
986  tbytesize);
987  }
988  else if (enc == ENCODING_IMAGINARY_FLOAT) {
989  fprintf(ud->stream,"<UNSUPPORTED_IMAGINARY_FLOAT_%d>",
990  tbytesize);
991  }
992  else if (enc == ENCODING_PACKED_DECIMAL) {
993  fprintf(ud->stream,"<UNSUPPORTED_PACKED_DECIMAL_%d>",
994  tbytesize);
995  }
996  else if (enc == ENCODING_NUMERIC_STRING) {
997  fprintf(ud->stream,"<UNSUPPORTED_NUMERIC_STRING_%d>",
998  tbytesize);
999  }
1000  else if (enc == ENCODING_EDITED) {
1001  fprintf(ud->stream,"<UNSUPPORTED_EDITED_%d>",
1002  tbytesize);
1003  }
1004  else if (enc == ENCODING_SIGNED_FIXED) {
1005  fprintf(ud->stream,"<UNSUPPORTED_SIGNED_FIXED_%d>",
1006  tbytesize);
1007  }
1008  else if (enc == ENCODING_UNSIGNED_FIXED) {
1009  fprintf(ud->stream,"<UNSUPPORTED_UNSIGNED_FIXED_%d>",
1010  tbytesize);
1011  }
1012  break;
1013  case DATATYPE_PTR:
1014  if (tbytesize == 4)
1015  fprintf(ud->stream,"0x%"PRIx32,v_u32(value));
1016  else if (tbytesize == 8)
1017  fprintf(ud->stream,"0x%"PRIx64,v_u64(value));
1018  else
1019  fprintf(ud->stream,"<UNSUPPORTED_PTR_%d>",tbytesize);
1020  break;
1021  case DATATYPE_ARRAY:;
1022  GSList *subranges = SYMBOLX_SUBRANGES(datatype);
1023  int subrange_first;
1024  int subrange;
1025  int llen;
1026 
1027  if (!subranges) {
1028  fprintf(ud->stream,"[ ]");
1029  break;
1030  }
1031 
1032  subrange_first = (int)(uintptr_t)g_slist_nth_data(subranges,0);
1033  llen = g_slist_length(subranges);
1034  datatype2 = symbol_get_datatype(datatype);
1035 
1036  /* First, if it's a single-index char array, print as a string
1037  * if AUTO_STRING.
1038  */
1039  if (llen == 1
1040  && symbol_type_is_char(datatype2)) {
1041  fprintf(ud->stream,"\"%.*s\"",subrange_first,value->buf);
1042  break;
1043  }
1044 
1045  /* Otherwise, just dump the members of the array. */
1046  indicies = malloc(sizeof(int)*llen);
1047  for (i = 0; i < llen; ++i) {
1048  indicies[i] = 0;
1049  fprintf(ud->stream,"[ ");
1050  }
1051  fake_value.bufsiz = symbol_get_bytesize(datatype2);
1052  fake_value.buf = value->buf;
1053  fake_value.type = datatype2;
1054  again:
1055  while (1) { /* fake_value.buf < (value->buf + value->bufsiz)) { */
1056  __value_dump(&fake_value,ud);
1057  fprintf(ud->stream,", ");
1058 
1059  /* calc current offset */
1060  fake_value.buf += symbol_get_bytesize(datatype2);
1061 
1062  /* close brackets */
1063  for (j = llen - 1; j > -1; --j) {
1064  ++indicies[j];
1065 
1066  subrange = (int)(uintptr_t)g_slist_nth_data(subranges,j);
1067  if (indicies[j] >= subrange) {
1068  fprintf(ud->stream," ],");
1069  if (j == 0)
1070  /* Break to outer loop and the main termination */
1071  break;
1072  indicies[j] = 0;
1073  }
1074  else
1075  goto again;
1076  }
1077 
1078  /* terminate if we're done */
1079  if (indicies[0] >= subrange_first)
1080  break;
1081 
1082  for ( ; j < llen; ++j)
1083  fprintf(ud->stream," [ ");
1084  }
1085  free(indicies);
1086 
1087  break;
1088  case DATATYPE_STRUCT:
1089  case DATATYPE_UNION:
1090  fprintf(ud->stream,"{");
1091  gsltmp = NULL;
1092  v_g_slist_foreach(SYMBOLX_MEMBERS(datatype),gsltmp,tmpsym) {
1093  if (symbol_get_name(tmpsym))
1094  fprintf(ud->stream," .%s = ",symbol_get_name(tmpsym));
1095  else
1096  fprintf(ud->stream," ");
1097  memset(&tloc,0,sizeof(tloc));
1098  ltrc = symbol_resolve_location(tmpsym,NULL,&tloc);
1099  if (ltrc != LOCTYPE_MEMBER_OFFSET) {
1100  fputs("?,",ud->stream);
1101  }
1102  else {
1103  offset = LOCATION_OFFSET(&tloc);
1104  fake_value.buf = value->buf + offset;
1105  fake_value.type = symbol_get_datatype(tmpsym);
1106  fake_value.lsymbol = NULL;
1107  fake_value.bufsiz = symbol_get_bytesize(fake_value.type);
1108  __value_dump(&fake_value,ud);
1109  fputs(",",ud->stream);
1110  }
1111  location_internal_free(&tloc);
1112  }
1113  fprintf(ud->stream," }");
1114  break;
1115  case DATATYPE_ENUM:
1116  found = 0;
1117  gsltmp = NULL;
1118  v_g_slist_foreach(SYMBOLX_MEMBERS(datatype),gsltmp,tmpsym) {
1119  char *constval = SYMBOLX_VAR_CONSTVAL(tmpsym);
1120  if (!constval)
1121  continue;
1122  if (strncmp((char *)constval,value->buf,
1123  symbol_type_full_bytesize(datatype)) == 0) {
1124  fprintf(ud->stream,"%s",symbol_get_name(tmpsym));
1125  found = 1;
1126  break;
1127  }
1128  }
1129  if (!found)
1130  fprintf(ud->stream,"%"PRIuNUM" (0x%"PRIxNUM")",
1131  v_unum(value),v_unum(value));
1132  break;
1133  case DATATYPE_CONST:
1134  fprintf(ud->stream,"<UNSUPPORTED_CONST_%s>",symbol_get_name(datatype));
1135  break;
1136  case DATATYPE_VOL:
1137  fprintf(ud->stream,"<UNSUPPORTED_VOL_%s>",symbol_get_name(datatype));
1138  break;
1139  case DATATYPE_TYPEDEF:
1140  fprintf(ud->stream,"<UNSUPPORTED_TYPEDEF_%s>",
1141  symbol_get_name(datatype));
1142  break;
1143  case DATATYPE_FUNC:
1144  fprintf(ud->stream,"<UNSUPPORTED_FUNCTION_%s>",
1145  symbol_get_name(datatype));
1146  break;
1147  case DATATYPE_VOID:
1148  fprintf(ud->stream,"NULL");
1149  break;
1150  default:
1151  break;
1152  }
1153 
1154  out:
1155  return;
1156 }
1157 
1158 void value_dump_simple(struct value *value,struct dump_info *ud) {
1159  __value_dump(value,ud);
1160  return;
1161 }
1162 
1163 void value_dump(struct value *value,struct dump_info *ud) {
1164  char *p = "";
1165  char *np;
1166  struct dump_info udn;
1167  int i;
1168  int alen;
1169  struct symbol *s;
1170 
1171  if (ud->prefix) {
1172  p = ud->prefix;
1173  np = malloc(strlen(p) + 1 + 2);
1174  sprintf(np,"%s%s",p," ");
1175  }
1176  else {
1177  np = " ";
1178  }
1179  udn.prefix = np;
1180  udn.stream = ud->stream;
1181  udn.meta = ud->meta;
1182  udn.detail = ud->detail;
1183 
1184  if (value->lsymbol) {
1185  alen = array_list_len(value->lsymbol->chain);
1186  for (i = 0; i < alen; ++i) {
1187  s = (struct symbol *)array_list_item(value->lsymbol->chain,i);
1188  if (symbol_get_name(s)) {
1189  fprintf(udn.stream,"%s",symbol_get_name(s));
1190  if ((i + 1) < alen)
1191  fputs(".",udn.stream);
1192  }
1193  }
1194 
1195  fputs(" = ",udn.stream);
1196  }
1197 
1198  __value_dump(value,&udn);
1199 
1200  if (ud->prefix)
1201  free(np);
1202  return;
1203 }
1204 
1205 signed char rv_c(void *buf) { return *((signed char *)buf); }
1206 unsigned char rv_uc(void *buf) { return *((unsigned char *)buf); }
1207 wchar_t rv_wc(void *buf) { return *((wchar_t *)buf); }
1208 uint8_t rv_u8(void *buf) { return *((uint8_t *)buf); }
1209 uint16_t rv_u16(void *buf) { return *((uint16_t *)buf); }
1210 uint32_t rv_u32(void *buf) { return *((uint32_t *)buf); }
1211 uint64_t rv_u64(void *buf) { return *((uint64_t *)buf); }
1212 int8_t rv_i8(void *buf) { return *((int8_t *)buf); }
1213 int16_t rv_i16(void *buf) { return *((int16_t *)buf); }
1214 int32_t rv_i32(void *buf) { return *((int32_t *)buf); }
1215 int64_t rv_i64(void *buf) { return *((int64_t *)buf); }
1216 float rv_f(void *buf) { return *((float *)buf); }
1217 double rv_d(void *buf) { return *((double *)buf); }
1218 long double rv_dd(void *buf) { return *((long double *)buf); }
1219 ADDR rv_addr(void *buf){ return *((ADDR *)buf); }
uint16_t rv_u16(void *buf)
Definition: value.c:1209
struct value * value_create_noalloc(struct target_thread *thread, struct memrange *range, struct lsymbol *lsymbol, struct symbol *type)
Definition: value.c:153
int16_t v_i16(struct value *v)
Definition: value.c:335
int value_update_i16(struct value *value, int16_t v)
Definition: value.c:471
encoding_t
Definition: dwdebug.h:266
#define SYMBOLX_SUBRANGES(sym)
int value_snprintf(struct value *value, char *buf, int buflen)
Definition: value.c:581
int value_update_i32(struct value *value, int32_t v)
Definition: value.c:479
void value_set_strlen(struct value *value, int len)
Definition: value.c:68
int value_update_f(struct value *value, float v)
Definition: value.c:495
void value_dump_simple(struct value *value, struct dump_info *ud)
Definition: value.c:1158
uint8_t isreg
Definition: target_api.h:3260
int8_t v_i8(struct value *v)
Definition: value.c:334
void * p
#define SYMBOLX_MEMBERS(sym)
Definition: arch.h:74
uint8_t rv_u8(void *buf)
Definition: value.c:1208
#define v_g_slist_foreach(gslhead, gslcur, elm)
Definition: glib_wrapper.h:60
SMOFFSET ref
Definition: dwdebug_priv.h:868
void location_internal_free(struct location *location)
Definition: location.c:347
long double v_dd(struct value *v)
Definition: value.c:370
void __value_dump(struct value *value, struct dump_info *ud)
Definition: value.c:900
wchar_t rv_wc(void *buf)
Definition: value.c:1207
union value::@27 res
int64_t num_t
Definition: common.h:87
void value_dump(struct value *value, struct dump_info *ud)
Definition: value.c:1163
int64_t v_i64(struct value *v)
Definition: value.c:337
struct target_thread * global_thread
Definition: target_api.h:2645
ADDR addr
Definition: target_api.h:3269
uint32_t symbol_get_bytesize(struct symbol *symbol)
Definition: debug.c:3065
struct target * target
Definition: target.h:884
int value_update_addr(struct value *value, ADDR v)
Definition: value.c:519
int value_update_num(struct value *value, num_t v)
Definition: value.c:528
int32_t OFFSET
Definition: common.h:65
int value_update(struct value *value, const char *buf, int bufsiz)
Definition: value.c:374
signed char rv_c(void *buf)
Definition: value.c:1205
struct target_thread * thread
Definition: target_api.h:3237
#define verror(format,...)
Definition: log.h:30
unsigned char * target_read_addr(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
Definition: target_api.c:1014
int bufsiz
Definition: target_api.h:3257
struct symbol * symbol_get_datatype(struct symbol *symbol)
Definition: debug.c:2989
wchar_t v_wc(struct value *v)
Definition: value.c:329
loctype_t symbol_resolve_location(struct symbol *symbol, struct location_ctxt *lctxt, struct location *o_loc)
Definition: location.c:546
OFFSET offset
Definition: dwdebug_priv.h:603
#define vwarn(format,...)
Definition: log.h:33
int value_set_mmap(struct value *value, ADDR addr, struct memcache_mmap_entry *mme, char *offset_ptr)
Definition: value.c:35
int symbol_type_is_char(struct symbol *type)
Definition: debug.c:4224
REGVAL target_read_reg(struct target *target, tid_t tid, REG reg)
Definition: target_api.c:1083
uint8_t isconst
Definition: target_api.h:3260
int8_t rv_i8(void *buf)
Definition: value.c:1212
int value_refresh_diff(struct value *value, int recurse, value_diff_t *vdiff, char **old_buf, int *old_bufsiz, value_hash_t *old_vhash)
Definition: value.c:320
unsigned char v_uc(struct value *v)
Definition: value.c:328
#define LOCATION_OFFSET(loc)
Definition: dwdebug_priv.h:624
int value_update_c(struct value *value, signed char v)
Definition: value.c:407
char * prefix
Definition: output.h:25
uintptr_t value_hash_t
Definition: target_api.h:1633
long double rv_dd(void *buf)
Definition: value.c:1218
uint8_t isstring
Definition: target_api.h:3260
int value_update_u8(struct value *value, uint8_t v)
Definition: value.c:431
ADDR res_ip
Definition: target_api.h:3276
datatype_code_t datatype_code
Definition: dwdebug_priv.h:827
struct value * value_create_raw(struct target *target, struct target_thread *thread, struct memrange *range, int len)
Definition: value.c:77
double rv_d(void *buf)
Definition: value.c:1217
ADDR rv_addr(void *buf)
Definition: value.c:1219
float rv_f(void *buf)
Definition: value.c:1216
int value_update_i64(struct value *value, int64_t v)
Definition: value.c:487
struct addrspace * space
Definition: target.h:926
char * buf
Definition: target_api.h:3258
int value_refresh(struct value *value, int recursive)
Definition: value.c:271
#define PRIxNUM
Definition: common.h:91
int value_update_dd(struct value *value, long double v)
Definition: value.c:511
int value_set_child(struct value *value, struct value *parent_value, ADDR addr)
Definition: value.c:53
#define SYMBOLX_ENCODING_V(sym)
int value_update_wc(struct value *value, wchar_t v)
Definition: value.c:423
struct value * parent_value
Definition: target_api.h:3278
struct memrange * range
Definition: target_api.h:3255
char * name
Definition: dwdebug_priv.h:788
int value_update_uc(struct value *value, unsigned char v)
Definition: value.c:415
int value_update_i8(struct value *value, int8_t v)
Definition: value.c:463
struct value * value_create_type(struct target_thread *thread, struct memrange *range, struct symbol *type)
Definition: value.c:102
void value_free(struct value *value)
Definition: value.c:224
#define PRIxSMOFFSET
Definition: common.h:102
unsigned char rv_uc(void *buf)
Definition: value.c:1206
int len
Definition: dumptarget.c:52
struct value * value_clone(struct value *in)
Definition: value.c:195
#define RHOLD(x, hx)
Definition: common.h:622
int value_update_u16(struct value *value, uint16_t v)
Definition: value.c:439
REGVAL target_read_creg(struct target *target, tid_t tid, common_reg_t reg)
Definition: target_api.c:1119
int value_set_addr(struct value *value, ADDR addr)
Definition: value.c:28
ADDR v_addr(struct value *v)
Definition: value.c:371
FILE * stream
Definition: output.h:26
struct symbol * symbol_type_skip_qualifiers(struct symbol *type)
Definition: debug.c:4191
struct memregion * region
Definition: target.h:981
num_t v_num(struct value *v)
Definition: value.c:338
#define VSBPA(msg,...)
struct value * value_create(struct target_thread *thread, struct memrange *range, struct lsymbol *lsymbol, struct symbol *type)
Definition: value.c:138
int value_set_reg(struct value *value, REG reg)
Definition: value.c:45
int value_update_unum(struct value *value, unum_t v)
Definition: value.c:543
struct target * target
Definition: target_api.h:2041
double v_d(struct value *v)
Definition: value.c:369
uint32_t REGVAL
Definition: common.h:66
int16_t rv_i16(void *buf)
Definition: value.c:1213
uint32_t rv_u32(void *buf)
Definition: value.c:1210
int64_t rv_i64(void *buf)
Definition: value.c:1215
unsigned int symbol_type_full_bytesize(struct symbol *type)
Definition: debug.c:4267
char * v_string(struct value *v)
Definition: value.c:372
uint16_t v_u16(struct value *v)
Definition: value.c:331
int8_t REG
Definition: common.h:93
struct lsymbol * lsymbol
Definition: target_api.h:3252
uint32_t ADDR
Definition: common.h:64
#define VSBP(msg)
char * name
Definition: target_api.h:2483
struct symbol * type
Definition: target_api.h:3247
uint64_t v_u64(struct value *v)
Definition: value.c:333
#define SYMBOLX_VAR_CONSTVAL(sym)
uint64_t rv_u64(void *buf)
Definition: value.c:1211
int value_update_u64(struct value *value, uint64_t v)
Definition: value.c:455
int32_t rv_i32(void *buf)
Definition: value.c:1214
Definition: memcache.h:110
int32_t v_i32(struct value *v)
Definition: value.c:336
uint32_t REFCNT
Definition: common.h:124
#define PRIxADDR
Definition: common.h:67
int detail
Definition: output.h:28
uint8_t v_u8(struct value *v)
Definition: value.c:330
signed char v_c(struct value *v)
Definition: value.c:327
int value_update_u32(struct value *value, uint32_t v)
Definition: value.c:447
value_diff_t
Definition: target_api.h:1626
char * symbol_get_name(struct symbol *symbol)
Definition: debug.c:2587
#define RPUT(x, objtype, hx, rc)
Definition: common.h:624
int value_update_zero(struct value *value, const char *buf, int bufsiz)
Definition: value.c:389
uint8_t ismmap
Definition: target_api.h:3260
struct array_list * chain
Definition: dwdebug.h:1016
uint64_t unum_t
Definition: common.h:88
uint32_t v_u32(struct value *v)
Definition: value.c:332
void value_set_const(struct value *value)
Definition: value.c:73
int meta
Definition: output.h:27
REG reg
Definition: target_api.h:3270
float v_f(struct value *v)
Definition: value.c:368
unum_t v_unum(struct value *v)
Definition: value.c:353
ADDR value_addr(struct value *value)
Definition: value.c:244
#define PRIuNUM
Definition: common.h:89
loctype_t
Definition: dwdebug.h:234
struct symbol * datatype
Definition: dwdebug_priv.h:925
int value_update_d(struct value *value, double v)
Definition: value.c:503