blob: 1424f3b28060da2156f966792a107c47d63a604d [file] [log] [blame]
Sergey Matveeve96c62a2013-05-20 11:04:43 +00001//=-- 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();
Alexey Samsonov55c79472013-11-12 13:59:08 +000027 SetCommonFlagDefaults();
Sergey Matveeve96c62a2013-05-20 11:04:43 +000028 cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
Sergey Matveeve96c62a2013-05-20 11:04:43 +000029 cf->malloc_context_size = 30;
Sergey Matveev62519eb2013-07-22 12:38:17 +000030 cf->detect_leaks = true;
Sergey Matveeve96c62a2013-05-20 11:04:43 +000031
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();
Sergey Matveeve96c62a2013-05-20 11:04:43 +000043 InitTlsSize();
44 InitializeInterceptors();
45 InitializeThreadRegistry();
46 u32 tid = ThreadCreate(0, 0, true);
47 CHECK_EQ(tid, 0);
48 ThreadStart(tid, GetTid());
Sergey Matveev02d7f322013-06-18 14:44:45 +000049 SetCurrentThread(tid);
Sergey Matveeve96c62a2013-05-20 11:04:43 +000050
51 // Start symbolizer process if necessary.
Alexey Samsonov68c016a2013-09-03 13:22:51 +000052 if (common_flags()->symbolize) {
Peter Collingbournec1a1ed62013-10-25 23:03:29 +000053 Symbolizer::Init(common_flags()->external_symbolizer_path);
54 } else {
55 Symbolizer::Disable();
Sergey Matveeve96c62a2013-05-20 11:04:43 +000056 }
Sergey Matveev4cacb4f2013-05-21 17:56:45 +000057
Sergey Matveevfc1a6122013-05-23 10:24:44 +000058 InitCommonLsan();
Sergey Matveev41f15402013-08-01 14:57:07 +000059 if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
60 Atexit(DoLeakCheck);
Sergey Matveeve96c62a2013-05-20 11:04:43 +000061}
62
63} // namespace __lsan