diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 3f0db3630b9..de7b83d0294 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1405,13 +1405,13 @@ void AddressSanitizer::InjectCoverageForIndirectCalls( const int kCacheSize = 16; const int kCacheAlignment = 64; // Align for better performance. Type *Ty = ArrayType::get(IntptrTy, kCacheSize); - GlobalVariable *CalleeCache = - new GlobalVariable(*F.getParent(), Ty, false, GlobalValue::PrivateLinkage, - Constant::getNullValue(Ty), "__asan_gen_callee_cache"); - CalleeCache->setAlignment(kCacheAlignment); for (auto I : IndirCalls) { IRBuilder<> IRB(I); CallSite CS(I); + GlobalVariable *CalleeCache = new GlobalVariable( + *F.getParent(), Ty, false, GlobalValue::PrivateLinkage, + Constant::getNullValue(Ty), "__asan_gen_callee_cache"); + CalleeCache->setAlignment(kCacheAlignment); IRB.CreateCall2(AsanCovIndirCallFunction, IRB.CreatePointerCast(CS.getCalledValue(), IntptrTy), IRB.CreatePointerCast(CalleeCache, IntptrTy)); diff --git a/test/Instrumentation/AddressSanitizer/coverage.ll b/test/Instrumentation/AddressSanitizer/coverage.ll index d666925d622..707371ad33f 100644 --- a/test/Instrumentation/AddressSanitizer/coverage.ll +++ b/test/Instrumentation/AddressSanitizer/coverage.ll @@ -78,9 +78,13 @@ entry: %vtable = load void (%struct.StructWithVptr*)*** %0, align 8 %1 = load void (%struct.StructWithVptr*)** %vtable, align 8 tail call void %1(%struct.StructWithVptr* %foo) + tail call void %1(%struct.StructWithVptr* %foo) ret void } +; We expect to see two calls to __sanitizer_cov_indir_call16 +; with different values of second argument. ; CHECK4-LABEL: define void @CallViaVptr -; CHECK4: call void @__sanitizer_cov_indir_call16 +; CHECK4: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE:.*]]) +; CHECK4-NOT: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE]]) ; CHECK4: ret void