blob: 5de227a42deefd34a0816aa3ea56f6e3fcb07683 [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"
Stephen Hines86277eb2015-03-23 12:06:32 -070015#include "sanitizer_common/sanitizer_flag_parser.h"
Alexey Samsonov230c3be2012-06-06 09:26:25 +000016#include "sanitizer_common/sanitizer_libc.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000017#include "tsan_flags.h"
18#include "tsan_rtl.h"
19#include "tsan_mman.h"
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070020#include "ubsan/ubsan_flags.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000021
22namespace __tsan {
23
Kostya Serebryany7ac41482012-05-10 13:48:04 +000024Flags *flags() {
Stephen Hines2d1fdb22014-05-28 23:58:16 -070025 return &ctx->flags;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000026}
27
28// Can be overriden in frontend.
Dmitry Vyukov87dbdf52012-07-25 14:30:51 +000029#ifdef TSAN_EXTERNAL_HOOKS
Dmitry Vyukovf719b922013-10-15 15:58:11 +000030extern "C" const char* __tsan_default_options();
Dmitry Vyukov87dbdf52012-07-25 14:30:51 +000031#else
Stephen Hines2d1fdb22014-05-28 23:58:16 -070032extern "C" SANITIZER_INTERFACE_ATTRIBUTE
33const char *WEAK __tsan_default_options() {
Dmitry Vyukovf719b922013-10-15 15:58:11 +000034 return "";
35}
Dmitry Vyukov87dbdf52012-07-25 14:30:51 +000036#endif
Kostya Serebryany7ac41482012-05-10 13:48:04 +000037
Stephen Hines86277eb2015-03-23 12:06:32 -070038void Flags::SetDefaults() {
39#define TSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
40#include "tsan_flags.inc"
41#undef TSAN_FLAG
Stephen Hines2d1fdb22014-05-28 23:58:16 -070042 // DDFlags
Stephen Hines86277eb2015-03-23 12:06:32 -070043 second_deadlock_stack = false;
44}
45
46void RegisterTsanFlags(FlagParser *parser, Flags *f) {
47#define TSAN_FLAG(Type, Name, DefaultValue, Description) \
48 RegisterFlag(parser, #Name, Description, &f->Name);
49#include "tsan_flags.inc"
50#undef TSAN_FLAG
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070051 // DDFlags
52 RegisterFlag(parser, "second_deadlock_stack",
53 "Report where each mutex is locked in deadlock reports",
54 &f->second_deadlock_stack);
Dmitry Vyukovf719b922013-10-15 15:58:11 +000055}
56
Kostya Serebryany7ac41482012-05-10 13:48:04 +000057void InitializeFlags(Flags *f, const char *env) {
Stephen Hines86277eb2015-03-23 12:06:32 -070058 SetCommonFlagsDefaults();
59 {
60 // Override some common flags defaults.
61 CommonFlags cf;
62 cf.CopyFrom(*common_flags());
63 cf.allow_addr2line = true;
64#ifndef SANITIZER_GO
65 cf.detect_deadlocks = true;
66#endif
67 cf.print_suppressions = false;
68 cf.stack_trace_format = " #%n %f %S %M";
69 OverrideCommonFlags(cf);
70 }
Dmitry Vyukov6866dba2013-10-15 13:28:51 +000071
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070072 f->SetDefaults();
73
74 FlagParser parser;
75 RegisterTsanFlags(&parser, f);
76 RegisterCommonFlags(&parser);
77
78#if TSAN_CONTAINS_UBSAN
79 __ubsan::Flags *uf = __ubsan::flags();
80 uf->SetDefaults();
81
82 FlagParser ubsan_parser;
83 __ubsan::RegisterUbsanFlags(&ubsan_parser, uf);
84 RegisterCommonFlags(&ubsan_parser);
85#endif
86
Kostya Serebryany7ac41482012-05-10 13:48:04 +000087 // Let a frontend override.
Stephen Hines86277eb2015-03-23 12:06:32 -070088 parser.ParseString(__tsan_default_options());
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070089#if TSAN_CONTAINS_UBSAN
90 const char *ubsan_default_options = __ubsan::MaybeCallUbsanDefaultOptions();
91 ubsan_parser.ParseString(ubsan_default_options);
92#endif
Kostya Serebryany7ac41482012-05-10 13:48:04 +000093 // Override from command line.
Stephen Hines86277eb2015-03-23 12:06:32 -070094 parser.ParseString(env);
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070095#if TSAN_CONTAINS_UBSAN
96 ubsan_parser.ParseString(GetEnv("UBSAN_OPTIONS"));
97#endif
Dmitry Vyukov8a326772012-11-07 16:14:12 +000098
Alexey Samsonov55c79472013-11-12 13:59:08 +000099 // Sanity check.
Dmitry Vyukov8a326772012-11-07 16:14:12 +0000100 if (!f->report_bugs) {
101 f->report_thread_leaks = false;
102 f->report_destroy_locked = false;
103 f->report_signal_unsafe = false;
104 }
Dmitry Vyukovd698edc2012-11-28 12:19:50 +0000105
Stephen Hines86277eb2015-03-23 12:06:32 -0700106 SetVerbosity(common_flags()->verbosity);
107
108 if (Verbosity()) ReportUnrecognizedFlags();
109
110 if (common_flags()->help) parser.PrintFlagDescriptions();
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700111
Dmitry Vyukovd698edc2012-11-28 12:19:50 +0000112 if (f->history_size < 0 || f->history_size > 7) {
113 Printf("ThreadSanitizer: incorrect value for history_size"
114 " (must be [0..7])\n");
115 Die();
116 }
Dmitry Vyukove3178e82012-12-18 12:20:55 +0000117
118 if (f->io_sync < 0 || f->io_sync > 2) {
119 Printf("ThreadSanitizer: incorrect value for io_sync"
120 " (must be [0..2])\n");
121 Die();
122 }
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000123}
124
125} // namespace __tsan