From 3597fba4e5e46dfeb035cec8be474f3fd3102fc0 Mon Sep 17 00:00:00 2001 From: Jianzhou Zhao Date: Wed, 28 Oct 2020 06:48:49 +0000 Subject: [PATCH] Add a simple stack trace printer for DFSan Reviewed-by: morehouse Differential Revision: https://reviews.llvm.org/D91235 --- compiler-rt/lib/dfsan/CMakeLists.txt | 1 + compiler-rt/lib/dfsan/dfsan.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/compiler-rt/lib/dfsan/CMakeLists.txt b/compiler-rt/lib/dfsan/CMakeLists.txt index 051215edbeb7..a29de8deff1b 100644 --- a/compiler-rt/lib/dfsan/CMakeLists.txt +++ b/compiler-rt/lib/dfsan/CMakeLists.txt @@ -31,6 +31,7 @@ foreach(arch ${DFSAN_SUPPORTED_ARCH}) $ $ $ + $ ADDITIONAL_HEADERS ${DFSAN_RTL_HEADERS} CFLAGS ${DFSAN_CFLAGS} PARENT_TARGET dfsan) diff --git a/compiler-rt/lib/dfsan/dfsan.cpp b/compiler-rt/lib/dfsan/dfsan.cpp index 5da2138a263e..36381c6896ae 100644 --- a/compiler-rt/lib/dfsan/dfsan.cpp +++ b/compiler-rt/lib/dfsan/dfsan.cpp @@ -27,6 +27,7 @@ #include "sanitizer_common/sanitizer_flags.h" #include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_libc.h" +#include "sanitizer_common/sanitizer_stacktrace.h" using namespace __dfsan; @@ -407,6 +408,22 @@ dfsan_dump_labels(int fd) { } } +#define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \ + BufferedStackTrace stack; \ + stack.Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_fatal); + +void __sanitizer::BufferedStackTrace::UnwindImpl(uptr pc, uptr bp, + void *context, + bool request_fast, + u32 max_depth) { + Unwind(max_depth, pc, bp, context, 0, 0, false); +} + +extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_print_stack_trace() { + GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME()); + stack.Print(); +} + void Flags::SetDefaults() { #define DFSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; #include "dfsan_flags.inc"