summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Matveev <earthdok@google.com>2013-05-21 14:15:35 +0000
committerSergey Matveev <earthdok@google.com>2013-05-21 14:15:35 +0000
commit71f0411c8289b57bc1a2cb3ccc02ae7fae25fd33 (patch)
treed357a2a693b129efafba55f8159647561202e639
parent9bdf7802d403b53baee3433ddddc220f457e039c (diff)
downloadcompiler-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.h2
-rw-r--r--lib/asan/asan_rtl.cc23
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) {