27 #include <elfutils/libebl.h>
28 #include <elfutils/libdw.h>
29 #include <elfutils/libdwfl.h>
40 static const unsigned char *__read_encoded(
unsigned int encoding,
41 unsigned int wordsize,
42 const unsigned char *readp,
43 const unsigned char *
const endp,
44 uint64_t *res,Dwarf *dbg);
86 #define DWARF_CFA_REG INT8_MAX
131 g_hash_table_iter_init(&iter,fde->
regrules);
132 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
141 g_hash_table_iter_replace(&iter,NULL);
143 g_hash_table_destroy(fde->
regrules);
156 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
159 g_hash_table_iter_replace(&iter,NULL);
170 const unsigned char *buf,
unsigned int len,
171 GHashTable *regrules) {
177 const unsigned char *readp = buf;
178 const unsigned char *
const endp = readp +
len;
191 GSList *stack = NULL;
192 GHashTable *stackhash;
212 inline void __insert_regrule(
ADDR pc,uint64_t
reg,
228 g_hash_table_lookup(regrules,(gpointer)(uintptr_t)reg);
230 _cl =
calloc(1,
sizeof(*_cl));
234 g_hash_table_insert(regrules,(gpointer)(uintptr_t)reg,_cl);
238 g_hash_table_lookup(regrules,(gpointer)(uintptr_t)reg);
240 vwarn(
"r%"PRIu64
" already has a default value in CIE 0x%lx;"
241 " will overwrite!\n",reg,(
unsigned long)cie->
offset);
244 g_hash_table_insert(regrules,(gpointer)(uintptr_t)reg,rr);
248 while (readp < endp) {
263 case 2: wordsize = 2;
break;
264 case 3: wordsize = 4;
break;
265 case 4: wordsize = 8;
break;
269 const unsigned char *base = readp;
277 + (base - (
unsigned char *)debugfile->
frametab);
295 case DW_CFA_advance_loc ... (DW_CFA_advance_loc + 0x3f):
299 "DW_CFA_advance_loc %u to 0x%"PRIxADDR"\n",op1,pc);
301 case DW_CFA_advance_loc1:
304 "DW_CFA_advance_loc1 %u to 0x%"PRIxADDR"\n",*readp,pc);
307 case DW_CFA_advance_loc2:
311 "DW_CFA_advance_loc2 %"PRIu64
" to 0x%"PRIxADDR"\n",op1,pc);
313 case DW_CFA_advance_loc4:
317 "DW_CFA_advance_loc4 %"PRIu64
" to 0x%"PRIxADDR
"\n",op1,pc);
319 case DW_CFA_MIPS_advance_loc8:
323 "DW_CFA_MIPS_advance_loc8 %"PRIu64
" to 0x%"PRIxADDR
"\n",
335 "DW_CFA_def_cfa r%"PRIu64
" at offset %"PRIu64
"\n",op1,op2);
337 rr =
calloc(1,
sizeof(*rr));
340 rr->
offset.offset = (int64_t)op2;
342 __insert_regrule(pc,DWARF_CFA_REG,rr);
346 case DW_CFA_def_cfa_sf:
351 "DW_CFA_def_cfa_sf r%"PRIu64
" at offset %"PRId64
"\n",
354 rr =
calloc(1,
sizeof(*rr));
359 __insert_regrule(pc,DWARF_CFA_REG,rr);
363 case DW_CFA_def_cfa_register:
367 rr =
calloc(1,
sizeof(*rr));
374 "DW_CFA_def_cfa_register r%"PRIu64
375 " (current offset %"PRId64
")\n",
383 vwarn(
"DW_CFA_def_cfa_register r%"PRIu64
" but no current CFA"
384 " regrule to get last CFA offset; assuming offset 0!\n",
388 __insert_regrule(pc,DWARF_CFA_REG,rr);
392 case DW_CFA_def_cfa_offset:
396 rr =
calloc(1,
sizeof(*rr));
400 rr->
offset.offset = (int64_t)op1;
403 "DW_CFA_def_cfa_offset offset %"PRId64
404 " (current r%"PRIu64
")\n",
405 (int64_t)op1,rr->
offset.reg);
410 rr->
offset.offset = (int64_t)op1;
412 vwarn(
"DW_CFA_def_cfa_offset offset %"PRIu64
" but no current CFA"
413 " regrule to get last CFA offset; assuming reg 0!\n",
417 __insert_regrule(pc,DWARF_CFA_REG,rr);
421 case DW_CFA_def_cfa_offset_sf:
427 rr =
calloc(1,
sizeof(*rr));
433 "DW_CFA_def_cfa_offset_sf offset %"PRId64
434 " (current r%"PRIu64
")\n",
438 vwarn(
"DW_CFA_def_cfa_offset_sf offset %"PRId64
" but no current CFA"
439 " regrule to get last CFA offset; skipping!!\n",
444 __insert_regrule(pc,DWARF_CFA_REG,rr);
448 case DW_CFA_def_cfa_expression:
452 "DW_CFA_def_cfa_expression len %"PRIu64
"\n",op1);
454 rr =
calloc(1,
sizeof(*rr));
456 rr->
block.block = readp;
459 __insert_regrule(pc,DWARF_CFA_REG,rr);
468 case DW_CFA_undefined:
473 rr =
calloc(1,
sizeof(*rr));
476 __insert_regrule(pc,op1,rr);
479 case DW_CFA_same_value:
484 rr =
calloc(1,
sizeof(*rr));
487 __insert_regrule(pc,op1,rr);
507 rr =
calloc(1,
sizeof(*rr));
512 __insert_regrule(pc,op1,rr);
515 case (DW_CFA_offset + 1) ... (DW_CFA_offset + 0x3f):
523 rr =
calloc(1,
sizeof(*rr));
528 __insert_regrule(pc,op1,rr);
531 case DW_CFA_offset_extended:
537 "DW_CFA_offset_extended r%"PRIu64
" at cfa%+"PRId64
"\n",
540 rr =
calloc(1,
sizeof(*rr));
545 __insert_regrule(pc,op1,rr);
548 case DW_CFA_offset_extended_sf:
554 "DW_CFA_offset_extended_sf r%"PRIu64
" at cfa%+"PRId64
"\n",
557 rr =
calloc(1,
sizeof(*rr));
562 __insert_regrule(pc,op1,rr);
566 case DW_CFA_GNU_negative_offset_extended:
571 "DW_CFA_negative_offset_extended r%"PRIu64
" at cfa-%"PRIu64
"\n",
574 rr =
calloc(1,
sizeof(*rr));
577 rr->
offset.offset = -(int64_t)op2;
579 __insert_regrule(pc,op1,rr);
582 case DW_CFA_val_offset:
588 "DW_CFA_val_offset r%"PRIu64
" at offset %"PRId64
"\n",
591 rr =
calloc(1,
sizeof(*rr));
596 __insert_regrule(pc,op1,rr);
599 case DW_CFA_val_offset_sf:
605 "DW_CFA_val_offset_sf r%"PRIu64
" at offset %"PRId64
"\n",
608 rr =
calloc(1,
sizeof(*rr));
613 __insert_regrule(pc,op1,rr);
616 case DW_CFA_register:
621 "DW_CFA_register r%"PRIu64
" in r%"PRIu64
"\n",op1,op2);
623 rr =
calloc(1,
sizeof(*rr));
627 __insert_regrule(pc,op1,rr);
630 case DW_CFA_expression:
635 "DW_CFA_expression r%"PRIu64
" len %"PRIu64
"\n",op1,op2);
637 rr =
calloc(1,
sizeof(*rr));
639 rr->
block.block = readp;
642 __insert_regrule(pc,op1,rr);
646 case DW_CFA_val_expression:
651 "DW_CFA_val_expression r%"PRIu64
" len %"PRIu64
"\n",op1,op2);
653 rr =
calloc(1,
sizeof(*rr));
655 rr->
block.block = readp;
658 __insert_regrule(pc,op1,rr);
662 case DW_CFA_restore ... (DW_CFA_restore + 0x3f):
666 rr =
calloc(1,
sizeof(*rr));
669 (gpointer)(uintptr_t)op1);
672 "no default regrule for r%"PRIu64
"; undefining!\n",op1);
676 memcpy(rr,def_rr,
sizeof(*rr));
679 __insert_regrule(pc,op1,rr);
682 case DW_CFA_restore_extended:
687 rr =
calloc(1,
sizeof(*rr));
690 (gpointer)(uintptr_t)op1);
693 "no default regrule for r%"PRIu64
"; undefining!\n",op1);
697 memcpy(rr,def_rr,
sizeof(*rr));
700 __insert_regrule(pc,op1,rr);
707 case DW_CFA_remember_state:
714 stackhash = g_hash_table_new(g_direct_hash,g_direct_equal);
715 g_hash_table_iter_init(&iter,regrules);
716 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
720 g_hash_table_insert(stackhash,kp,tmp_rr);
728 stack = g_slist_prepend(stack,stackhash);
731 g_hash_table_size(stackhash));
734 case DW_CFA_restore_state:
740 verror(
"no stack for DW_CFA_restore_state; underflow; ignoring!\n");
744 stackhash = (GHashTable *)g_slist_nth_data(stack,0);
745 stack = g_slist_remove(stack,stackhash);
747 g_hash_table_iter_init(&iter,stackhash);
748 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
750 rr =
calloc(1,
sizeof(*rr));
751 memcpy(rr,tmp_rr,
sizeof(*rr));
752 __insert_regrule(pc,(uint64_t)(uintptr_t)kp,rr);
756 g_hash_table_size(stackhash));
758 g_hash_table_destroy(stackhash);
765 case DW_CFA_GNU_args_size:
769 "DW_CFA_args_size %"PRIu64
"; ignoring\n",op1);
776 verror(
"unrecognized DW_CFA_??? opcode (%u); skipping!!\n",opcode);
785 unsigned char *buf,
unsigned int len,Dwarf *dbg) {
795 ptrdiff_t
offset,cie_offset;
800 unsigned char *unit_end;
802 uint_fast8_t version;
803 unsigned int code_alignment_factor;
804 int data_alignment_factor;
805 unsigned int fde_encoding;
806 unsigned int lsda_encoding;
807 uint_fast8_t segment_size;
808 unsigned int return_address_register;
811 uint64_t personality;
822 ddi->
cfa_cie = g_hash_table_new(g_direct_hash,g_direct_equal);
827 const unsigned char *readp = (
unsigned char *)buf;
828 const unsigned char *
const end = readp +
len;
830 while (readp < end) {
833 verror(
"invalid CIE/FDE data at offset 0x%lx!\n",
834 (
unsigned long)(readp - buf));
840 offset = readp - (
unsigned char *)buf;
843 if (
unlikely(unit_len == 0xffffffff)) {
845 verror(
"CIE/FDE is too short for length field!\n");
858 start = readp - (
unsigned char *)buf;
859 unit_end = (
unsigned char *)readp + unit_len;
860 if (
unlikely(unit_end > end || (readp + hlen) > end)) {
861 verror(
"CIE/FDE len exceeds data!\n");
868 cie_id = DW_CIE_ID_64;
876 if (cie_id == (ddi->
is_eh_frame ? 0 : DW_CIE_ID_64)) {
882 readp = memchr(readp,
'\0',(
char *)unit_end - aug);
884 verror(
"unterminated augmentation string!\n");
885 goto invalid_cie_data;
891 && !(aug[0] ==
'e' && aug[1] ==
'h')
893 verror(
"unrecognized augmentation string '%s'; skipping!\n",
895 goto invalid_cie_data;
900 if (unit_end - readp < 5) {
901 verror(
"invalid version 4 CIE (not long enough for"
902 " wordsize, segment_size, code/data alignment"
903 " factors, return address register)!\n");
904 goto invalid_cie_data;
907 segment_size = *readp++;
909 if (!(
likely(wordsize == 4 || wordsize == 8))) {
910 verror(
"bad wordsize %d in CIE 0x%"PRIxPTR
"!\n",
912 goto invalid_cie_data;
922 if (aug[0] ==
'e' && aug[1] ==
'h')
926 return_address_register = *readp++;
932 "CIE 0x%lx length=%"PRIu64
" id=%"PRIu64
" version=%u"
933 " augmentation='%s' address_size=%u segment_size=%u"
934 " code_factor=%u data_factor=%d return_address_register=%u\n",
935 (
unsigned long)offset,(uint64_t)unit_len,(uint64_t)cie_id,
936 version,aug,wordsize,segment_size,code_alignment_factor,
937 data_alignment_factor,return_address_register);
946 if (auglen > (
size_t)(end - readp)) {
947 verror(
"invalid augmentation length %d\n",
949 goto invalid_cie_data;
952 const char *cp = aug + 1;
953 while (*cp !=
'\0') {
955 fde_encoding = *readp++;
957 else if (*cp ==
'L') {
958 lsda_encoding = *readp++;
960 else if (*cp ==
'P') {
963 unsigned int encoding = *readp++;
965 readp = __read_encoded(encoding,
967 readp,readp - 1 + auglen,
971 vwarn(
"unrecognized augmentation substring (%s);"
972 " trying to skip substring (CIE 0x%lx)!\n",
973 (
char *)readp,(
unsigned long)offset);
982 cie =
calloc(1,
sizeof(*cie));
993 g_hash_table_new(g_direct_hash,g_direct_equal);
996 memchr(aug,
'\0',(
size_t)(unit_end - (
unsigned char *)aug))
999 g_hash_table_insert(ddi->
cfa_cie,(gpointer)offset,cie);
1009 verror(
"invalid CIE (0x%lx) data at offset 0x%lx!\n",
1010 (
unsigned long)offset,(
unsigned long)(readp - buf));
1020 ? start - (ptrdiff_t)cie_id : (ptrdiff_t)cie_id;
1023 g_hash_table_lookup(ddi->
cfa_cie,(gpointer)cie_offset);
1025 verror(
"invalid CIE reference 0x%lx in FDE 0x%lx; skipping FDE!\n",
1026 (
unsigned long)cie_offset,(
unsigned long)offset);
1030 fde =
calloc(1,
sizeof(*fde));
1037 case 2: wordsize = 2;
break;
1038 case 3: wordsize = 4;
break;
1039 case 4: wordsize = 8;
break;
1043 const unsigned char *base = readp;
1054 + (base - (
unsigned char *)debugfile->
frametab);
1071 "FDE 0x%lx length=%"PRIu64
" cie=0x%lx id=%"PRIx64
1073 (
unsigned long)offset,(uint64_t)unit_len,
1074 (
unsigned long)cie->
offset,(uint64_t)cie_id,
1090 if (cie->
aug[0] ==
'z') {
1095 const char *cp = cie->
aug + 1;
1097 while (*cp !=
'\0') {
1099 uint64_t lsda_pointer;
1100 const unsigned char *
p =
1102 &readp[u],&readp[auglen],
1112 while (u < auglen) {
1123 fde->
len = unit_end - readp;
1139 verror(
"error (?) addding FDE for 0x%"PRIxADDR
",0x%"PRIxADDR
";"
1142 dwarf_cfa_fde_free(fde);
1147 "addr exists while adding FDE for 0x%"PRIxADDR
","
1150 dwarf_cfa_fde_free(fde);
1166 fde->
regrules = g_hash_table_new(g_direct_hash,g_direct_equal);
1170 verror(
"error while decoding FDE 0x%lx (CIE 0x%lx)!\n",
1183 cl = g_hash_table_lookup(fde->
regrules,(gpointer)(uintptr_t)reg);
1209 if (!lctxt || !lctxt->
ops) {
1210 verror(
"could not get location ops for current frame %d!\n",
1218 verror(
"no location_ops->getsymbol for current frame %d!\n",
1236 verror(
"no location_ops->setcurrentframe for current frame %d!\n",
1242 verror(
"failed to setcurrentframe from %d to %d!\n",
1249 verror(
"failed to setcurrentframe from %d to %d!\n",
1269 verror(
"could not read CFA pseudo-reg %"PRIu64
" value"
1277 verror(
"could not read reg %"PRIu64
" value"
1282 addr = rv + rr->
offset.offset;
1283 if (lops->
readword(lctxt,addr,&word)) {
1290 *o_regval = (
REGVAL)word;
1302 verror(
"could not read CFA pseudo-reg %"PRIu64
" value"
1305 verror(
"could not read reg %"PRIu64
" value"
1319 verror(
"could not read reg %"PRIu64
" value"
1320 " as the value for reg %"PRIiREG"!\n",rr->
reg,reg);
1331 memset(&loc,0,
sizeof(loc));
1336 verror(
"error evaluating DWARF expr for frame %d (symbol %s):"
1340 verror(
"error evaluating DWARF expr for frame %d (symbol %s):"
1341 " unexpected expr result %d!\n",
1346 if (lops->
readword(lctxt,addr,&word)) {
1353 *o_regval = (
REGVAL)word;
1359 memset(&loc,0,
sizeof(loc));
1364 verror(
"error evaluating DWARF expr for frame %d (symbol %s):"
1368 verror(
"error evaluating DWARF expr for frame %d (symbol %s):"
1369 " unexpected expr result %d!\n",
1382 verror(
"unknown DWARF CFA register rule %d; BUG!\n",rr->
rrt);
1398 struct symbol *symbol;
1411 if (!lctxt || !lctxt->
ops) {
1418 if (!debugfile->
priv) {
1434 saddr = symbol->
addr;
1447 "using symbol %s instead of inline instance of %s for CFA\n",
1452 vwarn(
"inlined %s not in parent func; BUG?!\n",sname);
1457 vwarn(
"could not check CREG_SP for equivalence with DWARF CFA reg;"
1458 " things might break!\n");
1460 else if (reg == spreg) {
1462 "reading CFA pseudo-reg to get SP value in current frame %d\n",
1473 verror(
"could not get debuginfo IP reg number!\n");
1478 if (lops->
readreg(lctxt,ipreg,&ip)) {
1494 " symbol '%s' at addr 0x%"PRIxADDR"!\n",
1499 if (!fde && symbol) {
1506 scope = symbol->
scope;
1512 NULL,NULL,(
void **)&fde);
1516 "found DWARF CFA FDE at addr 0x%"PRIxADDR" symbol '%s'"
1517 " containing symbol '%s' addr 0x%"PRIxADDR";"
1518 " probably inlined\n",
1524 "found DWARF CFA FDE at scope addr 0x%"PRIxADDR
1525 " containing symbol '%s' addr 0x%"PRIxADDR";"
1526 " probably inlined\n",
1538 " symbol '%s' at addr 0x%"PRIxADDR"!\n",
1550 verror(
"error while decoding DWARF CFA FDE for symbol '%s'"
1564 "could not find DWARF CFA regrule for reg %d at"
1567 errno = EADDRNOTAVAIL;
1574 rc = dwarf_cfa_fde_run_regrule(debugfile,fde,rr,lctxt,reg,&retval);
1576 verror(
"could not load register %d in FDE 0x%lx CIE 0x%lx!\n",
1577 reg,(
unsigned long)fde->
offset,(
unsigned long)cie->
offset);
1584 "read CFA pseudo-reg value 0x%"PRIxADDR" in current frame %d\n",
1590 "read CFA pseudo-reg to get SP value in current frame %d;"
1614 struct symbol *symbol;
1625 if (!lctxt || !lctxt->
ops) {
1632 if (!debugfile->
priv) {
1652 saddr = symbol->
addr;
1677 verror(
"could not get debuginfo IP reg number!\n");
1683 verror(
"IP register value not in current frame %d; BUG!\n",
1701 " symbol '%s' at addr 0x%"PRIxADDR"!\n",
1704 verror(
"error looking up DWARF CFA FDE for IP 0x%"PRIxADDR
"!\n",ip);
1715 scope = symbol->
scope;
1721 NULL,NULL,(
void **)&fde);
1725 "found DWARF CFA FDE at addr 0x%"PRIxADDR" symbol '%s'"
1726 " containing symbol '%s' addr 0x%"PRIxADDR";"
1727 " probably inlined\n",
1733 "found DWARF CFA FDE at scope addr 0x%"PRIxADDR
1734 " containing symbol '%s' addr 0x%"PRIxADDR";"
1735 " probably inlined\n",
1747 " symbol '%s' at addr 0x%"PRIxADDR"!\n",
1759 verror(
"error while decoding DWARF CFA FDE for symbol '%s'"
1771 verror(
"could not find DWARF CFA regrule for retaddr reg %d at"
1780 rc = dwarf_cfa_fde_run_regrule(debugfile,fde,rr,lctxt,
1783 verror(
"could not load return address register %d"
1784 " in FDE 0x%lx CIE 0x%lx!\n",
1786 (
unsigned long)cie->
offset);
1791 *o_retaddr = retval;
1795 static void __dwarf_cfa_dtor(Word_t start,Word_t end,
void *data,
void *dtor_data) {
1799 dwarf_cfa_fde_free(fde);
1804 GHashTableIter iter;
1808 if (!debugfile->
priv)
1819 g_hash_table_iter_init(&iter,ddi->
cfa_cie);
1820 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
1822 dwarf_cfa_cie_free(cie);
1823 g_hash_table_iter_replace(&iter,NULL);
1825 g_hash_table_destroy(ddi->
cfa_cie);
1835 static const unsigned char *__read_encoded(
unsigned int encoding,
1836 unsigned int wordsize,
1837 const unsigned char *readp,
1838 const unsigned char *
const endp,
1839 uint64_t *res,Dwarf *dbg) {
1846 if ((encoding & 0xf) == DW_EH_PE_absptr)
1847 encoding = (wordsize == 4) ? DW_EH_PE_udata4 : DW_EH_PE_udata8;
1849 switch (encoding & 0xf) {
1850 case DW_EH_PE_uleb128:
1854 case DW_EH_PE_sleb128:
1858 case DW_EH_PE_udata2:
1859 if (readp + 2 > endp)
1863 case DW_EH_PE_udata4:
1864 if (readp + 4 > endp)
1868 case DW_EH_PE_udata8:
1869 if (readp + 8 > endp)
1873 case DW_EH_PE_sdata2:
1874 if (readp + 2 > endp)
1878 case DW_EH_PE_sdata4:
1879 if (readp + 4 > endp)
1883 case DW_EH_PE_sdata8:
1884 if (readp + 8 > endp)
1890 verror(
"invalid encoding '%*s' at %p!\n",
1891 (
int)(uintptr_t)(endp - readp),readp,readp);
#define LOCATION_ADDR(loc)
unsigned int code_alignment_factor
#define vwarnopt(level, area, flags, format,...)
void clrangesimple_free(clrangesimple_t clr, clrangesimple_free_dtor dtor, void *dtor_data)
clrangesimple_t clrangesimple_create(void)
GHashTable * default_regrules
void * clmatchone_find(clmatchone_t *clf, Word_t index, Word_t *o_index)
struct location_ops * ops
unsigned int fde_encoding
struct dwarf_cfa_cie * cie
#define read_2sbyte_unaligned_inc(obo, Addr)
#define read_ubyte_unaligned_inc(Nbytes, obo, Addr)
#define get_uleb128(var, addr)
int clmatchone_add(clmatchone_t *clf, Word_t index, void *data)
#define verror(format,...)
int location_ctxt_read_reg(struct location_ctxt *lctxt, REG reg, REGVAL *o_regval)
int dwarf_unload_cfa(struct debugfile *debugfile)
#define vwarn(format,...)
#define LOCATION_WORD(loc)
int dwarf_cfa_read_retaddr(struct debugfile *debugfile, struct location_ctxt *lctxt, ADDR *o_retaddr)
void clmatchone_free(clmatchone_t clf)
struct symbol *(* getsymbol)(struct location_ctxt *lctxt)
unsigned char * instructions
int data_alignment_factor
#define read_4sbyte_unaligned_inc(obo, Addr)
unsigned int return_address_register
#define read_8ubyte_unaligned_inc(obo, Addr)
int(* readreg)(struct location_ctxt *lctxt, REG regno, REGVAL *regval)
#define vdebug(devel, areas, flags, format,...)
int dwarf_load_cfa(struct debugfile *debugfile, unsigned char *buf, unsigned int len, Dwarf *dbg)
loctype_t dwarf_location_resolve(const unsigned char *data, unsigned int len, struct location_ctxt *lctxt, struct symbol *symbol, struct location *o_loc)
int(* setcurrentframe)(struct location_ctxt *lctxt, int frame)
struct dwarf_cfa_regrule * dwarf_cfa_fde_lookup_regrule(struct dwarf_cfa_fde *fde, REG reg, ADDR obj_addr)
int dwarf_cfa_read_saved_reg(struct debugfile *debugfile, struct location_ctxt *lctxt, REG reg, REGVAL *o_regval)
#define vdebugc(devel, areas, flags, format,...)
void * calloc(size_t nmemb, size_t size)
const unsigned char * block
int dwarf_cfa_program_interpret(struct debugfile *debugfile, struct dwarf_cfa_cie *cie, struct dwarf_cfa_fde *fde, const unsigned char *buf, unsigned int len, GHashTable *regrules)
int(* unrelocate)(struct location_ctxt *lctxt, ADDR real_addr, ADDR *obj_addr)
#define get_sleb128(var, addr)
#define read_4ubyte_unaligned_inc(obo, Addr)
int dwarf_cfa_fde_decode(struct debugfile *debugfile, struct dwarf_cfa_fde *fde)
int clrangesimple_add(clrangesimple_t *clr, Word_t start, Word_t end, void *data)
clmatchone_t clmatchone_create(void)
#define read_2ubyte_unaligned_inc(obo, Addr)
int(* getregno)(struct location_ctxt *lctxt, common_reg_t reg, REG *o_reg)
#define read_8sbyte_unaligned_inc(obo, Addr)
unsigned int lsda_encoding
char * symbol_get_name(struct symbol *symbol)
int clrangesimple_find(clrangesimple_t *clr, Word_t index, Word_t *start, Word_t *end, void **data)
unsigned int isinlineinstance
#define read_sbyte_unaligned_inc(Nbytes, obo, Addr)
#define SYMBOL_IS_FUNC(sym)
int(* readword)(struct location_ctxt *lctxt, ADDR real_addr, ADDR *pval)