alekseyshl created this revision.
alekseyshl added a reviewer: eugenis.
alekseyshl added a subscriber: cfe-commits.

New clang flags, all default to true:
-f[no-]sanitize-thread-data-races
-f[no-]sanitize-thread-stack-traces
-f[no-]sanitize-thread-atomics


https://reviews.llvm.org/D26461

Files:
  include/clang/Driver/Options.td
  include/clang/Driver/SanitizerArgs.h
  include/clang/Frontend/CodeGenOptions.def
  lib/CodeGen/BackendUtil.cpp
  lib/Driver/SanitizerArgs.cpp
  lib/Frontend/CompilerInvocation.cpp

Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -729,6 +729,18 @@
   Opts.SanitizeCoverageTracePC = Args.hasArg(OPT_fsanitize_coverage_trace_pc);
   Opts.SanitizeCoverageTracePCGuard =
       Args.hasArg(OPT_fsanitize_coverage_trace_pc_guard);
+  Opts.SanitizeThreadDataRaces =
+      Args.hasFlag(OPT_fsanitize_thread_data_races,
+                   OPT_fno_sanitize_thread_data_races,
+                   Opts.SanitizeThreadDataRaces);
+  Opts.SanitizeThreadStackTraces =
+      Args.hasFlag(OPT_fsanitize_thread_stack_traces,
+                   OPT_fno_sanitize_thread_stack_traces,
+                   Opts.SanitizeThreadStackTraces);
+  Opts.SanitizeThreadAtomics =
+      Args.hasFlag(OPT_fsanitize_thread_atomics,
+                   OPT_fno_sanitize_thread_atomics,
+                   Opts.SanitizeThreadAtomics);
   Opts.SanitizeMemoryTrackOrigins =
       getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags);
   Opts.SanitizeMemoryUseAfterDtor =
Index: lib/Driver/SanitizerArgs.cpp
===================================================================
--- lib/Driver/SanitizerArgs.cpp
+++ lib/Driver/SanitizerArgs.cpp
@@ -437,6 +437,18 @@
                  TC.getTriple().getArch() == llvm::Triple::x86_64);
   }
 
+  if (AllAddedKinds & Thread) {
+    TsanDataRaces = Args.hasFlag(options::OPT_fsanitize_thread_data_races,
+                                 options::OPT_fno_sanitize_thread_data_races,
+                                 TsanDataRaces);
+    TsanStackTraces = Args.hasFlag(options::OPT_fsanitize_thread_stack_traces,
+                                   options::OPT_fno_sanitize_thread_stack_traces,
+                                   TsanStackTraces);
+    TsanAtomics = Args.hasFlag(options::OPT_fsanitize_thread_atomics,
+                               options::OPT_fno_sanitize_thread_atomics,
+                               TsanAtomics);
+  }
+
   if (AllAddedKinds & CFI) {
     CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
                                options::OPT_fno_sanitize_cfi_cross_dso, false);
@@ -685,6 +697,13 @@
   if (MsanUseAfterDtor)
     CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-use-after-dtor"));
 
+  if (!TsanDataRaces)
+    CmdArgs.push_back(Args.MakeArgString("-fno-sanitize-thread-data-races"));
+  if (!TsanStackTraces)
+    CmdArgs.push_back(Args.MakeArgString("-fno-sanitize-thread-stack-traces"));
+  if (!TsanAtomics)
+    CmdArgs.push_back(Args.MakeArgString("-fno-sanitize-thread-atomics"));
+
   if (CfiCrossDso)
     CmdArgs.push_back(Args.MakeArgString("-fsanitize-cfi-cross-dso"));
 
Index: lib/CodeGen/BackendUtil.cpp
===================================================================
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -219,7 +219,12 @@
 
 static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
                                    legacy::PassManagerBase &PM) {
-  PM.add(createThreadSanitizerPass());
+  const PassManagerBuilderWrapper &BuilderWrapper =
+      static_cast<const PassManagerBuilderWrapper&>(Builder);
+  const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
+  PM.add(createThreadSanitizerPass(CGOpts.SanitizeThreadDataRaces,
+                                   CGOpts.SanitizeThreadStackTraces,
+                                   CGOpts.SanitizeThreadAtomics));
 }
 
 static void addDataFlowSanitizerPass(const PassManagerBuilder &Builder,
Index: include/clang/Frontend/CodeGenOptions.def
===================================================================
--- include/clang/Frontend/CodeGenOptions.def
+++ include/clang/Frontend/CodeGenOptions.def
@@ -163,6 +163,13 @@
                                           ///< in sanitizer coverage.
 CODEGENOPT(SanitizeCoverageTracePCGuard, 1, 0) ///< Enable PC tracing with guard
                                                ///< in sanitizer coverage.
+CODEGENOPT(SanitizeThreadDataRaces, 1, 1) ///< Enable data race detection in
+                                          ///< ThreadSanitizer
+CODEGENOPT(SanitizeThreadStackTraces, 1, 1) ///< Enable stack trace recording in
+                                            ///< ThreadSanitizer
+CODEGENOPT(SanitizeThreadAtomics, 1, 1) ///< Enable analysis of the
+                                        ///< synchronization via atomic
+                                        ///< operations in ThreadSanitizer
 CODEGENOPT(SanitizeStats     , 1, 0) ///< Collect statistics for sanitizers.
 CODEGENOPT(SimplifyLibCalls  , 1, 1) ///< Set when -fbuiltin is enabled.
 CODEGENOPT(SoftFloat         , 1, 0) ///< -soft-float.
Index: include/clang/Driver/SanitizerArgs.h
===================================================================
--- include/clang/Driver/SanitizerArgs.h
+++ include/clang/Driver/SanitizerArgs.h
@@ -38,6 +38,9 @@
   bool LinkCXXRuntimes = false;
   bool NeedPIE = false;
   bool Stats = false;
+  bool TsanDataRaces = true;
+  bool TsanStackTraces = true;
+  bool TsanAtomics = true;
 
  public:
   /// Parses the sanitizer arguments from an argument list.
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -728,6 +728,24 @@
 def fno_sanitize_stats : Flag<["-"], "fno-sanitize-stats">,
                                  Group<f_clang_Group>, Flags<[CC1Option]>,
                                  HelpText<"Disable sanitizer statistics gathering.">;
+def fsanitize_thread_data_races : Flag<["-"], "fsanitize-thread-data-races">,
+                                  Group<f_clang_Group>, Flags<[CC1Option]>,
+                                  HelpText<"Enable data race detection in ThreadSanitizer">;
+def fno_sanitize_thread_data_races : Flag<["-"], "fno-sanitize-thread-data-races">,
+                                     Group<f_clang_Group>, Flags<[CC1Option]>,
+                                     HelpText<"Disable data race detection in ThreadSanitizer">;
+def fsanitize_thread_stack_traces : Flag<["-"], "fsanitize-thread-stack-traces">,
+                                    Group<f_clang_Group>, Flags<[CC1Option]>,
+                                    HelpText<"Enable stack trace recording in ThreadSanitizer">;
+def fno_sanitize_thread_stack_traces : Flag<["-"], "fno-sanitize-thread-stack-traces">,
+                                       Group<f_clang_Group>, Flags<[CC1Option]>,
+                                       HelpText<"Disable stack trace recording in ThreadSanitizer">;
+def fsanitize_thread_atomics : Flag<["-"], "fsanitize-thread-atomics">,
+                               Group<f_clang_Group>, Flags<[CC1Option]>,
+                               HelpText<"Enable analysis of the synchronization via atomic operations in ThreadSanitizer">;
+def fno_sanitize_thread_atomics : Flag<["-"], "fno-sanitize-thread-atomics">,
+                                  Group<f_clang_Group>, Flags<[CC1Option]>,
+                                  HelpText<"Disable analysis of the synchronization via atomic operations in ThreadSanitizer">;
 def fsanitize_undefined_strip_path_components_EQ : Joined<["-"], "fsanitize-undefined-strip-path-components=">,
   Group<f_clang_Group>, Flags<[CC1Option]>, MetaVarName<"<number>">,
   HelpText<"Strip (or keep only, if negative) a given number of path components "
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to