tsan_flags.cc revision ddbe2be9dc8b8eb7d40017c077e8392daf708510
1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_flags.cc -----------------------------------------------------===//
27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//                     The LLVM Compiler Infrastructure
47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is distributed under the University of Illinois Open Source
67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// License. See LICENSE.TXT for details.
77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===//
97ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector.
117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===//
137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
14f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov#include "sanitizer_common/sanitizer_flags.h"
15230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov#include "sanitizer_common/sanitizer_libc.h"
167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_flags.h"
177ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_rtl.h"
187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_mman.h"
197ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanynamespace __tsan {
217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
227ac41484ea322e0ea5774df681660269f5dc321eKostya SerebryanyFlags *flags() {
237ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  return &CTX()->flags;
247ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany}
257ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// Can be overriden in frontend.
2787dbdf5fd6cb9f1b90a0a97b7675bd8cad8a0264Dmitry Vyukov#ifdef TSAN_EXTERNAL_HOOKS
2887dbdf5fd6cb9f1b90a0a97b7675bd8cad8a0264Dmitry Vyukovvoid OverrideFlags(Flags *f);
2987dbdf5fd6cb9f1b90a0a97b7675bd8cad8a0264Dmitry Vyukov#else
309a46c3b7aeb3a800702b48dd5f8017b0ae7387c7Alexey SamsonovSANITIZER_INTERFACE_ATTRIBUTE
317ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid WEAK OverrideFlags(Flags *f) {
327ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  (void)f;
337ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany}
3487dbdf5fd6cb9f1b90a0a97b7675bd8cad8a0264Dmitry Vyukov#endif
357ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
367ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid InitializeFlags(Flags *f, const char *env) {
37d51a1a10cba87be50e9ada9fa21337c387edb237Dmitry Vyukov  internal_memset(f, 0, sizeof(*f));
387ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
397ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  // Default values.
407ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->enable_annotations = true;
417ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->suppress_equal_stacks = true;
427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->suppress_equal_addresses = true;
43543b94a5cd102c0795b44d78234d5458eed2c75eDmitry Vyukov  f->suppress_java = false;
448a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov  f->report_bugs = true;
457ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->report_thread_leaks = true;
46fd513907acd3e2eaa02070edaa24df66648dc2acDmitry Vyukov  f->report_destroy_locked = true;
477ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->report_signal_unsafe = true;
48ddbe2be9dc8b8eb7d40017c077e8392daf708510Dmitry Vyukov  f->report_atomic_races = true;
497ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->force_seq_cst_atomics = false;
50b7b6b1cd9df0c954b1f890fcebf373db984923b3Dmitry Vyukov  f->strip_path_prefix = "";
51b7b6b1cd9df0c954b1f890fcebf373db984923b3Dmitry Vyukov  f->suppressions = "";
527ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->exitcode = 66;
53cec6068bbbbfb84285c0856c196c48170924e215Dmitry Vyukov  f->log_path = "stderr";
547ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->atexit_sleep_ms = 1000;
557ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  f->verbosity = 0;
5626127735454fddae3495794f38189d57dde6510fDmitry Vyukov  f->profile_memory = "";
57adfb65039646774f0f063b538f8fb0aec021f42bDmitry Vyukov  f->flush_memory_ms = 0;
58adfb65039646774f0f063b538f8fb0aec021f42bDmitry Vyukov  f->stop_on_start = false;
5924567d409cca096b950574fa4b19aa4c2c67a1f0Dmitry Vyukov  f->running_on_valgrind = false;
608cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov  f->external_symbolizer_path = "";
613fb70e333087ffac19517ad6559fcba9e43ac5caDmitry Vyukov  f->history_size = kGoMode ? 1 : 2;  // There are a lot of goroutines in Go.
62e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov  f->io_sync = 1;
6324567d409cca096b950574fa4b19aa4c2c67a1f0Dmitry Vyukov
647ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  // Let a frontend override.
657ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  OverrideFlags(f);
667ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
677ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  // Override from command line.
68f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->enable_annotations, "enable_annotations");
69f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->suppress_equal_stacks, "suppress_equal_stacks");
70f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->suppress_equal_addresses, "suppress_equal_addresses");
71543b94a5cd102c0795b44d78234d5458eed2c75eDmitry Vyukov  ParseFlag(env, &f->suppress_java, "suppress_java");
728a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov  ParseFlag(env, &f->report_bugs, "report_bugs");
73f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->report_thread_leaks, "report_thread_leaks");
74fd513907acd3e2eaa02070edaa24df66648dc2acDmitry Vyukov  ParseFlag(env, &f->report_destroy_locked, "report_destroy_locked");
75f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe");
76ddbe2be9dc8b8eb7d40017c077e8392daf708510Dmitry Vyukov  ParseFlag(env, &f->report_atomic_races, "report_atomic_races");
77f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics");
78f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->strip_path_prefix, "strip_path_prefix");
79f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->suppressions, "suppressions");
80f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->exitcode, "exitcode");
81cec6068bbbbfb84285c0856c196c48170924e215Dmitry Vyukov  ParseFlag(env, &f->log_path, "log_path");
82f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms");
83f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->verbosity, "verbosity");
84f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->profile_memory, "profile_memory");
85f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms");
86f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov  ParseFlag(env, &f->stop_on_start, "stop_on_start");
878cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov  ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path");
88d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov  ParseFlag(env, &f->history_size, "history_size");
89e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov  ParseFlag(env, &f->io_sync, "io_sync");
908a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov
918a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov  if (!f->report_bugs) {
928a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov    f->report_thread_leaks = false;
938a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov    f->report_destroy_locked = false;
948a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov    f->report_signal_unsafe = false;
958a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov  }
96d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov
97d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov  if (f->history_size < 0 || f->history_size > 7) {
98d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov    Printf("ThreadSanitizer: incorrect value for history_size"
99d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov           " (must be [0..7])\n");
100d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov    Die();
101d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov  }
102e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov
103e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov  if (f->io_sync < 0 || f->io_sync > 2) {
104e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov    Printf("ThreadSanitizer: incorrect value for io_sync"
105e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov           " (must be [0..2])\n");
106e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov    Die();
107e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov  }
1087ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany}
1097ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
1107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany}  // namespace __tsan
111