diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 534d98be4344a..cca6eb44938ca 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1185,11 +1185,9 @@ static void addSanitizers(const Triple &TargetTriple, llvm::AsanDetectStackUseAfterReturnMode UseAfterReturn = CodeGenOpts.getSanitizeAddressUseAfterReturn(); MPM.addPass(RequireAnalysisPass()); - MPM.addPass(ModuleAddressSanitizerPass(CompileKernel, Recover, - UseGlobalGC, UseOdrIndicator, - DestructorKind)); - MPM.addPass(createModuleToFunctionPassAdaptor(AddressSanitizerPass( - {CompileKernel, Recover, UseAfterScope, UseAfterReturn}))); + MPM.addPass(ModuleAddressSanitizerPass( + CompileKernel, Recover, ModuleUseAfterScope, UseOdrIndicator, + DestructorKind, UseAfterScope, UseAfterReturn)); } }; ASanPass(SanitizerKind::Address, false); diff --git a/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h index ea18974798570..fb65c59408466 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h @@ -128,7 +128,10 @@ class ModuleAddressSanitizerPass explicit ModuleAddressSanitizerPass( bool CompileKernel = false, bool Recover = false, bool UseGlobalGC = true, bool UseOdrIndicator = false, - AsanDtorKind DestructorKind = AsanDtorKind::Global); + AsanDtorKind DestructorKind = AsanDtorKind::Global, + bool UseAfterScope = false, + AsanDetectStackUseAfterReturnMode UseAfterReturn = + AsanDetectStackUseAfterReturnMode::Runtime); PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); void printPipeline(raw_ostream &OS, function_ref MapClassName2PassName); @@ -140,6 +143,8 @@ class ModuleAddressSanitizerPass bool UseGlobalGC; bool UseOdrIndicator; AsanDtorKind DestructorKind; + bool UseAfterScope; + AsanDetectStackUseAfterReturnMode UseAfterReturn; }; // Insert AddressSanitizer (address sanity checking) instrumentation diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 655c472878a00..58966d3e715d3 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -136,7 +136,7 @@ MODULE_PASS_WITH_PARAMS("hwasan", }, parseHWASanPassOptions, "kernel;recover") -MODULE_PASS_WITH_PARAMS("asan-module", +MODULE_PASS_WITH_PARAMS("asan", "ModuleAddressSanitizerPass", [](bool CompileKernel) { return ModuleAddressSanitizerPass(CompileKernel, @@ -393,13 +393,6 @@ FUNCTION_PASS_WITH_PARAMS("loop-unroll", "no-profile-peeling;profile-peeling;" "no-runtime;runtime;" "no-upperbound;upperbound") -FUNCTION_PASS_WITH_PARAMS("asan", - "AddressSanitizerPass", - [](AddressSanitizerOptions Opts) { - return AddressSanitizerPass(Opts); - }, - parseASanPassOptions, - "kernel") FUNCTION_PASS_WITH_PARAMS("msan", "MemorySanitizerPass", [](MemorySanitizerOptions Opts) { diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 5563fc14d151b..9cd63574d266d 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1295,17 +1295,28 @@ void ModuleAddressSanitizerPass::printPipeline( ModuleAddressSanitizerPass::ModuleAddressSanitizerPass( bool CompileKernel, bool Recover, bool UseGlobalGC, bool UseOdrIndicator, - AsanDtorKind DestructorKind) + AsanDtorKind DestructorKind, bool UseAfterScope, + AsanDetectStackUseAfterReturnMode UseAfterReturn) : CompileKernel(CompileKernel), Recover(Recover), UseGlobalGC(UseGlobalGC), - UseOdrIndicator(UseOdrIndicator), DestructorKind(DestructorKind) {} + UseOdrIndicator(UseOdrIndicator), DestructorKind(DestructorKind), + UseAfterScope(UseAfterScope), UseAfterReturn(UseAfterReturn) {} PreservedAnalyses ModuleAddressSanitizerPass::run(Module &M, - AnalysisManager &AM) { - GlobalsMetadata &GlobalsMD = AM.getResult(M); - ModuleAddressSanitizer Sanitizer(M, &GlobalsMD, CompileKernel, Recover, - UseGlobalGC, UseOdrIndicator, - DestructorKind); - if (Sanitizer.instrumentModule(M)) + ModuleAnalysisManager &MAM) { + GlobalsMetadata &GlobalsMD = MAM.getResult(M); + ModuleAddressSanitizer ModuleSanitizer(M, &GlobalsMD, CompileKernel, Recover, + UseGlobalGC, UseOdrIndicator, + DestructorKind); + bool Modified = false; + auto &FAM = MAM.getResult(M).getManager(); + for (Function &F : M) { + AddressSanitizer FunctionSanitizer(M, &GlobalsMD, CompileKernel, Recover, + UseAfterScope, UseAfterReturn); + const TargetLibraryInfo &TLI = FAM.getResult(F); + Modified |= FunctionSanitizer.instrumentFunction(F, &TLI); + } + Modified |= ModuleSanitizer.instrumentModule(M); + if (Modified) return PreservedAnalyses::none(); return PreservedAnalyses::all(); } @@ -2841,6 +2852,8 @@ bool AddressSanitizer::suppressInstrumentationSiteForDebug(int &Instrumented) { 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 index 3f7003b136aef..8fb8fe384090f 100644 --- 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)' -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/test/Other/new-pm-print-pipeline.ll b/llvm/test/Other/new-pm-print-pipeline.ll index 11fa91684c4dc..3085bcde9fa67 100644 --- a/llvm/test/Other/new-pm-print-pipeline.ll +++ b/llvm/test/Other/new-pm-print-pipeline.ll @@ -46,8 +46,8 @@ ; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='module(hwasan<>,hwasan)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-14 ; CHECK-14: hwasan<>,hwasan -; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(asan<>,asan)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-15 -; CHECK-15: function(asan<>,asan) +; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='module(asan<>,asan)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-15 +; CHECK-15: asan<>,asan ; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='module(loop-extract<>,loop-extract)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-16 ; CHECK-16: loop-extract<>,loop-extract diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp index 794c01f31c11f..a3098fa051151 100644 --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -340,19 +340,16 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, PB.registerPipelineParsingCallback( [](StringRef Name, ModulePassManager &MPM, ArrayRef) { - AddressSanitizerOptions Opts; if (Name == "asan-pipeline") { MPM.addPass( RequireAnalysisPass()); - MPM.addPass( - createModuleToFunctionPassAdaptor(AddressSanitizerPass(Opts))); MPM.addPass(ModuleAddressSanitizerPass()); return true; } else if (Name == "asan-function-pipeline") { + // FIXME: now this is the same as asan-pipeline and can me removed. MPM.addPass( RequireAnalysisPass()); - MPM.addPass( - createModuleToFunctionPassAdaptor(AddressSanitizerPass(Opts))); + MPM.addPass(ModuleAddressSanitizerPass()); return true; } return false;