blob: f3e6ad7c9cbaced1f4143f5bc54233d312f7cdd0 [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"
Stephen Hines86277eb2015-03-23 12:06:32 -070018#include "sanitizer_common/sanitizer_flag_parser.h"
Sergey Matveeve96c62a2013-05-20 11:04:43 +000019#include "sanitizer_common/sanitizer_stacktrace.h"
20#include "lsan_allocator.h"
21#include "lsan_common.h"
22#include "lsan_thread.h"
23
Sergey Matveev74c88792013-11-25 17:39:36 +000024bool lsan_inited;
25bool lsan_init_is_running;
26
Sergey Matveeve96c62a2013-05-20 11:04:43 +000027namespace __lsan {
28
Stephen Hines2d1fdb22014-05-28 23:58:16 -070029///// Interface to the common LSan module. /////
30bool WordIsPoisoned(uptr addr) {
31 return false;
Sergey Matveeve96c62a2013-05-20 11:04:43 +000032}
33
Sergey Matveev74c88792013-11-25 17:39:36 +000034} // namespace __lsan
35
36using namespace __lsan; // NOLINT
37
Stephen Hines86277eb2015-03-23 12:06:32 -070038static void InitializeFlags() {
39 // Set all the default values.
40 SetCommonFlagsDefaults();
41 {
42 CommonFlags cf;
43 cf.CopyFrom(*common_flags());
44 cf.external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
45 cf.malloc_context_size = 30;
46 cf.detect_leaks = true;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080047 cf.exitcode = 23;
Stephen Hines86277eb2015-03-23 12:06:32 -070048 OverrideCommonFlags(cf);
49 }
50
51 Flags *f = flags();
52 f->SetDefaults();
53
54 FlagParser parser;
55 RegisterLsanFlags(&parser, f);
56 RegisterCommonFlags(&parser);
57
58 parser.ParseString(GetEnv("LSAN_OPTIONS"));
59
60 SetVerbosity(common_flags()->verbosity);
61
62 if (Verbosity()) ReportUnrecognizedFlags();
63
64 if (common_flags()->help) parser.PrintFlagDescriptions();
65}
66
Sergey Matveev74c88792013-11-25 17:39:36 +000067extern "C" void __lsan_init() {
68 CHECK(!lsan_init_is_running);
69 if (lsan_inited)
Sergey Matveeve96c62a2013-05-20 11:04:43 +000070 return;
Sergey Matveev74c88792013-11-25 17:39:36 +000071 lsan_init_is_running = true;
Sergey Matveeve96c62a2013-05-20 11:04:43 +000072 SanitizerToolName = "LeakSanitizer";
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080073 CacheBinaryName();
Stephen Hines86277eb2015-03-23 12:06:32 -070074 InitializeFlags();
75 InitCommonLsan();
Sergey Matveeve96c62a2013-05-20 11:04:43 +000076 InitializeAllocator();
Sergey Matveeve96c62a2013-05-20 11:04:43 +000077 InitTlsSize();
78 InitializeInterceptors();
79 InitializeThreadRegistry();
80 u32 tid = ThreadCreate(0, 0, true);
81 CHECK_EQ(tid, 0);
82 ThreadStart(tid, GetTid());
Sergey Matveev02d7f322013-06-18 14:44:45 +000083 SetCurrentThread(tid);
Sergey Matveeve96c62a2013-05-20 11:04:43 +000084
Sergey Matveev41f15402013-08-01 14:57:07 +000085 if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
86 Atexit(DoLeakCheck);
Stephen Hines86277eb2015-03-23 12:06:32 -070087
88 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
89
Sergey Matveev74c88792013-11-25 17:39:36 +000090 lsan_inited = true;
91 lsan_init_is_running = false;
Sergey Matveeve96c62a2013-05-20 11:04:43 +000092}
93
Stephen Hines6d186232014-11-26 17:56:19 -080094extern "C" SANITIZER_INTERFACE_ATTRIBUTE
95void __sanitizer_print_stack_trace() {
96 GET_STACK_TRACE_FATAL;
97 stack.Print();
98}