From a55c4ec1cee7683d9095327d9d33e7137ec25292 Mon Sep 17 00:00:00 2001 From: Kirill Stoimenov Date: Wed, 3 Nov 2021 18:39:38 +0000 Subject: [PATCH] [ASan] Process functions in Asan module pass This came up as recommendation while reviewing D112098. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D112732 --- clang/lib/CodeGen/BackendUtil.cpp | 2 -- .../Instrumentation/AddressSanitizer.cpp | 26 +++++++++++++------ .../SanitizerCoverage/tracing-comdat.ll | 2 +- llvm/tools/opt/NewPMDriver.cpp | 2 -- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 64f972fe11a52..cc4eb539f94a2 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1188,8 +1188,6 @@ static void addSanitizers(const Triple &TargetTriple, 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 index beb252b763c13..18b3552656b57 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1300,14 +1300,22 @@ ModuleAddressSanitizerPass::ModuleAddressSanitizerPass( 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::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..4c3871842eb37 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-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 index 8093023451176..631d8eed5d7a8 100644 --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -344,8 +344,6 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, if (Name == "asan-pipeline") { MPM.addPass( RequireAnalysisPass()); - MPM.addPass( - createModuleToFunctionPassAdaptor(AddressSanitizerPass(Opts))); MPM.addPass(ModuleAddressSanitizerPass(Opts)); return true; } else if (Name == "asan-function-pipeline") {