From 96076957ac814b41843b06c4e266b62d49427516 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Fri, 31 Oct 2014 17:11:27 +0000 Subject: [PATCH] [asan] fix caller-calee instrumentation to emit new cache for every call site git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220973 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Instrumentation/AddressSanitizer.cpp | 8 ++++---- test/Instrumentation/AddressSanitizer/coverage.ll | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) 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 -- 2.34.1