| //=-- lsan.cc -------------------------------------------------------------===// |
| // |
| // 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. |
| // Standalone LSan RTL. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lsan.h" |
| |
| #include "sanitizer_common/sanitizer_flags.h" |
| #include "sanitizer_common/sanitizer_stacktrace.h" |
| #include "lsan_allocator.h" |
| #include "lsan_common.h" |
| #include "lsan_thread.h" |
| |
| namespace __lsan { |
| |
| static void InitializeCommonFlags() { |
| CommonFlags *cf = common_flags(); |
| cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH"); |
| cf->symbolize = (cf->external_symbolizer_path && |
| cf->external_symbolizer_path[0]); |
| cf->strip_path_prefix = ""; |
| cf->fast_unwind_on_malloc = true; |
| cf->malloc_context_size = 30; |
| cf->detect_leaks = true; |
| |
| ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS")); |
| } |
| |
| void Init() { |
| static bool inited; |
| if (inited) |
| return; |
| inited = true; |
| SanitizerToolName = "LeakSanitizer"; |
| InitializeCommonFlags(); |
| InitializeAllocator(); |
| InitTlsSize(); |
| InitializeInterceptors(); |
| InitializeThreadRegistry(); |
| u32 tid = ThreadCreate(0, 0, true); |
| CHECK_EQ(tid, 0); |
| ThreadStart(tid, GetTid()); |
| SetCurrentThread(tid); |
| |
| // Start symbolizer process if necessary. |
| const char* external_symbolizer = common_flags()->external_symbolizer_path; |
| if (common_flags()->symbolize && external_symbolizer && |
| external_symbolizer[0]) { |
| InitializeExternalSymbolizer(external_symbolizer); |
| } |
| |
| InitCommonLsan(); |
| Atexit(DoLeakCheck); |
| } |
| |
| } // namespace __lsan |