Summary: We have a way to keep track of allocated DTLS segments: let's use it in LSan. Although this code is fragile and relies on glibc implementation details, in some cases it proves to be better than existing way of tracking DTLS in LSan: marking as "reachable" all memory chunks allocated directly by "ld". The plan is to eventually get rid of the latter, once we are sure it's safe to remove. Reviewers: kcc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D16164 llvm-svn: 257785
61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
//=-- lsan_thread.h -------------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of LeakSanitizer.
|
|
// Thread registry for standalone LSan.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LSAN_THREAD_H
|
|
#define LSAN_THREAD_H
|
|
|
|
#include "sanitizer_common/sanitizer_thread_registry.h"
|
|
|
|
namespace __sanitizer {
|
|
struct DTLS;
|
|
}
|
|
|
|
namespace __lsan {
|
|
|
|
class ThreadContext : public ThreadContextBase {
|
|
public:
|
|
explicit ThreadContext(int tid);
|
|
void OnStarted(void *arg) override;
|
|
void OnFinished() override;
|
|
uptr stack_begin() { return stack_begin_; }
|
|
uptr stack_end() { return stack_end_; }
|
|
uptr tls_begin() { return tls_begin_; }
|
|
uptr tls_end() { return tls_end_; }
|
|
uptr cache_begin() { return cache_begin_; }
|
|
uptr cache_end() { return cache_end_; }
|
|
DTLS *dtls() { return dtls_; }
|
|
|
|
private:
|
|
uptr stack_begin_, stack_end_,
|
|
cache_begin_, cache_end_,
|
|
tls_begin_, tls_end_;
|
|
DTLS *dtls_;
|
|
};
|
|
|
|
void InitializeThreadRegistry();
|
|
|
|
void ThreadStart(u32 tid, uptr os_id);
|
|
void ThreadFinish();
|
|
u32 ThreadCreate(u32 tid, uptr uid, bool detached);
|
|
void ThreadJoin(u32 tid);
|
|
u32 ThreadTid(uptr uid);
|
|
|
|
u32 GetCurrentThread();
|
|
void SetCurrentThread(u32 tid);
|
|
ThreadContext *CurrentThreadContext();
|
|
void EnsureMainThreadIDIsCorrect();
|
|
} // namespace __lsan
|
|
|
|
#endif // LSAN_THREAD_H
|