]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/lib/lsan/lsan.cc
Imported Upstream version 1.6.0+dfsg1
[rustc.git] / src / compiler-rt / lib / lsan / lsan.cc
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_flag_parser.h"
19 #include "sanitizer_common/sanitizer_stacktrace.h"
20 #include "lsan_allocator.h"
21 #include "lsan_common.h"
22 #include "lsan_thread.h"
23
24 bool lsan_inited;
25 bool lsan_init_is_running;
26
27 namespace __lsan {
28
29 ///// Interface to the common LSan module. /////
30 bool WordIsPoisoned(uptr addr) {
31 return false;
32 }
33
34 } // namespace __lsan
35
36 using namespace __lsan; // NOLINT
37
38 static 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;
47 cf.exitcode = 23;
48 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
67 extern "C" void __lsan_init() {
68 CHECK(!lsan_init_is_running);
69 if (lsan_inited)
70 return;
71 lsan_init_is_running = true;
72 SanitizerToolName = "LeakSanitizer";
73 CacheBinaryName();
74 InitializeFlags();
75 InitCommonLsan();
76 InitializeAllocator();
77 InitTlsSize();
78 InitializeInterceptors();
79 InitializeThreadRegistry();
80 u32 tid = ThreadCreate(0, 0, true);
81 CHECK_EQ(tid, 0);
82 ThreadStart(tid, GetTid());
83 SetCurrentThread(tid);
84
85 if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
86 Atexit(DoLeakCheck);
87
88 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
89
90 lsan_inited = true;
91 lsan_init_is_running = false;
92 }
93
94 extern "C" SANITIZER_INTERFACE_ATTRIBUTE
95 void __sanitizer_print_stack_trace() {
96 GET_STACK_TRACE_FATAL;
97 stack.Print();
98 }