diff options
author | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2021-09-15 22:26:22 +0200 |
---|---|---|
committer | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2021-09-16 14:58:42 +0200 |
commit | 8f8616655c4d643d73601c6bf4b492fb9d3b52c8 (patch) | |
tree | 6d42ecab35241715a071e76ed2222e5a52a4cd0f | |
parent | ab41eef9aca3ad5e9321e045a57d36e288a75d17 (diff) | |
download | llvm-8f8616655c4d643d73601c6bf4b492fb9d3b52c8.zip llvm-8f8616655c4d643d73601c6bf4b492fb9d3b52c8.tar.gz llvm-8f8616655c4d643d73601c6bf4b492fb9d3b52c8.tar.bz2 |
[NewPM] Use a separate struct for ModuleThreadSanitizerPass
Split ThreadSanitizerPass into ThreadSanitizerPass (as a function
pass) and ModuleThreadSanitizerPass (as a module pass).
Main reason is to make sure that we have a unique mapping from
ClassName to PassName in the new passmanager framework, making it
possible to correctly identify the passes when dealing with options
such as -print-after and -print-pipeline-passes.
This is a follow-up to D105006 and D105007.
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h | 8 | ||||
-rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 2 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp | 4 |
4 files changed, 12 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 3867ecf..2fdad81 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1142,7 +1142,7 @@ static void addSanitizers(const Triple &TargetTriple, MSanPass(SanitizerKind::KernelMemory, true); if (LangOpts.Sanitize.has(SanitizerKind::Thread)) { - MPM.addPass(ThreadSanitizerPass()); + MPM.addPass(ModuleThreadSanitizerPass()); MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); } diff --git a/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h index f9c5076..e795043 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h @@ -27,6 +27,14 @@ FunctionPass *createThreadSanitizerLegacyPassPass(); /// yet, the pass inserts the declarations. Otherwise the existing globals are struct ThreadSanitizerPass : public PassInfoMixin<ThreadSanitizerPass> { PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM); + static bool isRequired() { return true; } +}; + +/// A module pass for tsan instrumentation. +/// +/// Create ctor and init functions. +struct ModuleThreadSanitizerPass + : public PassInfoMixin<ModuleThreadSanitizerPass> { PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); static bool isRequired() { return true; } }; diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 6f107c3..689ae62 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -111,7 +111,7 @@ MODULE_PASS("wholeprogramdevirt", WholeProgramDevirtPass()) MODULE_PASS("dfsan", DataFlowSanitizerPass()) MODULE_PASS("asan-module", ModuleAddressSanitizerPass(/*CompileKernel=*/false, false, true, false)) MODULE_PASS("msan-module", ModuleMemorySanitizerPass({})) -MODULE_PASS("tsan-module", ThreadSanitizerPass()) +MODULE_PASS("tsan-module", ModuleThreadSanitizerPass()) MODULE_PASS("kasan-module", ModuleAddressSanitizerPass(/*CompileKernel=*/true, false, true, false)) MODULE_PASS("sancov-module", ModuleSanitizerCoveragePass()) MODULE_PASS("memprof-module", ModuleMemProfilerPass()) diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index 714e21d..b967b37 100644 --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -206,8 +206,8 @@ PreservedAnalyses ThreadSanitizerPass::run(Function &F, return PreservedAnalyses::all(); } -PreservedAnalyses ThreadSanitizerPass::run(Module &M, - ModuleAnalysisManager &MAM) { +PreservedAnalyses ModuleThreadSanitizerPass::run(Module &M, + ModuleAnalysisManager &MAM) { insertModuleCtor(M); return PreservedAnalyses::none(); } |