[llvm] r350647 - [NewPM] Port tsan
Philip Pfaffe via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 8 12:01:32 PST 2019
Yes, sorry, patch incoming.
On Tue, Jan 8, 2019 at 8:55 PM Teresa Johnson <tejohnson at google.com> wrote:
> 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/4d0e812b/attachment.html>
More information about the llvm-commits
mailing list