Path: blob/main/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_flags.cpp
35294 views
//===-- tsan_flags.cpp ----------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is a part of ThreadSanitizer (TSan), a race detector.9//10//===----------------------------------------------------------------------===//1112#include "tsan_flags.h"1314#include "sanitizer_common/sanitizer_flag_parser.h"15#include "sanitizer_common/sanitizer_flags.h"16#include "sanitizer_common/sanitizer_libc.h"17#include "tsan_interface.h"18#include "tsan_mman.h"19#include "tsan_rtl.h"20#include "ubsan/ubsan_flags.h"2122namespace __tsan {2324// Can be overriden in frontend.25#ifdef TSAN_EXTERNAL_HOOKS26extern "C" const char *__tsan_default_options();27#else28SANITIZER_WEAK_DEFAULT_IMPL29const char *__tsan_default_options() {30return "";31}32#endif3334void Flags::SetDefaults() {35#define TSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;36#include "tsan_flags.inc"37#undef TSAN_FLAG38// DDFlags39second_deadlock_stack = false;40}4142void RegisterTsanFlags(FlagParser *parser, Flags *f) {43#define TSAN_FLAG(Type, Name, DefaultValue, Description) \44RegisterFlag(parser, #Name, Description, &f->Name);45#include "tsan_flags.inc"46#undef TSAN_FLAG47// DDFlags48RegisterFlag(parser, "second_deadlock_stack",49"Report where each mutex is locked in deadlock reports",50&f->second_deadlock_stack);51}5253void InitializeFlags(Flags *f, const char *env, const char *env_option_name) {54SetCommonFlagsDefaults();55{56// Override some common flags defaults.57CommonFlags cf;58cf.CopyFrom(*common_flags());59cf.external_symbolizer_path = GetEnv("TSAN_SYMBOLIZER_PATH");60cf.allow_addr2line = true;61if (SANITIZER_GO) {62// Does not work as expected for Go: runtime handles SIGABRT and crashes.63cf.abort_on_error = false;64// Go does not have mutexes.65cf.detect_deadlocks = false;66}67cf.print_suppressions = false;68cf.stack_trace_format = " #%n %f %S %M";69cf.exitcode = 66;70cf.intercept_tls_get_addr = true;71OverrideCommonFlags(cf);72}7374f->SetDefaults();7576FlagParser parser;77RegisterTsanFlags(&parser, f);78RegisterCommonFlags(&parser);7980#if TSAN_CONTAINS_UBSAN81__ubsan::Flags *uf = __ubsan::flags();82uf->SetDefaults();8384FlagParser ubsan_parser;85__ubsan::RegisterUbsanFlags(&ubsan_parser, uf);86RegisterCommonFlags(&ubsan_parser);87#endif8889// Let a frontend override.90parser.ParseString(__tsan_default_options());91#if TSAN_CONTAINS_UBSAN92const char *ubsan_default_options = __ubsan_default_options();93ubsan_parser.ParseString(ubsan_default_options);94#endif95// Override from command line.96parser.ParseString(env, env_option_name);97#if TSAN_CONTAINS_UBSAN98ubsan_parser.ParseStringFromEnv("UBSAN_OPTIONS");99#endif100101// Check flags.102if (!f->report_bugs) {103f->report_thread_leaks = false;104f->report_destroy_locked = false;105f->report_signal_unsafe = false;106}107108InitializeCommonFlags();109110if (Verbosity()) ReportUnrecognizedFlags();111112if (common_flags()->help) parser.PrintFlagDescriptions();113114if (f->io_sync < 0 || f->io_sync > 2) {115Printf("ThreadSanitizer: incorrect value for io_sync"116" (must be [0..2])\n");117Die();118}119}120121} // namespace __tsan122123124