[PATCH] D67671: compiler-rt/lib/tsan: allow the Go runtime to return multiple stack frames for a single PC
    Keith Randall via Phabricator via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Tue Sep 17 10:57:56 PDT 2019
    
    
  
randall77 created this revision.
randall77 added a reviewer: dvyukov.
Herald added subscribers: Sanitizers, llvm-commits, dberris.
Herald added projects: LLVM, Sanitizers.
This fix allows tsan to report stack traces correctly even in the
presence of mid-stack inlining by the Go compiler.
See https://go-review.googlesource.com/c/go/+/195781 for the Go runtime side of this change.
Repository:
  rCRT Compiler Runtime
https://reviews.llvm.org/D67671
Files:
  lib/tsan/go/tsan_go.cpp
Index: lib/tsan/go/tsan_go.cpp
===================================================================
--- lib/tsan/go/tsan_go.cpp
+++ lib/tsan/go/tsan_go.cpp
@@ -14,6 +14,7 @@
 #include "tsan_symbolize.h"
 #include "sanitizer_common/sanitizer_common.h"
 #include <stdlib.h>
+#include <stdio.h>
 
 namespace __tsan {
 
@@ -54,20 +55,33 @@
 };
 
 SymbolizedStack *SymbolizeCode(uptr addr) {
-  SymbolizedStack *s = SymbolizedStack::New(addr);
-  SymbolizeCodeContext cbctx;
-  internal_memset(&cbctx, 0, sizeof(cbctx));
-  cbctx.pc = addr;
-  go_runtime_cb(CallbackSymbolizeCode, &cbctx);
-  if (cbctx.res) {
+  SymbolizedStack *first = SymbolizedStack::New(addr);
+  SymbolizedStack *s = first;
+  while(true) {
+    SymbolizeCodeContext cbctx;
+    internal_memset(&cbctx, 0, sizeof(cbctx));
+    cbctx.pc = addr;
+    go_runtime_cb(CallbackSymbolizeCode, &cbctx);
+    if (cbctx.res == 0) {
+      break;
+    }
     AddressInfo &info = s->info;
     info.module_offset = cbctx.off;
     info.function = internal_strdup(cbctx.func ? cbctx.func : "??");
     info.file = internal_strdup(cbctx.file ? cbctx.file : "-");
     info.line = cbctx.line;
     info.column = 0;
+
+    if (cbctx.pc == addr) { // outermost (non-inlined) function
+      break;
+    }
+    addr = cbctx.pc;
+    // Allocate a stack entry for the parent of the inlined function.
+    SymbolizedStack *s2 = SymbolizedStack::New(addr);
+    s->next = s2;
+    s = s2;
   }
-  return s;
+  return first;
 }
 
 struct SymbolizeDataContext {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67671.220539.patch
Type: text/x-patch
Size: 1506 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190917/283a4610/attachment-0001.bin>
    
    
More information about the llvm-commits
mailing list