1//=-- lsan.h --------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of LeakSanitizer. 11// Private header for standalone LSan RTL. 12// 13//===----------------------------------------------------------------------===// 14 15#include "lsan_thread.h" 16#include "sanitizer_common/sanitizer_flags.h" 17#include "sanitizer_common/sanitizer_stacktrace.h" 18 19#define GET_STACK_TRACE(max_size, fast) \ 20 __sanitizer::BufferedStackTrace stack; \ 21 GetStackTrace(&stack, max_size, StackTrace::GetCurrentPc(), \ 22 GET_CURRENT_FRAME(), nullptr, fast); 23 24#define GET_STACK_TRACE_FATAL \ 25 GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_fatal) 26 27#define GET_STACK_TRACE_MALLOC \ 28 GET_STACK_TRACE(__sanitizer::common_flags()->malloc_context_size, \ 29 common_flags()->fast_unwind_on_malloc) 30 31#define GET_STACK_TRACE_THREAD GET_STACK_TRACE(kStackTraceMax, true) 32 33namespace __lsan { 34 35void InitializeInterceptors(); 36void ReplaceSystemMalloc(); 37 38#define ENSURE_LSAN_INITED do { \ 39 CHECK(!lsan_init_is_running); \ 40 if (!lsan_inited) \ 41 __lsan_init(); \ 42} while (0) 43 44// Get the stack trace with the given pc and bp. 45// The pc will be in the position 0 of the resulting stack trace. 46// The bp may refer to the current frame or to the caller's frame. 47ALWAYS_INLINE 48void GetStackTrace(__sanitizer::BufferedStackTrace *stack, 49 __sanitizer::uptr max_depth, __sanitizer::uptr pc, 50 __sanitizer::uptr bp, void *context, bool fast) { 51 uptr stack_top = 0, stack_bottom = 0; 52 ThreadContext *t; 53 if (fast && (t = CurrentThreadContext())) { 54 stack_top = t->stack_end(); 55 stack_bottom = t->stack_begin(); 56 } 57 if (!SANITIZER_MIPS || IsValidFrame(bp, stack_top, stack_bottom)) { 58 stack->Unwind(max_depth, pc, bp, context, stack_top, stack_bottom, fast); 59 } 60} 61 62} // namespace __lsan 63 64extern bool lsan_inited; 65extern bool lsan_init_is_running; 66 67extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __lsan_init(); 68