lsan.cc revision 55c7947a742aa72530eef52d902e60e5571ac3cf
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  SetCommonFlagDefaults();
28  cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
29  cf->malloc_context_size = 30;
30  cf->detect_leaks = true;
31
32  ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS"));
33}
34
35void Init() {
36  static bool inited;
37  if (inited)
38    return;
39  inited = true;
40  SanitizerToolName = "LeakSanitizer";
41  InitializeCommonFlags();
42  InitializeAllocator();
43  InitTlsSize();
44  InitializeInterceptors();
45  InitializeThreadRegistry();
46  u32 tid = ThreadCreate(0, 0, true);
47  CHECK_EQ(tid, 0);
48  ThreadStart(tid, GetTid());
49  SetCurrentThread(tid);
50
51  // Start symbolizer process if necessary.
52  if (common_flags()->symbolize) {
53    Symbolizer::Init(common_flags()->external_symbolizer_path);
54  } else {
55    Symbolizer::Disable();
56  }
57
58  InitCommonLsan();
59  if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
60    Atexit(DoLeakCheck);
61}
62
63}  // namespace __lsan
64