From e685526c25f41c14b444773958b080fe4415936b Mon Sep 17 00:00:00 2001 From: Alexander Monakov Date: Sat, 13 Jul 2013 01:05:39 +0400 Subject: [PATCH] thirdparty/libbacktrace: update from upstream --- thirdparty/libbacktrace/ChangeLog | 9 ++++++ thirdparty/libbacktrace/elf.c | 46 +++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/thirdparty/libbacktrace/ChangeLog b/thirdparty/libbacktrace/ChangeLog index 2fd4e8a..d6f7205 100644 --- a/thirdparty/libbacktrace/ChangeLog +++ b/thirdparty/libbacktrace/ChangeLog @@ -1,3 +1,12 @@ +2013-07-23 Alexander Monakov + + * elf.c (elf_syminfo): Loop over the elf_syminfo_data chain. + +2013-07-23 Alexander Monakov + + * elf.c (backtrace_initialize): Pass elf_fileline_fn to + dl_iterate_phdr callbacks. + 2013-03-25 Ian Lance Taylor * alloc.c: #include . diff --git a/thirdparty/libbacktrace/elf.c b/thirdparty/libbacktrace/elf.c index ef9bcdf..c1dbc54 100644 --- a/thirdparty/libbacktrace/elf.c +++ b/thirdparty/libbacktrace/elf.c @@ -454,12 +454,46 @@ elf_syminfo (struct backtrace_state *state, uintptr_t pc, void *data) { 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) callback (data, pc, NULL, 0); else @@ -862,7 +896,7 @@ backtrace_initialize (struct backtrace_state *state, int descriptor, pd.state = state; pd.error_callback = error_callback; pd.data = data; - pd.fileline_fn = fileline_fn; + pd.fileline_fn = &elf_fileline_fn; pd.found_sym = &found_sym; pd.found_dwarf = &found_dwarf; -- 2.43.0