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