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