<div dir="ltr">Jakub, thanks for the patch.<div>I'd like Alexey to handle this and the next one -- he will reply later, most likely around ~Thu/Fri this week.</div><div><br></div><div>--kcc </div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Jan 10, 2014 at 2:15 PM, Jakub Jelinek <span dir="ltr"><<a href="mailto:jakub@redhat.com" target="_blank">jakub@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Thu, Jan 09, 2014 at 03:11:16PM -0800, Chandler Carruth wrote:<br>
> I've mailed out a patch to the LLVM developer's policy which should clarify<br>
> this. The only thing that would help is for the authors of these three<br>
> patches (and the fourth patch I found later) to just email a copy of the<br>
> patch to llvm-commits, or if any of you have commit access to directly<br>
> commit the patch.<br>
<br>
Here I'm submitting my contribution to the libbacktrace sanitization patch,<br>
which has been posted in<br>
<a href="http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02338.html" target="_blank">http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02338.html</a><br>
Note that Alexey has made quite a few changes to the patch that has been<br>
eventually committed as r196875, so is this post sufficient for Alexey<br>
to commit again his r196875 change?<br>
<br>
--- lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc.jj       2013-11-12 19:35:30.000000000 +0100<br>
+++ lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc  2013-11-19 16:54:56.831724908 +0100<br>
@@ -21,6 +21,7 @@<br>
 #include "sanitizer_placement_new.h"<br>
 #include "sanitizer_procmaps.h"<br>
 #include "sanitizer_symbolizer.h"<br>
+#include "sanitizer_symbolizer_libbacktrace.h"<br>
<br>
 #include <errno.h><br>
 #include <stdlib.h><br>
@@ -367,9 +368,11 @@ class InternalSymbolizer {<br>
 class POSIXSymbolizer : public Symbolizer {<br>
  public:<br>
   POSIXSymbolizer(ExternalSymbolizer *external_symbolizer,<br>
+                 LibbacktraceSymbolizer *libbacktrace_symbolizer,<br>
                   InternalSymbolizer *internal_symbolizer)<br>
       : Symbolizer(),<br>
         external_symbolizer_(external_symbolizer),<br>
+       libbacktrace_symbolizer_(libbacktrace_symbolizer),<br>
         internal_symbolizer_(internal_symbolizer) {}<br>
<br>
   uptr SymbolizeCode(uptr addr, AddressInfo *frames, uptr max_frames) {<br>
@@ -381,7 +384,19 @@ class POSIXSymbolizer : public Symbolize<br>
       return 0;<br>
     const char *module_name = module->full_name();<br>
     uptr module_offset = addr - module->base_address();<br>
-    const char *str = SendCommand(false, module_name, module_offset);<br>
+    const char *str = NULL;<br>
+    if (libbacktrace_symbolizer_)<br>
+      {<br>
+       mu_.CheckLocked();<br>
+       uptr ret<br>
+         = libbacktrace_symbolizer_->SymbolizeCode(addr, frames, max_frames,<br>
+                                                   module_name,<br>
+                                                   module_offset);<br>
+       if (ret)<br>
+         return ret;<br>
+      }<br>
+    else<br>
+      str = SendCommand(false, module_name, module_offset);<br>
     if (str == 0) {<br>
       // External symbolizer was not initialized or failed. Fill only data<br>
       // about module name and offset.<br>
@@ -444,6 +459,11 @@ class POSIXSymbolizer : public Symbolize<br>
     info->address = addr;<br>
     info->module = internal_strdup(module_name);<br>
     info->module_offset = module_offset;<br>
+    if (libbacktrace_symbolizer_) {<br>
+      mu_.CheckLocked();<br>
+      libbacktrace_symbolizer_->SymbolizeData(info);<br>
+      return true;<br>
+    }<br>
     const char *str = SendCommand(true, module_name, module_offset);<br>
     if (str == 0)<br>
       return true;<br>
@@ -455,7 +477,9 @@ class POSIXSymbolizer : public Symbolize<br>
   }<br>
<br>
   bool IsAvailable() {<br>
-    return internal_symbolizer_ != 0 || external_symbolizer_ != 0;<br>
+    return internal_symbolizer_ != 0 ||<br>
+          libbacktrace_symbolizer_ != 0 ||<br>
+          external_symbolizer_ != 0;<br>
   }<br>
<br>
   bool IsExternalAvailable() {<br>
@@ -573,14 +597,19 @@ class POSIXSymbolizer : public Symbolize<br>
<br>
   ExternalSymbolizer *external_symbolizer_;        // Leaked.<br>
   InternalSymbolizer *const internal_symbolizer_;  // Leaked.<br>
+  LibbacktraceSymbolizer *libbacktrace_symbolizer_;  // Leaked.<br>
 };<br>
<br>
 Symbolizer *Symbolizer::PlatformInit(const char *path_to_external) {<br>
   InternalSymbolizer* internal_symbolizer =<br>
       InternalSymbolizer::get(&symbolizer_allocator_);<br>
+  LibbacktraceSymbolizer* libbacktrace_symbolizer = 0;<br>
   ExternalSymbolizer *external_symbolizer = 0;<br>
<br>
-  if (!internal_symbolizer) {<br>
+  if (!internal_symbolizer)<br>
+    libbacktrace_symbolizer =<br>
+      LibbacktraceSymbolizer::get(&symbolizer_allocator_);<br>
+  if (!internal_symbolizer && !libbacktrace_symbolizer) {<br>
     if (!path_to_external || path_to_external[0] == '\0')<br>
       path_to_external = FindPathToBinary("llvm-symbolizer");<br>
<br>
@@ -593,7 +622,8 @@ Symbolizer *Symbolizer::PlatformInit(con<br>
   }<br>
<br>
   return new(symbolizer_allocator_)<br>
-      POSIXSymbolizer(external_symbolizer, internal_symbolizer);<br>
+      POSIXSymbolizer(external_symbolizer, libbacktrace_symbolizer,<br>
+                     internal_symbolizer);<br>
 }<br>
<br>
 }  // namespace __sanitizer<br>
<br>
--- lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc.jj        2013-11-19 16:41:37.811809494 +0100<br>
+++ lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc   2013-11-19 16:56:34.111233379 +0100<br>
@@ -0,0 +1,151 @@<br>
+//===-- sanitizer_symbolizer_libbacktrace.cc ------------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file is shared between AddressSanitizer and ThreadSanitizer<br>
+// run-time libraries.<br>
+// Libbacktrace implementation of symbolizer parts.<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "sanitizer_platform.h"<br>
+#if SANITIZER_POSIX<br>
+#include "sanitizer_allocator_internal.h"<br>
+#include "sanitizer_common.h"<br>
+#include "sanitizer_internal_defs.h"<br>
+#include "sanitizer_linux.h"<br>
+#include "sanitizer_placement_new.h"<br>
+#include "sanitizer_procmaps.h"<br>
+#include "sanitizer_symbolizer.h"<br>
+#include "sanitizer_symbolizer_libbacktrace.h"<br>
+<br>
+#include <stdlib.h><br>
+#include <unistd.h><br>
+<br>
+#ifdef SANITIZER_LIBBACKTRACE<br>
+#include "backtrace-supported.h"<br>
+#if SANITIZER_POSIX && BACKTRACE_SUPPORTED && !BACKTRACE_USES_MALLOC<br>
+#include "backtrace.h"<br>
+#else<br>
+#undef SANITIZER_LIBBACKTRACE<br>
+#endif<br>
+#endif<br>
+<br>
+namespace __sanitizer {<br>
+<br>
+#ifdef SANITIZER_LIBBACKTRACE<br>
+namespace {<br>
+<br>
+struct SymbolizeCodeData {<br>
+  AddressInfo *frames;<br>
+  uptr n_frames;<br>
+  uptr max_frames;<br>
+  const char *module_name;<br>
+  uptr module_offset;<br>
+};<br>
+<br>
+extern "C" {<br>
+<br>
+static int SymbolizeCodePCInfoCallback(void *vdata, uintptr_t addr,<br>
+                                      const char *filename, int lineno,<br>
+                                      const char *function) {<br>
+  SymbolizeCodeData *cdata = (SymbolizeCodeData *)vdata;<br>
+  if (function) {<br>
+    AddressInfo *info = &cdata->frames[cdata->n_frames++];<br>
+    info->Clear();<br>
+    info->FillAddressAndModuleInfo(addr, cdata->module_name, cdata->module_offset);<br>
+    info->function = internal_strdup(function);<br>
+    if (filename)<br>
+      info->file = internal_strdup(filename);<br>
+    info->line = lineno;<br>
+    if (cdata->n_frames == cdata->max_frames)<br>
+      return 1;<br>
+  }<br>
+  return 0;<br>
+}<br>
+<br>
+static void SymbolizeCodeCallback(void *vdata, uintptr_t addr,<br>
+                                 const char *symname, uintptr_t, uintptr_t) {<br>
+  SymbolizeCodeData *cdata = (SymbolizeCodeData *)vdata;<br>
+  if (symname) {<br>
+    AddressInfo *info = &cdata->frames[0];<br>
+    info->Clear();<br>
+    info->FillAddressAndModuleInfo(addr, cdata->module_name, cdata->module_offset);<br>
+    info->function = internal_strdup(symname);<br>
+    cdata->n_frames = 1;<br>
+  }<br>
+}<br>
+<br>
+static void SymbolizeDataCallback(void *vdata, uintptr_t,<br>
+                                 const char *symname,<br>
+                                 uintptr_t symval, uintptr_t symsize) {<br>
+  DataInfo *info = (DataInfo *)vdata;<br>
+  if (symname && symval) {<br>
+    info->name = internal_strdup(symname);<br>
+    info->start = symval;<br>
+    info->size = symsize;<br>
+  }<br>
+}<br>
+<br>
+static void ErrorCallback(void *, const char *, int) {<br>
+}<br>
+<br>
+}<br>
+<br>
+}<br>
+<br>
+LibbacktraceSymbolizer *LibbacktraceSymbolizer::get(LowLevelAllocator *alloc) {<br>
+  void *state<br>
+    = (void *) backtrace_create_state("/proc/self/exe", 0, ErrorCallback, NULL);<br>
+  if (!state)<br>
+    return 0;<br>
+  return new(*alloc) LibbacktraceSymbolizer(state);<br>
+}<br>
+<br>
+uptr LibbacktraceSymbolizer::SymbolizeCode(uptr addr, AddressInfo *frames,<br>
+                                          uptr max_frames,<br>
+                                          const char *module_name,<br>
+                                          uptr module_offset) {<br>
+  SymbolizeCodeData data;<br>
+  data.frames = frames;<br>
+  data.n_frames = 0;<br>
+  data.max_frames = max_frames;<br>
+  data.module_name = module_name;<br>
+  data.module_offset = module_offset;<br>
+  backtrace_pcinfo((backtrace_state) state_, addr, SymbolizeCodePCInfoCallback,<br>
+                  ErrorCallback, &data);<br>
+  if (data.n_frames)<br>
+    return data.n_frames;<br>
+  backtrace_syminfo((backtrace_state) state_, addr, SymbolizeCodeCallback,<br>
+                   ErrorCallback, &data);<br>
+  return data.n_frames;<br>
+}<br>
+<br>
+void LibbacktraceSymbolizer::SymbolizeData(DataInfo *info) {<br>
+  backtrace_syminfo((backtrace_state) state_, info->address,<br>
+                   SymbolizeDataCallback, ErrorCallback, info);<br>
+}<br>
+<br>
+#else<br>
+<br>
+LibbacktraceSymbolizer *LibbacktraceSymbolizer::get(LowLevelAllocator *) {<br>
+  return 0;<br>
+}<br>
+<br>
+uptr LibbacktraceSymbolizer::SymbolizeCode(uptr, AddressInfo *, uptr,<br>
+                                          const char *, uptr) {<br>
+  return 0;<br>
+}<br>
+<br>
+void LibbacktraceSymbolizer::SymbolizeData(DataInfo *) {<br>
+}<br>
+<br>
+#endif<br>
+<br>
+}  // namespace __sanitizer<br>
+<br>
+#endif  // SANITIZER_POSIX<br>
--- lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h.jj 2013-11-19 16:41:32.286843717 +0100<br>
+++ lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h    2013-11-19 16:52:16.448544275 +0100<br>
@@ -0,0 +1,36 @@<br>
+//===-- sanitizer_symbolizer_libbacktrace.h -------------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file is shared between AddressSanitizer and ThreadSanitizer<br>
+// run-time libraries.<br>
+// POSIX-specific implementation of symbolizer parts.<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "sanitizer_platform.h"<br>
+#include "sanitizer_common.h"<br>
+#include "sanitizer_symbolizer.h"<br>
+<br>
+namespace __sanitizer {<br>
+<br>
+class LibbacktraceSymbolizer {<br>
+ public:<br>
+  static LibbacktraceSymbolizer *get(LowLevelAllocator *alloc);<br>
+<br>
+  uptr SymbolizeCode(uptr addr, AddressInfo *frames, uptr max_frames,<br>
+                    const char *module_name, uptr module_offset);<br>
+<br>
+  void SymbolizeData(DataInfo *info);<br>
+<br>
+ private:<br>
+  LibbacktraceSymbolizer(void *state) : state_(state) { }<br>
+<br>
+  void *state_;        // Leaked.<br>
+};<br>
+<br>
+}<br>
<br>
<br>
        Jakub<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>