diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 4 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp | 25 |
2 files changed, 21 insertions, 8 deletions
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index e785558d5a7..347f75870eb 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -55,6 +55,8 @@ MODULE_PASS("globaldce", GlobalDCEPass()) MODULE_PASS("globalopt", GlobalOptPass()) MODULE_PASS("globalsplit", GlobalSplitPass()) MODULE_PASS("hotcoldsplit", HotColdSplittingPass()) +MODULE_PASS("hwasan", HWAddressSanitizerPass(false, false)) +MODULE_PASS("khwasan", HWAddressSanitizerPass(true, true)) MODULE_PASS("inferattrs", InferFunctionAttrsPass()) MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass()) MODULE_PASS("instrorderfile", InstrOrderFilePass()) @@ -240,8 +242,6 @@ FUNCTION_PASS("view-cfg-only", CFGOnlyViewerPass()) FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass()) FUNCTION_PASS("asan", AddressSanitizerPass(false, false, false)) FUNCTION_PASS("kasan", AddressSanitizerPass(true, false, false)) -FUNCTION_PASS("hwasan", HWAddressSanitizerPass(false, false)) -FUNCTION_PASS("khwasan", HWAddressSanitizerPass(true, true)) FUNCTION_PASS("msan", MemorySanitizerPass({})) FUNCTION_PASS("kmsan", MemorySanitizerPass({0, false, /*Kernel=*/true})) FUNCTION_PASS("tsan", ThreadSanitizerPass()) diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 22e8b4ee2e2..90a9f4955a4 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -277,12 +277,22 @@ public: StringRef getPassName() const override { return "HWAddressSanitizer"; } + bool doInitialization(Module &M) override { + HWASan = llvm::make_unique<HWAddressSanitizer>(M, CompileKernel, Recover); + return true; + } + bool runOnFunction(Function &F) override { - HWAddressSanitizer HWASan(*F.getParent(), CompileKernel, Recover); - return HWASan.sanitizeFunction(F); + return HWASan->sanitizeFunction(F); + } + + bool doFinalization(Module &M) override { + HWASan.reset(); + return false; } private: + std::unique_ptr<HWAddressSanitizer> HWASan; bool CompileKernel; bool Recover; }; @@ -309,10 +319,13 @@ FunctionPass *llvm::createHWAddressSanitizerLegacyPassPass(bool CompileKernel, HWAddressSanitizerPass::HWAddressSanitizerPass(bool CompileKernel, bool Recover) : CompileKernel(CompileKernel), Recover(Recover) {} -PreservedAnalyses HWAddressSanitizerPass::run(Function &F, - FunctionAnalysisManager &FAM) { - HWAddressSanitizer HWASan(*F.getParent(), CompileKernel, Recover); - if (HWASan.sanitizeFunction(F)) +PreservedAnalyses HWAddressSanitizerPass::run(Module &M, + ModuleAnalysisManager &MAM) { + HWAddressSanitizer HWASan(M, CompileKernel, Recover); + bool Modified = false; + for (Function &F : M) + Modified |= HWASan.sanitizeFunction(F); + if (Modified) return PreservedAnalyses::none(); return PreservedAnalyses::all(); } |