blob: 46c9f3408725de5a0bdeba9b5e86a8c96f95044f [file] [log] [blame]
Kostya Serebryany019b76f2011-11-30 01:07:02 +00001//===-- 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
Kostya Serebryany75759682012-08-28 14:11:57 +000017#include "sanitizer_common/sanitizer_stacktrace.h"
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000018#include "asan_flags.h"
Kostya Serebryany019b76f2011-11-30 01:07:02 +000019
20namespace __asan {
21
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000022void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp, bool fast);
Kostya Serebryanya57b4e82012-08-28 13:49:49 +000023void PrintStack(StackTrace *stack);
Kostya Serebryanyee928772012-08-28 13:25:55 +000024
Kostya Serebryany019b76f2011-11-30 01:07:02 +000025} // namespace __asan
26
27// Get the stack trace with the given pc and bp.
28// The pc will be in the position 0 of the resulting stack trace.
29// The bp may refer to the current frame or to the caller's frame.
30// fast_unwind is currently unused.
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000031#define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast) \
Kostya Serebryany6b0d7752012-08-28 11:54:30 +000032 StackTrace stack; \
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000033 GetStackTrace(&stack, max_s, pc, bp, fast)
Kostya Serebryany019b76f2011-11-30 01:07:02 +000034
Alexey Samsonov2d3a67b2012-01-17 06:35:31 +000035// NOTE: A Rule of thumb is to retrieve stack trace in the interceptors
36// as early as possible (in functions exposed to the user), as we generally
37// don't want stack trace to contain functions from ASan internals.
38
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000039#define GET_STACK_TRACE(max_size, fast) \
Evgeniy Stepanov84c44a82012-01-19 11:34:18 +000040 GET_STACK_TRACE_WITH_PC_AND_BP(max_size, \
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000041 StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), fast)
Kostya Serebryany019b76f2011-11-30 01:07:02 +000042
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000043#define GET_STACK_TRACE_FATAL(pc, bp) \
44 GET_STACK_TRACE_WITH_PC_AND_BP(kStackTraceMax, pc, bp, \
45 flags()->fast_unwind_on_fatal)
Kostya Serebryany019b76f2011-11-30 01:07:02 +000046
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000047#define GET_STACK_TRACE_FATAL_HERE \
48 GET_STACK_TRACE(kStackTraceMax, flags()->fast_unwind_on_fatal)
49
50#define GET_STACK_TRACE_THREAD \
51 GET_STACK_TRACE(kStackTraceMax, true)
52
53#define GET_STACK_TRACE_MALLOC \
54 GET_STACK_TRACE(flags()->malloc_context_size, \
55 flags()->fast_unwind_on_malloc)
56
57#define GET_STACK_TRACE_FREE GET_STACK_TRACE_MALLOC
Kostya Serebryany019b76f2011-11-30 01:07:02 +000058
59#define PRINT_CURRENT_STACK() \
60 { \
Kostya Serebryanybaf583c2012-12-13 09:34:23 +000061 GET_STACK_TRACE(kStackTraceMax, \
62 flags()->fast_unwind_on_fatal); \
Kostya Serebryanya57b4e82012-08-28 13:49:49 +000063 PrintStack(&stack); \
Chandler Carruthbbff2782012-06-25 06:53:10 +000064 }
Kostya Serebryany019b76f2011-11-30 01:07:02 +000065
66#endif // ASAN_STACK_H