From 71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 21 May 2013 14:15:35 +0000 Subject: [asan] LSan hooks in asan_rtl. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@182384 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/asan/asan_flags.h | 2 ++ lib/asan/asan_rtl.cc | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) 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) { -- cgit v1.2.3