mirror of git://gcc.gnu.org/git/gcc.git
elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.
* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain. From-SVN: r201159
This commit is contained in:
parent
0153887c3d
commit
78625ce608
|
|
@ -1,3 +1,7 @@
|
||||||
|
2013-07-23 Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
|
||||||
|
* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.
|
||||||
|
|
||||||
2013-07-23 Alexander Monakov <amonakov@ispras.ru>
|
2013-07-23 Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
|
||||||
* elf.c (backtrace_initialize): Pass elf_fileline_fn to
|
* elf.c (backtrace_initialize): Pass elf_fileline_fn to
|
||||||
|
|
|
||||||
|
|
@ -454,12 +454,46 @@ elf_syminfo (struct backtrace_state *state, uintptr_t pc,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
struct elf_syminfo_data *edata;
|
struct elf_syminfo_data *edata;
|
||||||
struct elf_symbol *sym;
|
struct elf_symbol *sym = NULL;
|
||||||
|
|
||||||
|
if (!state->threaded)
|
||||||
|
{
|
||||||
|
for (edata = (struct elf_syminfo_data *) state->syminfo_data;
|
||||||
|
edata != NULL;
|
||||||
|
edata = edata->next)
|
||||||
|
{
|
||||||
|
sym = ((struct elf_symbol *)
|
||||||
|
bsearch (&pc, edata->symbols, edata->count,
|
||||||
|
sizeof (struct elf_symbol), elf_symbol_search));
|
||||||
|
if (sym != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct elf_syminfo_data **pp;
|
||||||
|
|
||||||
|
pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
edata = *pp;
|
||||||
|
/* Atomic load. */
|
||||||
|
while (!__sync_bool_compare_and_swap (pp, edata, edata))
|
||||||
|
edata = *pp;
|
||||||
|
|
||||||
|
if (edata == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
sym = ((struct elf_symbol *)
|
||||||
|
bsearch (&pc, edata->symbols, edata->count,
|
||||||
|
sizeof (struct elf_symbol), elf_symbol_search));
|
||||||
|
if (sym != NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pp = &edata->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
edata = (struct elf_syminfo_data *) state->syminfo_data;
|
|
||||||
sym = ((struct elf_symbol *)
|
|
||||||
bsearch (&pc, edata->symbols, edata->count,
|
|
||||||
sizeof (struct elf_symbol), elf_symbol_search));
|
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
callback (data, pc, NULL, 0);
|
callback (data, pc, NULL, 0);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue