diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1188,8 +1188,6 @@ MPM.addPass(RequireAnalysisPass()); MPM.addPass(ModuleAddressSanitizerPass( Opts, UseGlobalGC, UseOdrIndicator, DestructorKind)); - MPM.addPass( - createModuleToFunctionPassAdaptor(AddressSanitizerPass(Opts))); } }; ASanPass(SanitizerKind::Address, false); diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1300,14 +1300,22 @@ UseOdrIndicator(UseOdrIndicator), DestructorKind(DestructorKind) {} PreservedAnalyses ModuleAddressSanitizerPass::run(Module &M, - AnalysisManager &AM) { - GlobalsMetadata &GlobalsMD = AM.getResult(M); - ModuleAddressSanitizer Sanitizer(M, &GlobalsMD, Options.CompileKernel, - Options.Recover, UseGlobalGC, - UseOdrIndicator, DestructorKind); - if (Sanitizer.instrumentModule(M)) - return PreservedAnalyses::none(); - return PreservedAnalyses::all(); + ModuleAnalysisManager &MAM) { + GlobalsMetadata &GlobalsMD = MAM.getResult(M); + ModuleAddressSanitizer ModuleSanitizer(M, &GlobalsMD, Options.CompileKernel, + Options.Recover, UseGlobalGC, + UseOdrIndicator, DestructorKind); + bool Modified = false; + auto &FAM = MAM.getResult(M).getManager(); + for (Function &F : M) { + AddressSanitizer FunctionSanitizer(M, &GlobalsMD, Options.CompileKernel, + Options.Recover, Options.UseAfterScope, + Options.UseAfterReturn); + const TargetLibraryInfo &TLI = FAM.getResult(F); + Modified |= FunctionSanitizer.instrumentFunction(F, &TLI); + } + Modified |= ModuleSanitizer.instrumentModule(M); + return Modified ? PreservedAnalyses::none() : PreservedAnalyses::all(); } INITIALIZE_PASS(ASanGlobalsMetadataWrapperPass, "asan-globals-md", @@ -2841,6 +2849,8 @@ bool AddressSanitizer::instrumentFunction(Function &F, const TargetLibraryInfo *TLI) { + if (F.empty()) + return false; if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage) return false; if (!ClDebugFunc.empty() && ClDebugFunc == F.getName()) return false; if (F.getName().startswith("__asan_")) return false; diff --git a/llvm/test/Instrumentation/SanitizerCoverage/tracing-comdat.ll b/llvm/test/Instrumentation/SanitizerCoverage/tracing-comdat.ll --- a/llvm/test/Instrumentation/SanitizerCoverage/tracing-comdat.ll +++ b/llvm/test/Instrumentation/SanitizerCoverage/tracing-comdat.ll @@ -2,7 +2,7 @@ ; Make sure asan does not instrument __sancov_gen_ ; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s -; RUN: opt < %s -passes='module(require,sancov-module,asan-module),function(asan)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s +; RUN: opt < %s -passes='module(require,sancov-module,asan-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" $Foo = comdat any diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -344,8 +344,6 @@ if (Name == "asan-pipeline") { MPM.addPass( RequireAnalysisPass()); - MPM.addPass( - createModuleToFunctionPassAdaptor(AddressSanitizerPass(Opts))); MPM.addPass(ModuleAddressSanitizerPass(Opts)); return true; } else if (Name == "asan-function-pipeline") {