blob: 679ea992936c636f088525f6be74753d879c8b58 [file] [log] [blame]
Alexey Samsonov603c4be2012-06-04 13:55:19 +00001//===-- tsan_flags.cc -----------------------------------------------------===//
Kostya Serebryany7ac41482012-05-10 13:48:04 +00002//
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 ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
13
Alexey Samsonovf3be7062012-07-09 13:21:39 +000014#include "sanitizer_common/sanitizer_flags.h"
Alexey Samsonov230c3be2012-06-06 09:26:25 +000015#include "sanitizer_common/sanitizer_libc.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000016#include "tsan_flags.h"
17#include "tsan_rtl.h"
18#include "tsan_mman.h"
19
20namespace __tsan {
21
Kostya Serebryany7ac41482012-05-10 13:48:04 +000022Flags *flags() {
23 return &CTX()->flags;
24}
25
26// Can be overriden in frontend.
Dmitry Vyukov87dbdf52012-07-25 14:30:51 +000027#ifdef TSAN_EXTERNAL_HOOKS
28void OverrideFlags(Flags *f);
29#else
Alexey Samsonov9a46c3b2012-09-13 13:34:09 +000030SANITIZER_INTERFACE_ATTRIBUTE
Kostya Serebryany7ac41482012-05-10 13:48:04 +000031void WEAK OverrideFlags(Flags *f) {
32 (void)f;
33}
Dmitry Vyukov87dbdf52012-07-25 14:30:51 +000034#endif
Kostya Serebryany7ac41482012-05-10 13:48:04 +000035
36void InitializeFlags(Flags *f, const char *env) {
Dmitry Vyukovd51a1a12012-06-27 21:00:23 +000037 internal_memset(f, 0, sizeof(*f));
Kostya Serebryany7ac41482012-05-10 13:48:04 +000038
39 // Default values.
40 f->enable_annotations = true;
41 f->suppress_equal_stacks = true;
42 f->suppress_equal_addresses = true;
Dmitry Vyukov543b94a2012-11-30 17:45:53 +000043 f->suppress_java = false;
Dmitry Vyukov8a326772012-11-07 16:14:12 +000044 f->report_bugs = true;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000045 f->report_thread_leaks = true;
Dmitry Vyukovfd513902012-08-16 15:12:35 +000046 f->report_destroy_locked = true;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000047 f->report_signal_unsafe = true;
Dmitry Vyukovddbe2be2013-02-01 10:06:56 +000048 f->report_atomic_races = true;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000049 f->force_seq_cst_atomics = false;
Dmitry Vyukovb7b6b1c2012-05-17 15:00:27 +000050 f->suppressions = "";
Dmitry Vyukovf754eb52013-03-27 17:59:57 +000051 f->print_suppressions = false;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000052 f->print_benign = false;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000053 f->exitcode = 66;
Dmitry Vyukovdbac0a42013-08-13 15:33:00 +000054 f->halt_on_error = false;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000055 f->atexit_sleep_ms = 1000;
56 f->verbosity = 0;
Dmitry Vyukov26127732012-05-22 11:33:03 +000057 f->profile_memory = "";
Dmitry Vyukovadfb6502012-05-22 18:07:45 +000058 f->flush_memory_ms = 0;
Dmitry Vyukovf63dde32013-03-21 13:01:50 +000059 f->flush_symbolizer_ms = 5000;
Dmitry Vyukov92b54792013-10-03 17:14:35 +000060 f->memory_limit_mb = 0;
Dmitry Vyukovadfb6502012-05-22 18:07:45 +000061 f->stop_on_start = false;
Dmitry Vyukov24567d42012-05-24 09:24:45 +000062 f->running_on_valgrind = false;
Dmitry Vyukov3fb70e32012-11-28 13:01:32 +000063 f->history_size = kGoMode ? 1 : 2; // There are a lot of goroutines in Go.
Dmitry Vyukove3178e82012-12-18 12:20:55 +000064 f->io_sync = 1;
Dmitry Vyukov24567d42012-05-24 09:24:45 +000065
Kostya Serebryany7ac41482012-05-10 13:48:04 +000066 // Let a frontend override.
67 OverrideFlags(f);
68
69 // Override from command line.
Alexey Samsonovf3be7062012-07-09 13:21:39 +000070 ParseFlag(env, &f->enable_annotations, "enable_annotations");
71 ParseFlag(env, &f->suppress_equal_stacks, "suppress_equal_stacks");
72 ParseFlag(env, &f->suppress_equal_addresses, "suppress_equal_addresses");
Dmitry Vyukov543b94a2012-11-30 17:45:53 +000073 ParseFlag(env, &f->suppress_java, "suppress_java");
Dmitry Vyukov8a326772012-11-07 16:14:12 +000074 ParseFlag(env, &f->report_bugs, "report_bugs");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000075 ParseFlag(env, &f->report_thread_leaks, "report_thread_leaks");
Dmitry Vyukovfd513902012-08-16 15:12:35 +000076 ParseFlag(env, &f->report_destroy_locked, "report_destroy_locked");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000077 ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe");
Dmitry Vyukovddbe2be2013-02-01 10:06:56 +000078 ParseFlag(env, &f->report_atomic_races, "report_atomic_races");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000079 ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000080 ParseFlag(env, &f->suppressions, "suppressions");
Dmitry Vyukovf754eb52013-03-27 17:59:57 +000081 ParseFlag(env, &f->print_suppressions, "print_suppressions");
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000082 ParseFlag(env, &f->print_benign, "print_benign");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000083 ParseFlag(env, &f->exitcode, "exitcode");
Dmitry Vyukovdbac0a42013-08-13 15:33:00 +000084 ParseFlag(env, &f->halt_on_error, "halt_on_error");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000085 ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms");
86 ParseFlag(env, &f->verbosity, "verbosity");
87 ParseFlag(env, &f->profile_memory, "profile_memory");
88 ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms");
Dmitry Vyukovf63dde32013-03-21 13:01:50 +000089 ParseFlag(env, &f->flush_symbolizer_ms, "flush_symbolizer_ms");
Dmitry Vyukov92b54792013-10-03 17:14:35 +000090 ParseFlag(env, &f->memory_limit_mb, "memory_limit_mb");
Alexey Samsonovf3be7062012-07-09 13:21:39 +000091 ParseFlag(env, &f->stop_on_start, "stop_on_start");
Dmitry Vyukovd698edc2012-11-28 12:19:50 +000092 ParseFlag(env, &f->history_size, "history_size");
Dmitry Vyukove3178e82012-12-18 12:20:55 +000093 ParseFlag(env, &f->io_sync, "io_sync");
Dmitry Vyukov8a326772012-11-07 16:14:12 +000094
95 if (!f->report_bugs) {
96 f->report_thread_leaks = false;
97 f->report_destroy_locked = false;
98 f->report_signal_unsafe = false;
99 }
Dmitry Vyukovd698edc2012-11-28 12:19:50 +0000100
101 if (f->history_size < 0 || f->history_size > 7) {
102 Printf("ThreadSanitizer: incorrect value for history_size"
103 " (must be [0..7])\n");
104 Die();
105 }
Dmitry Vyukove3178e82012-12-18 12:20:55 +0000106
107 if (f->io_sync < 0 || f->io_sync > 2) {
108 Printf("ThreadSanitizer: incorrect value for io_sync"
109 " (must be [0..2])\n");
110 Die();
111 }
Dmitry Vyukovc78773e2013-09-27 02:31:23 +0000112
Dmitry Vyukovb48c2b22013-10-15 12:25:29 +0000113 *common_flags() = *f;
114 ParseCommonFlagsFromString("strip_path_prefix=");
115 ParseCommonFlagsFromString("log_path=stderr");
116 ParseCommonFlagsFromString("external_symbolizer_path=");
117 ParseCommonFlagsFromString("allocator_may_return_null=0");
118 ParseCommonFlagsFromString(env);
119 *static_cast<CommonFlags*>(f) = *common_flags();
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000120}
121
122} // namespace __tsan