@@ -1300,14 +1300,22 @@ ModuleAddressSanitizerPass::ModuleAddressSanitizerPass(
13001300 UseOdrIndicator(UseOdrIndicator), DestructorKind(DestructorKind) {}
13011301
13021302PreservedAnalyses ModuleAddressSanitizerPass::run (Module &M,
1303- AnalysisManager<Module> &AM) {
1304- GlobalsMetadata &GlobalsMD = AM.getResult <ASanGlobalsMetadataAnalysis>(M);
1305- ModuleAddressSanitizer Sanitizer (M, &GlobalsMD, Options.CompileKernel ,
1306- Options.Recover , UseGlobalGC,
1307- UseOdrIndicator, DestructorKind);
1308- if (Sanitizer.instrumentModule (M))
1309- return PreservedAnalyses::none ();
1310- return PreservedAnalyses::all ();
1303+ ModuleAnalysisManager &MAM) {
1304+ GlobalsMetadata &GlobalsMD = MAM.getResult <ASanGlobalsMetadataAnalysis>(M);
1305+ ModuleAddressSanitizer ModuleSanitizer (M, &GlobalsMD, Options.CompileKernel ,
1306+ Options.Recover , UseGlobalGC,
1307+ UseOdrIndicator, DestructorKind);
1308+ bool Modified = false ;
1309+ auto &FAM = MAM.getResult <FunctionAnalysisManagerModuleProxy>(M).getManager ();
1310+ for (Function &F : M) {
1311+ AddressSanitizer FunctionSanitizer (M, &GlobalsMD, Options.CompileKernel ,
1312+ Options.Recover , Options.UseAfterScope ,
1313+ Options.UseAfterReturn );
1314+ const TargetLibraryInfo &TLI = FAM.getResult <TargetLibraryAnalysis>(F);
1315+ Modified |= FunctionSanitizer.instrumentFunction (F, &TLI);
1316+ }
1317+ Modified |= ModuleSanitizer.instrumentModule (M);
1318+ return Modified ? PreservedAnalyses::none () : PreservedAnalyses::all ();
13111319}
13121320
13131321INITIALIZE_PASS (ASanGlobalsMetadataWrapperPass, " asan-globals-md" ,
@@ -2841,6 +2849,8 @@ bool AddressSanitizer::suppressInstrumentationSiteForDebug(int &Instrumented) {
28412849
28422850bool AddressSanitizer::instrumentFunction (Function &F,
28432851 const TargetLibraryInfo *TLI) {
2852+ if (F.empty ())
2853+ return false ;
28442854 if (F.getLinkage () == GlobalValue::AvailableExternallyLinkage) return false ;
28452855 if (!ClDebugFunc.empty () && ClDebugFunc == F.getName ()) return false ;
28462856 if (F.getName ().startswith (" __asan_" )) return false ;
0 commit comments