diff options
Diffstat (limited to 'compiler-rt/lib/asan')
| -rw-r--r-- | compiler-rt/lib/asan/asan_fake_stack.cc | 14 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_fake_stack.h | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_thread.cc | 19 | 
3 files changed, 31 insertions, 4 deletions
diff --git a/compiler-rt/lib/asan/asan_fake_stack.cc b/compiler-rt/lib/asan/asan_fake_stack.cc index 81091f18989..4f617cac860 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cc +++ b/compiler-rt/lib/asan/asan_fake_stack.cc @@ -134,6 +134,20 @@ NOINLINE void FakeStack::GC(uptr real_stack) {    needs_gc_ = false;  } +void FakeStack::ForEachFakeFrame(RangeIteratorCallback callback, void *arg) { +  for (uptr class_id = 0; class_id < kNumberOfSizeClasses; class_id++) { +    u8 *flags = GetFlags(stack_size_log(), class_id); +    for (uptr i = 0, n = NumberOfFrames(stack_size_log(), class_id); i < n; +         i++) { +      if (flags[i] == 0) continue;  // not allocated. +      FakeFrame *ff = reinterpret_cast<FakeFrame *>( +          GetFrame(stack_size_log(), class_id, i)); +      uptr begin = reinterpret_cast<uptr>(ff); +      callback(begin, begin + FakeStack::BytesInSizeClass(class_id), arg); +    } +  } +} +  #if SANITIZER_LINUX && !SANITIZER_ANDROID  static THREADLOCAL FakeStack *fake_stack_tls; diff --git a/compiler-rt/lib/asan/asan_fake_stack.h b/compiler-rt/lib/asan/asan_fake_stack.h index b4f74d909ad..f17ee026891 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.h +++ b/compiler-rt/lib/asan/asan_fake_stack.h @@ -148,6 +148,8 @@ class FakeStack {    void HandleNoReturn();    void GC(uptr real_stack); +  void ForEachFakeFrame(RangeIteratorCallback callback, void *arg); +   private:    FakeStack() { }    static const uptr kFlagsOffset = 4096;  // This is were the flags begin. diff --git a/compiler-rt/lib/asan/asan_thread.cc b/compiler-rt/lib/asan/asan_thread.cc index 1949cd83508..7ffac9912e8 100644 --- a/compiler-rt/lib/asan/asan_thread.cc +++ b/compiler-rt/lib/asan/asan_thread.cc @@ -294,6 +294,13 @@ void EnsureMainThreadIDIsCorrect() {    if (context && (context->tid == 0))      context->os_id = GetTid();  } + +__asan::AsanThread *GetAsanThreadByOsIDLocked(uptr os_id) { +  __asan::AsanThreadContext *context = static_cast<__asan::AsanThreadContext *>( +      __asan::asanThreadRegistry().FindThreadContextByOsIDLocked(os_id)); +  if (!context) return 0; +  return context->thread; +}  }  // namespace __asan  // --- Implementation of LSan-specific functions --- {{{1 @@ -301,10 +308,7 @@ namespace __lsan {  bool GetThreadRangesLocked(uptr os_id, uptr *stack_begin, uptr *stack_end,                             uptr *tls_begin, uptr *tls_end,                             uptr *cache_begin, uptr *cache_end) { -  __asan::AsanThreadContext *context = static_cast<__asan::AsanThreadContext *>( -      __asan::asanThreadRegistry().FindThreadContextByOsIDLocked(os_id)); -  if (!context) return false; -  __asan::AsanThread *t = context->thread; +  __asan::AsanThread *t = __asan::GetAsanThreadByOsIDLocked(os_id);    if (!t) return false;    *stack_begin = t->stack_bottom();    *stack_end = t->stack_top(); @@ -316,6 +320,13 @@ bool GetThreadRangesLocked(uptr os_id, uptr *stack_begin, uptr *stack_end,    return true;  } +void ForEachExtraStackRange(uptr os_id, RangeIteratorCallback callback, +                            void *arg) { +  __asan::AsanThread *t = __asan::GetAsanThreadByOsIDLocked(os_id); +  if (t && t->has_fake_stack()) +    t->fake_stack()->ForEachFakeFrame(callback, arg); +} +  void LockThreadRegistry() {    __asan::asanThreadRegistry().Lock();  }  | 

