diff options
| author | Kostya Serebryany <kcc@google.com> | 2014-10-31 17:11:27 +0000 |
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2014-10-31 17:11:27 +0000 |
| commit | 001ea5fe15f737c867320f8a7e5fe45e2783e6d2 (patch) | |
| tree | a96b5264c21e86156a537a8854a2b8a8a775a4f0 /llvm | |
| parent | e9f6a717dd9003b597defee48567431a7db7f9f4 (diff) | |
| download | bcm5719-llvm-001ea5fe15f737c867320f8a7e5fe45e2783e6d2.tar.gz bcm5719-llvm-001ea5fe15f737c867320f8a7e5fe45e2783e6d2.zip | |
[asan] fix caller-calee instrumentation to emit new cache for every call site
llvm-svn: 220973
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/Instrumentation/AddressSanitizer/coverage.ll | 6 |
2 files changed, 9 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 3f0db3630b9..de7b83d0294 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/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/llvm/test/Instrumentation/AddressSanitizer/coverage.ll b/llvm/test/Instrumentation/AddressSanitizer/coverage.ll index d666925d622..707371ad33f 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/coverage.ll +++ b/llvm/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 |

