summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuang-Yu Cheng <cycheng@multicorewareinc.com>2016-04-20 10:28:41 +0000
committerChuang-Yu Cheng <cycheng@multicorewareinc.com>2016-04-20 10:28:41 +0000
commite480455fd6bd3c69177613a146cc88c8117ce579 (patch)
treef7e1802dbeb89cf4b4e972c8d4f37f629629963d
parent71630b9ea7ce151305e89f305dc02613bc5b0023 (diff)
downloadbcm5719-llvm-e480455fd6bd3c69177613a146cc88c8117ce579.tar.gz
bcm5719-llvm-e480455fd6bd3c69177613a146cc88c8117ce579.zip
Always inlining PrintCurrentStackSlow of tsan library to fix tail-call issue
The real problem is that sanitizer_print_stack_trace obtains current PC and expects the PC to be in the stack trace after function calls. We don't prevent tail calls in sanitizer runtimes, so this assumption does not necessary hold. We add "always inline" attribute on PrintCurrentStackSlow to address this issue, however this solution is not reliable enough, but unfortunately, we don't see any simple, reliable solution. Reviewers: samsonov hfinkel kbarton tjablin dvyukov kcc http://reviews.llvm.org/D19148 Thanks Hal, dvyukov, and kcc for invaluable discussion, I have even borrowed part of dvyukov's summary as my commit message! llvm-svn: 266869
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
index cd82af4f66a..ac89830bef6 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
@@ -680,6 +680,14 @@ void PrintCurrentStack(ThreadState *thr, uptr pc) {
PrintStack(SymbolizeStack(trace));
}
+// Always inlining PrintCurrentStackSlow, because LocatePcInTrace assumes
+// __sanitizer_print_stack_trace exists in the actual unwinded stack, but
+// tail-call to PrintCurrentStackSlow breaks this assumption because
+// __sanitizer_print_stack_trace disappears after tail-call.
+// However, this solution is not reliable enough, please see dvyukov's comment
+// http://reviews.llvm.org/D19148#406208
+// Also see PR27280 comment 2 and 3 for breaking examples and analysis.
+ALWAYS_INLINE
void PrintCurrentStackSlow(uptr pc) {
#ifndef SANITIZER_GO
BufferedStackTrace *ptrace =
OpenPOWER on IntegriCloud