<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Sun, Sep 22, 2013 at 4:14 AM, Dmitry Vyukov <span dir="ltr"><<a href="mailto:dvyukov@google.com" target="_blank">dvyukov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dvyukov<br>
Date: Sat Sep 21 19:14:57 2013<br>
New Revision: 191157<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=191157&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=191157&view=rev</a><br>
Log:<br>
tsan: allow symbolization of non-native PCs, e.g. coming from JIT/JAVA/etc<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc?rev=191157&r1=191156&r2=191157&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc?rev=191157&r1=191156&r2=191157&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize.cc Sat Sep 21 19:14:57 2013<br>
@@ -69,7 +69,56 @@ static ReportStack *NewReportStackEntry(<br>
   return ent;<br>
 }<br>
<br>
+<br>
+  ReportStack *next;<br>
+  char *module;<br>
+  uptr offset;<br>
+  uptr pc;<br>
+  char *func;<br>
+  char *file;<br>
+  int line;<br>
+  int col;<br>
+<br>
+<br>
+// Denotes fake PC values that come from JIT/JAVA/etc.<br>
+// For such PC values __tsan_symbolize_external() will be called.<br>
+const uptr kExternalPCBit = 1ULL << 60;<br>
+<br>
+// May be overriden by JIT/JAVA/etc,<br>
+// whatever produces PCs marked with kExternalPCBit.<br>
+extern "C" bool __tsan_symbolize_external(uptr pc,<br>
+                               char *func_buf, uptr func_siz,<br>
+                               char *file_buf, uptr file_siz,<br>
+                               int *line, int *col)<br>
+                               SANITIZER_WEAK_ATTRIBUTE;<br>
+<br>
+bool __tsan_symbolize_external(uptr pc,<br>
+                               char *func_buf, uptr func_siz,<br>
+                               char *file_buf, uptr file_siz,<br>
+                               int *line, int *col) {<br>
+  return false;<br>
+}<br></blockquote><div><br></div><div>Is there a chance we may need this for another sanitizer tools? Why not move this logic to symbolizer in</div><div>sanitizer_common?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+<br>
 ReportStack *SymbolizeCode(uptr addr) {<br>
+  // Check if PC comes from non-native land.<br>
+  if (addr & kExternalPCBit) {<br>
+    // Declare static to not consume too much stack space.<br>
+    // We symbolize reports in a single thread, so this is fine.<br>
+    static char func_buf[1024];<br>
+    static char file_buf[1024];<br></blockquote><div><br></div><div>If speed is not very important here, you may use InternalScopedBuffer. In any case,</div><div>it would be nice to be defensive and ensure we're executing this code in a single thread using</div>
<div>Mutex or assert.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    int line, col;<br>
+    if (!__tsan_symbolize_external(addr, func_buf, sizeof(func_buf),<br>
+                                  file_buf, sizeof(file_buf), &line, &col))<br>
+      return NewReportStackEntry(addr);<br>
+    ReportStack *ent = NewReportStackEntry(addr);<br>
+    ent->module = 0;<br>
+    ent->offset = 0;<br>
+    ent->func = internal_strdup(func_buf);<br>
+    ent->file = internal_strdup(file_buf);<br>
+    ent->line = line;<br>
+    ent->col = col;<br>
+    return ent;<br>
+  }<br>
   if (!getSymbolizer()->IsAvailable())<br>
     return SymbolizeCodeAddr2Line(addr);<br>
   ScopedInSymbolizer in_symbolizer;<br>
<br>
<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><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div>