1//===-- asan_stack.h --------------------------------------------*- C++ -*-===//
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 AddressSanitizer, an address sanity checker.
11//
12// ASan-private header for asan_stack.cc.
13//===----------------------------------------------------------------------===//
14#ifndef ASAN_STACK_H
15#define ASAN_STACK_H
16
17#include "sanitizer_common/sanitizer_stacktrace.h"
18
19namespace __asan {
20
21void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp);
22void PrintStack(StackTrace *stack);
23
24}  // namespace __asan
25
26// Get the stack trace with the given pc and bp.
27// The pc will be in the position 0 of the resulting stack trace.
28// The bp may refer to the current frame or to the caller's frame.
29// fast_unwind is currently unused.
30#define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp)               \
31  StackTrace stack;                                             \
32  GetStackTrace(&stack, max_s, pc, bp)
33
34// NOTE: A Rule of thumb is to retrieve stack trace in the interceptors
35// as early as possible (in functions exposed to the user), as we generally
36// don't want stack trace to contain functions from ASan internals.
37
38#define GET_STACK_TRACE_HERE(max_size)                        \
39  GET_STACK_TRACE_WITH_PC_AND_BP(max_size,                    \
40      StackTrace::GetCurrentPc(), GET_CURRENT_FRAME())
41
42#define GET_STACK_TRACE_HERE_FOR_MALLOC                             \
43  GET_STACK_TRACE_HERE(flags()->malloc_context_size)
44
45#define GET_STACK_TRACE_HERE_FOR_FREE(ptr)                          \
46  GET_STACK_TRACE_HERE(flags()->malloc_context_size)
47
48#define PRINT_CURRENT_STACK()                    \
49  {                                              \
50    GET_STACK_TRACE_HERE(kStackTraceMax);        \
51    PrintStack(&stack);                          \
52  }
53
54#endif  // ASAN_STACK_H
55