Daily bump.
[official-gcc.git] / libsanitizer / asan / asan_debugging.cc
blob302574d9dd83863baa632583df9f1123cfa9346b
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 //===----------------------------------------------------------------------===//
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"
20 namespace __asan {
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;
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();
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]);
46 return size;
49 return 0;
52 } // namespace __asan
54 using namespace __asan;
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);
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);
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;