tsan_flags.cc revision cec6068bbbbfb84285c0856c196c48170924e215
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; 438a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_bugs = true; 447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->report_thread_leaks = true; 45fd513907acd3e2eaa02070edaa24df66648dc2acDmitry Vyukov f->report_destroy_locked = true; 467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->report_signal_unsafe = true; 477ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->force_seq_cst_atomics = false; 48b7b6b1cd9df0c954b1f890fcebf373db984923b3Dmitry Vyukov f->strip_path_prefix = ""; 49b7b6b1cd9df0c954b1f890fcebf373db984923b3Dmitry Vyukov f->suppressions = ""; 507ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->exitcode = 66; 51cec6068bbbbfb84285c0856c196c48170924e215Dmitry Vyukov f->log_path = "stderr"; 527ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->atexit_sleep_ms = 1000; 537ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany f->verbosity = 0; 5426127735454fddae3495794f38189d57dde6510fDmitry Vyukov f->profile_memory = ""; 55adfb65039646774f0f063b538f8fb0aec021f42bDmitry Vyukov f->flush_memory_ms = 0; 56adfb65039646774f0f063b538f8fb0aec021f42bDmitry Vyukov f->stop_on_start = false; 5724567d409cca096b950574fa4b19aa4c2c67a1f0Dmitry Vyukov f->running_on_valgrind = false; 588cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov f->external_symbolizer_path = ""; 59d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov f->history_size = 2; 60d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov 61d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov#ifdef TSAN_GO 62d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov f->history_size = 1; // There are a lot of goroutines. 63d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov#endif 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"); 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"); 76f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics"); 77f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->strip_path_prefix, "strip_path_prefix"); 78f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->suppressions, "suppressions"); 79f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->exitcode, "exitcode"); 80cec6068bbbbfb84285c0856c196c48170924e215Dmitry Vyukov ParseFlag(env, &f->log_path, "log_path"); 81f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms"); 82f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->verbosity, "verbosity"); 83f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->profile_memory, "profile_memory"); 84f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms"); 85f3be7069465c15b4c3f6719423d6075b0cf5a871Alexey Samsonov ParseFlag(env, &f->stop_on_start, "stop_on_start"); 868cc1f81b2cc1fa0d4cda4f4635d955aed04c09c8Alexey Samsonov ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path"); 87d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov ParseFlag(env, &f->history_size, "history_size"); 888a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov 898a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov if (!f->report_bugs) { 908a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_thread_leaks = false; 918a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_destroy_locked = false; 928a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov f->report_signal_unsafe = false; 938a326776e41dc68c810ba3719a24328de517d8f9Dmitry Vyukov } 94d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov 95d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov if (f->history_size < 0 || f->history_size > 7) { 96d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov Printf("ThreadSanitizer: incorrect value for history_size" 97d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov " (must be [0..7])\n"); 98d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov Die(); 99d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov } 1007ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 1017ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 1027ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} // namespace __tsan 103