diff options
author | Sergey Matveev <earthdok@google.com> | 2013-05-21 14:15:35 +0000 |
---|---|---|
committer | Sergey Matveev <earthdok@google.com> | 2013-05-21 14:15:35 +0000 |
commit | 71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33 (patch) | |
tree | d357a2a693b129efafba55f8159647561202e639 | |
parent | 9bdf7802d403b53baee3433ddddc220f457e039c (diff) | |
download | compiler-rt-71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33.tar.gz compiler-rt-71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33.tar.bz2 compiler-rt-71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33.tar.xz |
[asan] LSan hooks in asan_rtl.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@182384 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/asan/asan_flags.h | 2 | ||||
-rw-r--r-- | lib/asan/asan_rtl.cc | 23 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/asan/asan_flags.h b/lib/asan/asan_flags.h index bc7176f4..2f3bc905 100644 --- a/lib/asan/asan_flags.h +++ b/lib/asan/asan_flags.h @@ -108,6 +108,8 @@ struct Flags { // If true, assume that dynamic initializers can never access globals from // other modules, even if the latter are already initialized. bool strict_init_order; + // Invoke LeakSanitizer at process exit. + bool detect_leaks; }; extern Flags asan_flags_dont_use_directly; diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc index b4ced16d..a30dc1d2 100644 --- a/lib/asan/asan_rtl.cc +++ b/lib/asan/asan_rtl.cc @@ -24,6 +24,7 @@ #include "sanitizer_common/sanitizer_flags.h" #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_symbolizer.h" +#include "lsan/lsan_common.h" namespace __asan { @@ -124,6 +125,7 @@ static void ParseFlagsFromString(Flags *f, const char *str) { ParseFlag(str, &f->use_stack_depot, "use_stack_depot"); ParseFlag(str, &f->strict_memcmp, "strict_memcmp"); ParseFlag(str, &f->strict_init_order, "strict_init_order"); + ParseFlag(str, &f->detect_leaks, "detect_leaks"); } void InitializeFlags(Flags *f, const char *env) { @@ -171,6 +173,7 @@ void InitializeFlags(Flags *f, const char *env) { f->use_stack_depot = true; f->strict_memcmp = true; f->strict_init_order = false; + f->detect_leaks = false; // Override from compile definition. ParseFlagsFromString(f, MaybeUseAsanDefaultOptionsCompileDefiniton()); @@ -184,6 +187,20 @@ void InitializeFlags(Flags *f, const char *env) { // Override from command line. ParseFlagsFromString(f, env); + +#if !CAN_SANITIZE_LEAKS + if (f->detect_leaks) { + Report("%s: detect_leaks is not supported on this platform.\n", + SanitizerToolName); + f->detect_leaks = false; + } +#endif + + if (f->detect_leaks && !f->use_stack_depot) { + Report("%s: detect_leaks is ignored (requires use_stack_depot).\n", + SanitizerToolName); + f->detect_leaks = false; + } } // -------------------------- Globals --------------------- {{{1 @@ -448,6 +465,10 @@ void __asan_init() { Atexit(asan_atexit); } + if (flags()->detect_leaks) { + Atexit(__lsan::DoLeakCheck); + } + // interceptors InitializeAsanInterceptors(); @@ -527,6 +548,8 @@ void __asan_init() { main_thread->ThreadStart(internal_getpid()); force_interface_symbols(); // no-op. + __lsan::InitCommonLsan(); + InitializeAllocator(); if (flags()->verbosity) { |