[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