lsan.cc revision 68c016aea0b61f649b9d9ba65c7d7217e0c0f6cb
1//=-- lsan.cc -------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of LeakSanitizer. 11// Standalone LSan RTL. 12// 13//===----------------------------------------------------------------------===// 14 15#include "lsan.h" 16 17#include "sanitizer_common/sanitizer_flags.h" 18#include "sanitizer_common/sanitizer_stacktrace.h" 19#include "lsan_allocator.h" 20#include "lsan_common.h" 21#include "lsan_thread.h" 22 23namespace __lsan { 24 25static void InitializeCommonFlags() { 26 CommonFlags *cf = common_flags(); 27 cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH"); 28 cf->symbolize = true; 29 cf->strip_path_prefix = ""; 30 cf->fast_unwind_on_malloc = true; 31 cf->malloc_context_size = 30; 32 cf->detect_leaks = true; 33 cf->leak_check_at_exit = true; 34 35 ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS")); 36} 37 38void Init() { 39 static bool inited; 40 if (inited) 41 return; 42 inited = true; 43 SanitizerToolName = "LeakSanitizer"; 44 InitializeCommonFlags(); 45 InitializeAllocator(); 46 InitTlsSize(); 47 InitializeInterceptors(); 48 InitializeThreadRegistry(); 49 u32 tid = ThreadCreate(0, 0, true); 50 CHECK_EQ(tid, 0); 51 ThreadStart(tid, GetTid()); 52 SetCurrentThread(tid); 53 54 // Start symbolizer process if necessary. 55 if (common_flags()->symbolize) { 56 InitializeExternalSymbolizer(common_flags()->external_symbolizer_path); 57 } 58 59 InitCommonLsan(); 60 if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) 61 Atexit(DoLeakCheck); 62} 63 64} // namespace __lsan 65