From 468fabf73192388b803c379ba0b23ac76c1c5517 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Tue, 22 Apr 2014 11:19:45 +0000 Subject: [PATCH] [asan] Support outline instrumentation for wide types and delete dead code, patch by Yuri Gribov git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206883 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/AddressSanitizer.cpp | 39 ++++++------------- .../instrumentation-with-call-threshold.ll | 7 +++- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index a7324e08ed1..00c7e746768 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -326,9 +326,6 @@ struct AddressSanitizer : public FunctionPass { bool IsWrite, size_t AccessSizeIndex, Value *SizeArgument); void instrumentMemIntrinsic(MemIntrinsic *MI); - void instrumentMemIntrinsicParam(Instruction *OrigIns, Value *Addr, - Value *Size, Instruction *InsertBefore, - bool IsWrite, bool UseCalls); Value *memToShadow(Value *Shadow, IRBuilder<> &IRB); bool runOnFunction(Function &F) override; bool maybeInsertAsanInitAtFunctionEntry(Function &F); @@ -603,24 +600,6 @@ Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) { return IRB.CreateAdd(Shadow, ConstantInt::get(IntptrTy, Mapping.Offset)); } -void AddressSanitizer::instrumentMemIntrinsicParam(Instruction *OrigIns, - Value *Addr, Value *Size, - Instruction *InsertBefore, - bool IsWrite, - bool UseCalls) { - IRBuilder<> IRB(InsertBefore); - if (Size->getType() != IntptrTy) - Size = IRB.CreateIntCast(Size, IntptrTy, false); - // Check the first byte. - instrumentAddress(OrigIns, InsertBefore, Addr, 8, IsWrite, Size, false); - // Check the last byte. - IRB.SetInsertPoint(InsertBefore); - Value *SizeMinusOne = IRB.CreateSub(Size, ConstantInt::get(IntptrTy, 1)); - Value *AddrLong = IRB.CreatePointerCast(Addr, IntptrTy); - Value *AddrLast = IRB.CreateAdd(AddrLong, SizeMinusOne); - instrumentAddress(OrigIns, InsertBefore, AddrLast, 8, IsWrite, Size, false); -} - // Instrument memset/memmove/memcpy void AddressSanitizer::instrumentMemIntrinsic(MemIntrinsic *MI) { IRBuilder<> IRB(MI); @@ -756,13 +735,19 @@ void AddressSanitizer::instrumentMop(Instruction *I, bool UseCalls) { // and the last bytes. We call __asan_report_*_n(addr, real_size) to be able // to report the actual access size. IRBuilder<> IRB(I); - Value *LastByte = IRB.CreateIntToPtr( - IRB.CreateAdd(IRB.CreatePointerCast(Addr, IntptrTy), - ConstantInt::get(IntptrTy, TypeSize / 8 - 1)), - OrigPtrTy); Value *Size = ConstantInt::get(IntptrTy, TypeSize / 8); - instrumentAddress(I, I, Addr, 8, IsWrite, Size, false); - instrumentAddress(I, I, LastByte, 8, IsWrite, Size, false); + Value *AddrLong = IRB.CreatePointerCast(Addr, IntptrTy); + if (UseCalls) { + CallInst *Check = + IRB.CreateCall2(AsanMemoryAccessCallbackSized[IsWrite], AddrLong, Size); + Check->setDebugLoc(I->getDebugLoc()); + } else { + Value *LastByte = IRB.CreateIntToPtr( + IRB.CreateAdd(AddrLong, ConstantInt::get(IntptrTy, TypeSize / 8 - 1)), + OrigPtrTy); + instrumentAddress(I, I, Addr, 8, IsWrite, Size, false); + instrumentAddress(I, I, LastByte, 8, IsWrite, Size, false); + } } // Validate the result of Module::getOrInsertFunction called for an interface diff --git a/test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll b/test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll index d2e4f98bb4c..dd82444b17b 100644 --- a/test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll +++ b/test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll @@ -10,15 +10,20 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -define void @test_load(i32* %a, i64* %b) sanitize_address { +define void @test_load(i32* %a, i64* %b, i512* %c, i80* %d) sanitize_address { entry: ; CHECK-CALL: call void @__asan_load4 ; CHECK-CALL: call void @__asan_load8 +; CHECK-CALL: call void @__asan_loadN{{.*}}i64 64) +; CHECK-CALL: call void @__asan_loadN{{.*}}i64 10) ; CHECK-CUSTOM-PREFIX: call void @__foo_load4 ; CHECK-CUSTOM-PREFIX: call void @__foo_load8 +; CHECK-CUSTOM-PREFIX: call void @__foo_loadN ; CHECK-INLINE-NOT: call void @__asan_load %tmp1 = load i32* %a %tmp2 = load i64* %b + %tmp3 = load i512* %c + %tmp4 = load i80* %d ret void }