lsan.cc revision e96c62a9f60c615fae16b1d645cd4afb29a4e87a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//=-- lsan.cc -------------------------------------------------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// This file is a part of LeakSanitizer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Standalone LSan RTL. 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lsan.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_common/sanitizer_flags.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sanitizer_common/sanitizer_stacktrace.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lsan_allocator.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lsan_common.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lsan_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace __lsan { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void InitializeCommonFlags() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonFlags *cf = common_flags(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH"); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->symbolize = (cf->external_symbolizer_path && 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->external_symbolizer_path[0]); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->strip_path_prefix = ""; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->fast_unwind_on_malloc = true; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf->malloc_context_size = 30; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS")); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Init() { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool inited; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inited) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inited = true; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SanitizerToolName = "LeakSanitizer"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeCommonFlags(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeAllocator(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCommonLsan(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitTlsSize(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeInterceptors(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeThreadRegistry(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 tid = ThreadCreate(0, 0, true); 50 CHECK_EQ(tid, 0); 51 ThreadStart(tid, GetTid()); 52 53 // Start symbolizer process if necessary. 54 const char* external_symbolizer = common_flags()->external_symbolizer_path; 55 if (common_flags()->symbolize && external_symbolizer && 56 external_symbolizer[0]) { 57 InitializeExternalSymbolizer(external_symbolizer); 58 } 59} 60 61} // namespace __lsan 62