<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>