lsan.cc revision 02d7f32f66ef13cedd66a69aad864b6d5a4b81ae
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 = (cf->external_symbolizer_path &&
29      cf->external_symbolizer_path[0]);
30  cf->strip_path_prefix = "";
31  cf->fast_unwind_on_malloc = true;
32  cf->malloc_context_size = 30;
33
34  ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS"));
35}
36
37void Init() {
38  static bool inited;
39  if (inited)
40    return;
41  inited = true;
42  SanitizerToolName = "LeakSanitizer";
43  InitializeCommonFlags();
44  InitializeAllocator();
45  InitTlsSize();
46  InitializeInterceptors();
47  InitializeThreadRegistry();
48  u32 tid = ThreadCreate(0, 0, true);
49  CHECK_EQ(tid, 0);
50  ThreadStart(tid, GetTid());
51  SetCurrentThread(tid);
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  InitCommonLsan();
61  Atexit(DoLeakCheck);
62}
63
64}  // namespace __lsan
65