llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-compiler-rt-sanitizer Author: Vitaly Buka (vitalybuka) <details> <summary>Changes</summary> Avoids tracking conditions when it's needed. --- Full diff: https://github.com/llvm/llvm-project/pull/104729.diff 1 Files Affected: - (modified) llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp (+22-18) ``````````diff diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 2655f49c48e311..01dbdc156f698e 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -944,13 +944,14 @@ class ModuleAddressSanitizer { bool shouldInstrumentGlobal(GlobalVariable *G) const; bool ShouldUseMachOGlobalsSection() const; StringRef getGlobalMetadataSection() const; - void poisonOneInitializer(Function &GlobalInit, GlobalValue *ModuleName); - void createInitializerPoisonCalls(GlobalValue *ModuleName); + void poisonOneInitializer(Function &GlobalInit); + void createInitializerPoisonCalls(); uint64_t getMinRedzoneSizeForGlobal() const { return getRedzoneSizeForScale(Mapping.Scale); } uint64_t getRedzoneSizeForGlobal(uint64_t SizeInBytes) const; int GetAsanVersion() const; + GlobalVariable *getOrCreateModuleName(); Module &M; bool CompileKernel; @@ -978,6 +979,7 @@ class ModuleAddressSanitizer { Function *AsanCtorFunction = nullptr; Function *AsanDtorFunction = nullptr; + GlobalVariable *ModuleName = nullptr; }; // Stack poisoning does not play well with exception handling. @@ -1965,14 +1967,14 @@ void AddressSanitizer::instrumentUnusualSizeOrAlignment( } } -void ModuleAddressSanitizer::poisonOneInitializer(Function &GlobalInit, - GlobalValue *ModuleName) { +void ModuleAddressSanitizer::poisonOneInitializer(Function &GlobalInit) { // Set up the arguments to our poison/unpoison functions. IRBuilder<> IRB(&GlobalInit.front(), GlobalInit.front().getFirstInsertionPt()); // Add a call to poison all external globals before the given function starts. - Value *ModuleNameAddr = ConstantExpr::getPointerCast(ModuleName, IntptrTy); + Value *ModuleNameAddr = + ConstantExpr::getPointerCast(getOrCreateModuleName(), IntptrTy); IRB.CreateCall(AsanPoisonGlobals, ModuleNameAddr); // Add calls to unpoison all globals before each return instruction. @@ -1981,8 +1983,7 @@ void ModuleAddressSanitizer::poisonOneInitializer(Function &GlobalInit, CallInst::Create(AsanUnpoisonGlobals, "", RI->getIterator()); } -void ModuleAddressSanitizer::createInitializerPoisonCalls( - GlobalValue *ModuleName) { +void ModuleAddressSanitizer::createInitializerPoisonCalls() { GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors"); if (!GV) return; @@ -2002,7 +2003,7 @@ void ModuleAddressSanitizer::createInitializerPoisonCalls( // Don't instrument CTORs that will run before asan.module_ctor. if (Priority->getLimitedValue() <= GetCtorAndDtorPriority(TargetTriple)) continue; - poisonOneInitializer(*F, ModuleName); + poisonOneInitializer(*F); } } } @@ -2539,14 +2540,6 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, bool HasDynamicallyInitializedGlobals = false; - // We shouldn't merge same module names, as this string serves as unique - // module ID in runtime. - GlobalVariable *ModuleName = - n != 0 ? createPrivateGlobalForString(M, M.getModuleIdentifier(), - /*AllowMerging*/ false, - genName("module")) - : nullptr; - for (size_t i = 0; i < n; i++) { GlobalVariable *G = GlobalsToChange[i]; @@ -2647,7 +2640,7 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, ConstantInt::get(IntptrTy, SizeInBytes), ConstantInt::get(IntptrTy, SizeInBytes + RightRedzoneSize), ConstantExpr::getPointerCast(Name, IntptrTy), - ConstantExpr::getPointerCast(ModuleName, IntptrTy), + ConstantExpr::getPointerCast(getOrCreateModuleName(), IntptrTy), ConstantInt::get(IntptrTy, MD.IsDynInit), Constant::getNullValue(IntptrTy), ConstantExpr::getPointerCast(ODRIndicator, IntptrTy)); @@ -2694,7 +2687,7 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, // Create calls for poisoning before initializers run and unpoisoning after. if (HasDynamicallyInitializedGlobals) - createInitializerPoisonCalls(ModuleName); + createInitializerPoisonCalls(); LLVM_DEBUG(dbgs() << M); } @@ -2734,6 +2727,17 @@ int ModuleAddressSanitizer::GetAsanVersion() const { return Version; } +GlobalVariable *ModuleAddressSanitizer::getOrCreateModuleName() { + if (!ModuleName) { + // We shouldn't merge same module names, as this string serves as unique + // module ID in runtime. + ModuleName = + createPrivateGlobalForString(M, M.getModuleIdentifier(), + /*AllowMerging*/ false, genName("module")); + } + return ModuleName; +} + bool ModuleAddressSanitizer::instrumentModule() { initializeCallbacks(); `````````` </details> https://github.com/llvm/llvm-project/pull/104729 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits