1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2025-02-17 02:31:41 +01:00

dwarf: fix local & remote table lookup

(Logical change 1.256)
This commit is contained in:
com[davidm]!marky 2004-08-24 08:19:00 +00:00
parent a5e41807d2
commit 271f706944

View file

@ -232,15 +232,12 @@ lookup (struct table_entry *table, size_t table_size, int32_t rel_ip)
if (rel_ip < e->start_ip_offset)
hi = mid;
else
{
if (mid + 1 >= table_len
|| rel_ip < table[mid + 1].start_ip_offset)
return e;
else
lo = mid + 1;
}
lo = mid + 1;
}
return NULL;
if (hi <= 0)
return NULL;
e = table + hi - 1;
return e;
}
#endif /* !UNW_REMOTE_ONLY */
@ -252,14 +249,14 @@ lookup (struct table_entry *table, size_t table_size, int32_t rel_ip)
occurred reading remote memory. */
static int
remote_lookup (unw_addr_space_t as,
unw_word_t table, size_t table_size, unw_word_t rel_ip,
unw_word_t table, size_t table_size, int32_t rel_ip,
struct table_entry *e, void *arg)
{
unsigned long table_len = table_size / sizeof (struct table_entry);
unw_word_t start = ~(unw_word_t) 0, end = 0;
unw_accessors_t *a = unw_get_accessors (as);
unsigned long lo, hi, mid;
unw_word_t e_addr = 0;
int32_t start;
int ret;
/* do a binary search for right entry: */
@ -273,24 +270,13 @@ remote_lookup (unw_addr_space_t as,
if (rel_ip < start)
hi = mid;
else
{
if (mid + 1 >= table_len)
break;
e_addr += 4; /* skip over fde_offset to next table-entry */
if ((ret = dwarf_reads32 (as, a, &e_addr, &end, arg)) < 0)
return ret;
if (rel_ip >= end)
lo = mid + 1;
else
break;
}
lo = mid + 1;
}
if (rel_ip < start)
if (hi <= 0)
return 0;
e->start_ip_offset = start;
if ((ret = dwarf_reads32 (as, a, &e_addr, &e->fde_offset, arg)) < 0)
e_addr = table + (hi - 1) * sizeof (struct table_entry);
if ((ret = dwarf_reads32 (as, a, &e_addr, &e->start_ip_offset, arg)) < 0
|| (ret = dwarf_reads32 (as, a, &e_addr, &e->fde_offset, arg)) < 0)
return ret;
return 1;
}