[llvm] r350647 - [NewPM] Port tsan

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 8 11:55:00 PST 2019


Is there a clang side patch going in for this? Getting a build error:

tools/clang/lib/CodeGen/BackendUtil.cpp:308:10: error: use of undeclared
identifier 'createThreadSanitizerPass'; did you mean
'createHWAddressSanitizerPass'?
  PM.add(createThreadSanitizerPass());
         ^~~~~~~~~~~~~~~~~~~~~~~~~
         createHWAddressSanitizerPass


Thanks,
Teresa

On Tue, Jan 8, 2019 at 11:25 AM Philip Pfaffe via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: pfaffe
> Date: Tue Jan  8 11:21:57 2019
> New Revision: 350647
>
> URL: http://llvm.org/viewvc/llvm-project?rev=350647&view=rev
> Log:
> [NewPM] Port tsan
>
> A straightforward port of tsan to the new PM, following the same path
> as D55647.
>
> Differential Revision: https://reviews.llvm.org/D56433
>
> Added:
>     llvm/trunk/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h
> Modified:
>     llvm/trunk/include/llvm/InitializePasses.h
>     llvm/trunk/include/llvm/Transforms/Instrumentation.h
>     llvm/trunk/lib/Passes/PassBuilder.cpp
>     llvm/trunk/lib/Passes/PassRegistry.def
>     llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
>     llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
>     llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
>
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Tue Jan  8 11:21:57 2019
> @@ -391,7 +391,7 @@ void initializeTailDuplicatePass(PassReg
>  void initializeTargetLibraryInfoWrapperPassPass(PassRegistry&);
>  void initializeTargetPassConfigPass(PassRegistry&);
>  void initializeTargetTransformInfoWrapperPassPass(PassRegistry&);
> -void initializeThreadSanitizerPass(PassRegistry&);
> +void initializeThreadSanitizerLegacyPassPass(PassRegistry&);
>  void initializeTwoAddressInstructionPassPass(PassRegistry&);
>  void initializeTypeBasedAAWrapperPassPass(PassRegistry&);
>  void initializeUnifyFunctionExitNodesPass(PassRegistry&);
>
> Modified: llvm/trunk/include/llvm/Transforms/Instrumentation.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation.h?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Instrumentation.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Instrumentation.h Tue Jan  8
> 11:21:57 2019
> @@ -155,9 +155,6 @@ ModulePass *createAddressSanitizerModule
>  FunctionPass *createHWAddressSanitizerPass(bool CompileKernel = false,
>                                             bool Recover = false);
>
> -// Insert ThreadSanitizer (race detection) instrumentation
> -FunctionPass *createThreadSanitizerPass();
> -
>  // Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation
>  ModulePass *createDataFlowSanitizerPass(
>      const std::vector<std::string> &ABIListFiles =
> std::vector<std::string>(),
>
> Added: llvm/trunk/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h?rev=350647&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h
> (added)
> +++ llvm/trunk/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h
> Tue Jan  8 11:21:57 2019
> @@ -0,0 +1,19 @@
> +#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_THREADSANITIZER_H
> +#define LLVM_TRANSFORMS_INSTRUMENTATION_THREADSANITIZER_H
> +
> +#include "llvm/IR/PassManager.h"
> +
> +namespace llvm {
> +// Insert ThreadSanitizer (race detection) instrumentation
> +FunctionPass *createThreadSanitizerLegacyPassPass();
> +
> +/// A function pass for tsan instrumentation.
> +///
> +/// Instruments functions to detect race conditions reads. This function
> pass
> +/// inserts calls to runtime library functions. If the functions aren't
> declared
> +/// yet, the pass inserts the declarations. Otherwise the existing
> globals are
> +struct ThreadSanitizerPass : public PassInfoMixin<ThreadSanitizerPass> {
> +  PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
> +};
> +}
> +#endif /* LLVM_TRANSFORMS_INSTRUMENTATION_THREADSANITIZER_H */
>
> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Tue Jan  8 11:21:57 2019
> @@ -95,6 +95,7 @@
>  #include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
>  #include "llvm/Transforms/Instrumentation/InstrProfiling.h"
>  #include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
> +#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
>  #include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
>  #include "llvm/Transforms/Scalar/ADCE.h"
>  #include "llvm/Transforms/Scalar/AlignmentFromAssumptions.h"
>
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Tue Jan  8 11:21:57 2019
> @@ -234,6 +234,7 @@ FUNCTION_PASS("view-cfg", CFGViewerPass(
>  FUNCTION_PASS("view-cfg-only", CFGOnlyViewerPass())
>  FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
>  FUNCTION_PASS("msan", MemorySanitizerPass())
> +FUNCTION_PASS("tsan", ThreadSanitizerPass())
>  #undef FUNCTION_PASS
>
>  #ifndef LOOP_ANALYSIS
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp Tue Jan
> 8 11:21:57 2019
> @@ -113,7 +113,7 @@ void llvm::initializeInstrumentation(Pas
>    initializeInstrProfilingLegacyPassPass(Registry);
>    initializeMemorySanitizerLegacyPassPass(Registry);
>    initializeHWAddressSanitizerPass(Registry);
> -  initializeThreadSanitizerPass(Registry);
> +  initializeThreadSanitizerLegacyPassPass(Registry);
>    initializeSanitizerCoverageModulePass(Registry);
>    initializeDataFlowSanitizerPass(Registry);
>    initializeEfficiencySanitizerPass(Registry);
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp Tue Jan
> 8 11:21:57 2019
> @@ -19,6 +19,7 @@
>  // The rest is handled by the run-time library.
>
>  //===----------------------------------------------------------------------===//
>
> +#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
> @@ -80,21 +81,21 @@ STATISTIC(NumOmittedReadsFromConstantGlo
>  STATISTIC(NumOmittedReadsFromVtable, "Number of vtable reads");
>  STATISTIC(NumOmittedNonCaptured, "Number of accesses ignored due to
> capturing");
>
> -static const char *const kTsanModuleCtorName = "tsan.module_ctor";
>  static const char *const kTsanInitName = "__tsan_init";
>
>  namespace {
>
>  /// ThreadSanitizer: instrument the code in module to find races.
> -struct ThreadSanitizer : public FunctionPass {
> -  ThreadSanitizer() : FunctionPass(ID) {}
> -  StringRef getPassName() const override;
> -  void getAnalysisUsage(AnalysisUsage &AU) const override;
> -  bool runOnFunction(Function &F) override;
> -  bool doInitialization(Module &M) override;
> -  static char ID;  // Pass identification, replacement for typeid.
> +///
> +/// Instantiating ThreadSanitizer inserts the msan runtime library API
> function
> +/// declarations into the module if they don't exist already.
> Instantiating
> +/// ensures the __tsan_init function is in the list of global
> constructors for
> +/// the module.
> +struct ThreadSanitizer {
> +  ThreadSanitizer(Module &M);
> +  bool sanitizeFunction(Function &F, const TargetLibraryInfo &TLI);
>
> - private:
> +private:
>    void initializeCallbacks(Module &M);
>    bool instrumentLoadOrStore(Instruction *I, const DataLayout &DL);
>    bool instrumentAtomic(Instruction *I, const DataLayout &DL);
> @@ -128,29 +129,56 @@ struct ThreadSanitizer : public Function
>    Function *TsanVptrUpdate;
>    Function *TsanVptrLoad;
>    Function *MemmoveFn, *MemcpyFn, *MemsetFn;
> -  Function *TsanCtorFunction;
> +};
> +
> +struct ThreadSanitizerLegacyPass : FunctionPass {
> +  ThreadSanitizerLegacyPass() : FunctionPass(ID) {}
> +  StringRef getPassName() const override;
> +  void getAnalysisUsage(AnalysisUsage &AU) const override;
> +  bool runOnFunction(Function &F) override;
> +  bool doInitialization(Module &M) override;
> +  static char ID; // Pass identification, replacement for typeid.
> +private:
> +  Optional<ThreadSanitizer> TSan;
>  };
>  }  // namespace
>
> -char ThreadSanitizer::ID = 0;
> -INITIALIZE_PASS_BEGIN(
> -    ThreadSanitizer, "tsan",
> -    "ThreadSanitizer: detects data races.",
> -    false, false)
> +PreservedAnalyses ThreadSanitizerPass::run(Function &F,
> +                                           FunctionAnalysisManager &FAM) {
> +  ThreadSanitizer TSan(*F.getParent());
> +  if (TSan.sanitizeFunction(F, FAM.getResult<TargetLibraryAnalysis>(F)))
> +    return PreservedAnalyses::none();
> +  return PreservedAnalyses::all();
> +}
> +
> +char ThreadSanitizerLegacyPass::ID = 0;
> +INITIALIZE_PASS_BEGIN(ThreadSanitizerLegacyPass, "tsan",
> +                      "ThreadSanitizer: detects data races.", false,
> false)
>  INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
> -INITIALIZE_PASS_END(
> -    ThreadSanitizer, "tsan",
> -    "ThreadSanitizer: detects data races.",
> -    false, false)
> +INITIALIZE_PASS_END(ThreadSanitizerLegacyPass, "tsan",
> +                    "ThreadSanitizer: detects data races.", false, false)
>
> -StringRef ThreadSanitizer::getPassName() const { return
> "ThreadSanitizer"; }
> +StringRef ThreadSanitizerLegacyPass::getPassName() const {
> +  return "ThreadSanitizerLegacyPass";
> +}
>
> -void ThreadSanitizer::getAnalysisUsage(AnalysisUsage &AU) const {
> +void ThreadSanitizerLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const
> {
>    AU.addRequired<TargetLibraryInfoWrapperPass>();
>  }
>
> -FunctionPass *llvm::createThreadSanitizerPass() {
> -  return new ThreadSanitizer();
> +bool ThreadSanitizerLegacyPass::doInitialization(Module &M) {
> +  TSan.emplace(M);
> +  return true;
> +}
> +
> +bool ThreadSanitizerLegacyPass::runOnFunction(Function &F) {
> +  auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
> +  TSan->sanitizeFunction(F, TLI);
> +  return true;
> +}
> +
> +FunctionPass *llvm::createThreadSanitizerLegacyPassPass() {
> +  return new ThreadSanitizerLegacyPass();
>  }
>
>  void ThreadSanitizer::initializeCallbacks(Module &M) {
> @@ -252,16 +280,10 @@ void ThreadSanitizer::initializeCallback
>                              IRB.getInt32Ty(), IntptrTy));
>  }
>
> -bool ThreadSanitizer::doInitialization(Module &M) {
> +ThreadSanitizer::ThreadSanitizer(Module &M) {
>    const DataLayout &DL = M.getDataLayout();
>    IntptrTy = DL.getIntPtrType(M.getContext());
> -  std::tie(TsanCtorFunction, std::ignore) =
> createSanitizerCtorAndInitFunctions(
> -      M, kTsanModuleCtorName, kTsanInitName, /*InitArgTypes=*/{},
> -      /*InitArgs=*/{});
> -
> -  appendToGlobalCtors(M, TsanCtorFunction, 0);
> -
> -  return true;
> +  getOrCreateInitFunction(M, kTsanInitName);
>  }
>
>  static bool isVtableAccess(Instruction *I) {
> @@ -402,11 +424,8 @@ void ThreadSanitizer::InsertRuntimeIgnor
>    }
>  }
>
> -bool ThreadSanitizer::runOnFunction(Function &F) {
> -  // This is required to prevent instrumenting call to __tsan_init from
> within
> -  // the module constructor.
> -  if (&F == TsanCtorFunction)
> -    return false;
> +bool ThreadSanitizer::sanitizeFunction(Function &F,
> +                                       const TargetLibraryInfo &TLI) {
>    initializeCallbacks(*F.getParent());
>    SmallVector<Instruction*, 8> AllLoadsAndStores;
>    SmallVector<Instruction*, 8> LocalLoadsAndStores;
> @@ -416,8 +435,6 @@ bool ThreadSanitizer::runOnFunction(Func
>    bool HasCalls = false;
>    bool SanitizeFunction = F.hasFnAttribute(Attribute::SanitizeThread);
>    const DataLayout &DL = F.getParent()->getDataLayout();
> -  const TargetLibraryInfo *TLI =
> -      &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
>
>    // Traverse all instructions, collect loads/stores/returns, check for
> calls.
>    for (auto &BB : F) {
> @@ -428,7 +445,7 @@ bool ThreadSanitizer::runOnFunction(Func
>          LocalLoadsAndStores.push_back(&Inst);
>        else if (isa<CallInst>(Inst) || isa<InvokeInst>(Inst)) {
>          if (CallInst *CI = dyn_cast<CallInst>(&Inst))
> -          maybeMarkSanitizerLibraryCallNoBuiltin(CI, TLI);
> +          maybeMarkSanitizerLibraryCallNoBuiltin(CI, &TLI);
>          if (isa<MemIntrinsic>(Inst))
>            MemIntrinCalls.push_back(&Inst);
>          HasCalls = true;
>
> Modified: llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll?rev=350647&r1=350646&r2=350647&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
> (original)
> +++ llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll Tue Jan
> 8 11:21:57 2019
> @@ -1,4 +1,5 @@
>  ; RUN: opt < %s -tsan -S | FileCheck %s
> +; RUN: opt < %s -passes=tsan -S | FileCheck %s
>
>  target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
>  target triple = "x86_64-unknown-linux-gnu"
> @@ -9,7 +10,7 @@ entry:
>    ret i32 %tmp1
>  }
>
> -; CHECK: @llvm.global_ctors = {{.*}}@tsan.module_ctor
> +; CHECK: @llvm.global_ctors = {{.*}}@__tsan_init
>
>  ; CHECK: define i32 @read_4_bytes(i32* %a)
>  ; CHECK:        call void @__tsan_func_entry(i8* %0)
> @@ -77,6 +78,3 @@ define void @SwiftErrorCall(i8** swifter
>    call void @SwiftError(i8** %0)
>    ret void
>  }
> -
> -; CHECK: define internal void @tsan.module_ctor()
> -; CHECK: call void @__tsan_init()
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190108/3fa8b731/attachment.html>


More information about the llvm-commits mailing list