[libsanitizer merge from upstream r218156]
[gcc.git] / libsanitizer / asan / asan_debugging.cc
1 //===-- asan_debugging.cc -------------------------------------------------===//
2 //
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
5 //
6 //===----------------------------------------------------------------------===//
7 //
8 // This file is a part of AddressSanitizer, an address sanity checker.
9 //
10 // This file contains various functions that are generally useful to call when
11 // using a debugger (LLDB, GDB).
12 //===----------------------------------------------------------------------===//
13
14 #include "asan_allocator.h"
15 #include "asan_flags.h"
16 #include "asan_internal.h"
17 #include "asan_mapping.h"
18 #include "asan_thread.h"
19
20 namespace __asan {
21
22 uptr AsanGetStack(uptr addr, uptr *trace, uptr size, u32 *thread_id,
23 bool alloc_stack) {
24 AsanChunkView chunk = FindHeapChunkByAddress(addr);
25 if (!chunk.IsValid()) return 0;
26
27 StackTrace stack;
28 if (alloc_stack) {
29 if (chunk.AllocTid() == kInvalidTid) return 0;
30 chunk.GetAllocStack(&stack);
31 if (thread_id) *thread_id = chunk.AllocTid();
32 } else {
33 if (chunk.FreeTid() == kInvalidTid) return 0;
34 chunk.GetFreeStack(&stack);
35 if (thread_id) *thread_id = chunk.FreeTid();
36 }
37
38 if (trace && size) {
39 if (size > kStackTraceMax)
40 size = kStackTraceMax;
41 if (size > stack.size)
42 size = stack.size;
43 for (uptr i = 0; i < size; i++)
44 trace[i] = StackTrace::GetPreviousInstructionPc(stack.trace[i]);
45
46 return size;
47 }
48
49 return 0;
50 }
51
52 } // namespace __asan
53
54 using namespace __asan;
55
56 SANITIZER_INTERFACE_ATTRIBUTE
57 uptr __asan_get_alloc_stack(uptr addr, uptr *trace, uptr size, u32 *thread_id) {
58 return AsanGetStack(addr, trace, size, thread_id, /* alloc_stack */ true);
59 }
60
61 SANITIZER_INTERFACE_ATTRIBUTE
62 uptr __asan_get_free_stack(uptr addr, uptr *trace, uptr size, u32 *thread_id) {
63 return AsanGetStack(addr, trace, size, thread_id, /* alloc_stack */ false);
64 }
65
66 SANITIZER_INTERFACE_ATTRIBUTE
67 void __asan_get_shadow_mapping(uptr *shadow_scale, uptr *shadow_offset) {
68 if (shadow_scale)
69 *shadow_scale = SHADOW_SCALE;
70 if (shadow_offset)
71 *shadow_offset = SHADOW_OFFSET;
72 }