tsan_flags.cc revision f63dde3594da0dba4c8039f0cb3a4196a76f1aff
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; 58f63dde3594da0dba4c8039f0cb3a4196a76f1affDmitry Vyukov f->flush_symbolizer_ms = 5000; 59adfb65039646774f0f063b538f8fb0aec021f42bDmitry Vyukov f->stop_on_start = false; 6024567d409cca096b950574fa4b19aa4c2c67a1f0Dmitry Vyukov f->running_on_valgrind = false; 618cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov f->external_symbolizer_path = ""; 623fb70e333087ffac19517ad6559fcba9e43ac5caDmitry Vyukov f->history_size = kGoMode ? 1 : 2; // There are a lot of goroutines in Go. 63e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov f->io_sync = 1; 6424567d409cca096b950574fa4b19aa4c2c67a1f0Dmitry Vyukov 657ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany // Let a frontend override. 667ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany OverrideFlags(f); 677ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 687ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany // Override from command line. 69f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->enable_annotations, "enable_annotations"); 70f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->suppress_equal_stacks, "suppress_equal_stacks"); 71f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->suppress_equal_addresses, "suppress_equal_addresses"); 72543b94a5cd102c0795b44d78234d5458eed2c75eDmitry Vyukov ParseFlag(env, &f->suppress_java, "suppress_java"); 738a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov ParseFlag(env, &f->report_bugs, "report_bugs"); 74f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->report_thread_leaks, "report_thread_leaks"); 75fd513907acd3e2eaa02070edaa24df66648dc2acDmitry Vyukov ParseFlag(env, &f->report_destroy_locked, "report_destroy_locked"); 76f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe"); 77ddbe2be9dc8b8eb7d40017c077e8392daf708510Dmitry Vyukov ParseFlag(env, &f->report_atomic_races, "report_atomic_races"); 78f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics"); 79f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->strip_path_prefix, "strip_path_prefix"); 80f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->suppressions, "suppressions"); 81f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->exitcode, "exitcode"); 82cec6068bbbbfb84285c0856c196c48170924e215Dmitry Vyukov ParseFlag(env, &f->log_path, "log_path"); 83f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms"); 84f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->verbosity, "verbosity"); 85f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->profile_memory, "profile_memory"); 86f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms"); 87f63dde3594da0dba4c8039f0cb3a4196a76f1affDmitry Vyukov ParseFlag(env, &f->flush_symbolizer_ms, "flush_symbolizer_ms"); 88f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->stop_on_start, "stop_on_start"); 898cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path"); 90d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov ParseFlag(env, &f->history_size, "history_size"); 91e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov ParseFlag(env, &f->io_sync, "io_sync"); 928a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov 938a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov if (!f->report_bugs) { 948a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_thread_leaks = false; 958a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_destroy_locked = false; 968a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_signal_unsafe = false; 978a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov } 98d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov 99d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov if (f->history_size < 0 || f->history_size > 7) { 100d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov Printf("ThreadSanitizer: incorrect value for history_size" 101d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov " (must be [0..7])\n"); 102d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov Die(); 103d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov } 104e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov 105e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov if (f->io_sync < 0 || f->io_sync > 2) { 106e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov Printf("ThreadSanitizer: incorrect value for io_sync" 107e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov " (must be [0..2])\n"); 108e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov Die(); 109e3178e8fab67e77165978006928228f9be2ce30dDmitry Vyukov } 1107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 1117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 1127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} // namespace __tsan 113