static inline int arm_exidx_step (struct cursor *c) { unw_word_t old_ip, old_cfa; uint8_t buf[32]; int ret; old_ip = c->dwarf.ip; old_cfa = c->dwarf.cfa; /* mark PC unsaved */ c->dwarf.loc[UNW_ARM_R15] = DWARF_NULL_LOC; unw_word_t ip = c->dwarf.ip; if (c->dwarf.use_prev_instr) --ip; /* check dynamic info first --- it overrides everything else */ ret = unwi_find_dynamic_proc_info (c->dwarf.as, ip, &c->dwarf.pi, 1, c->dwarf.as_arg); if (ret == -UNW_ENOINFO) { if ((ret = tdep_find_proc_info (&c->dwarf, ip, 1)) < 0) return ret; } if (c->dwarf.pi.format != UNW_INFO_FORMAT_ARM_EXIDX) return -UNW_ENOINFO; ret = arm_exidx_extract (&c->dwarf, buf); if (ret == -UNW_ESTOPUNWIND) return 0; else if (ret < 0) return ret; ret = arm_exidx_decode (buf, ret, &c->dwarf); if (ret < 0) return ret; if (c->dwarf.ip == old_ip && c->dwarf.cfa == old_cfa) { Dprintf ("%s: ip and cfa unchanged; stopping here (ip=0x%lx)\n", __FUNCTION__, (long) c->dwarf.ip); return -UNW_EBADFRAME; } c->dwarf.pi_valid = 0; return (c->dwarf.ip == 0) ? 0 : 1; }
static inline int arm_exidx_step (struct cursor *c) { unw_word_t old_ip, old_cfa; uint8_t buf[32]; int ret; old_ip = c->dwarf.ip; old_cfa = c->dwarf.cfa; /* mark PC unsaved */ c->dwarf.loc[UNW_ARM_R15] = DWARF_NULL_LOC; if ((ret = tdep_find_proc_info (&c->dwarf, c->dwarf.ip, 1)) < 0) return ret; if (c->dwarf.pi.format != UNW_INFO_FORMAT_ARM_EXIDX) return -UNW_ENOINFO; ret = arm_exidx_extract (&c->dwarf, buf); if (ret == -UNW_ESTOPUNWIND) return 0; else if (ret < 0) return ret; ret = arm_exidx_decode (buf, ret, &c->dwarf); if (ret < 0) return ret; if (c->dwarf.ip == old_ip && c->dwarf.cfa == old_cfa) { Dprintf ("%s: ip and cfa unchanged; stopping here (ip=0x%lx)\n", __FUNCTION__, (long) c->dwarf.ip); return -UNW_EBADFRAME; } return (c->dwarf.ip == 0) ? 0 : 1; }