Index: lib/tsan/rtl/tsan_rtl_report.cc =================================================================== --- lib/tsan/rtl/tsan_rtl_report.cc +++ lib/tsan/rtl/tsan_rtl_report.cc @@ -680,6 +680,12 @@ 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. +// See PR27280 comment 1~3 for examples. +ALWAYS_INLINE void PrintCurrentStackSlow(uptr pc) { #ifndef SANITIZER_GO BufferedStackTrace *ptrace = Index: test/tsan/print_stack_trace.cc =================================================================== --- /dev/null +++ test/tsan/print_stack_trace.cc @@ -0,0 +1,13 @@ +// RUN: %clang_tsan -O0 %s -o %t && llvm-objdump -d %run %t | FileCheck %s +extern "C" { +void __sanitizer_print_stack_trace(); +} + +int main() { + __sanitizer_print_stack_trace(); + return 0; +} + +// We always inline PrintCurrentStackSlow, so we shouldn't found that string in +// executable file. +// CHECK-NOT: PrintCurrentStackSlow