]> git.cworth.org Git - apitrace/commitdiff
thirdparty/libbacktrace: update from upstream
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 12 Jul 2013 21:05:39 +0000 (01:05 +0400)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 20 Sep 2013 13:51:54 +0000 (14:51 +0100)
thirdparty/libbacktrace/ChangeLog
thirdparty/libbacktrace/elf.c

index 2fd4e8a3e6369757ab5fcc6c0ffcfb21da42e5c0..d6f7205f1d1bbd3051611d4252380933fc84b570 100644 (file)
@@ -1,3 +1,12 @@
+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>
+
+       * elf.c (backtrace_initialize): Pass elf_fileline_fn to
+       dl_iterate_phdr callbacks.
+
 2013-03-25  Ian Lance Taylor  <iant@google.com>
 
        * alloc.c: #include <sys/types.h>.
index ef9bcdfb495d935069ed5bd15ed221341f22c441..c1dbc5492e0ef261def2b99c7c177890c1172593 100644 (file)
@@ -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;