1 //===-- backtrace_sanitizer_common.cpp --------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include <assert.h> 10 #include <stddef.h> 11 #include <stdint.h> 12 #include <string.h> 13 14 #include "gwp_asan/optional/backtrace.h" 15 #include "gwp_asan/options.h" 16 #include "sanitizer_common/sanitizer_stacktrace.h" 17 18 void __sanitizer::BufferedStackTrace::UnwindImpl(uptr pc, uptr bp, 19 void *context, 20 bool request_fast, 21 u32 max_depth) { 22 if (!StackTrace::WillUseFastUnwind(request_fast)) { 23 return Unwind(max_depth, pc, bp, context, 0, 0, request_fast); 24 } 25 Unwind(max_depth, pc, 0, context, 0, 0, false); 26 } 27 28 namespace { 29 void Backtrace(uintptr_t *TraceBuffer, size_t Size) { 30 __sanitizer::BufferedStackTrace Trace; 31 Trace.Reset(); 32 if (Size > __sanitizer::kStackTraceMax) 33 Size = __sanitizer::kStackTraceMax; 34 35 Trace.Unwind((__sanitizer::uptr)__builtin_return_address(0), 36 (__sanitizer::uptr)__builtin_frame_address(0), 37 /* ucontext */ nullptr, 38 /* fast unwind */ true, Size - 1); 39 40 memcpy(TraceBuffer, Trace.trace, Trace.size * sizeof(uintptr_t)); 41 TraceBuffer[Trace.size] = 0; 42 } 43 44 static void PrintBacktrace(uintptr_t *Trace, 45 gwp_asan::options::Printf_t Printf) { 46 __sanitizer::StackTrace StackTrace; 47 StackTrace.trace = reinterpret_cast<__sanitizer::uptr *>(Trace); 48 49 for (StackTrace.size = 0; StackTrace.size < __sanitizer::kStackTraceMax; 50 ++StackTrace.size) { 51 if (Trace[StackTrace.size] == 0) 52 break; 53 } 54 55 if (StackTrace.size == 0) { 56 Printf(" <unknown (does your allocator support backtracing?)>\n\n"); 57 return; 58 } 59 60 StackTrace.Print(); 61 } 62 } // anonymous namespace 63 64 namespace gwp_asan { 65 namespace options { 66 Backtrace_t getBacktraceFunction() { return Backtrace; } 67 PrintBacktrace_t getPrintBacktraceFunction() { return PrintBacktrace; } 68 } // namespace options 69 } // namespace gwp_asan 70