[PATCH] Support outline instrumentation for wide types
Yury Gribov
tetra2005 at gmail.com
Tue Apr 22 03:47:05 PDT 2014
Added test.
Hi kcc,
http://reviews.llvm.org/D3447
CHANGE SINCE LAST DIFF
http://reviews.llvm.org/D3447?vs=8716&id=8719#toc
Files:
lib/Transforms/Instrumentation/AddressSanitizer.cpp
test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll
Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -326,9 +326,6 @@
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 @@
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,20 @@
// 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
Index: test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll
===================================================================
--- test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll
+++ test/Instrumentation/AddressSanitizer/instrumentation-with-call-threshold.ll
@@ -10,15 +10,18 @@
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) sanitize_address {
entry:
; CHECK-CALL: call void @__asan_load4
; CHECK-CALL: call void @__asan_load8
+; CHECK-CALL: call void @__asan_loadN
; 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
ret void
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3447.2.patch
Type: text/x-patch
Size: 4215 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140422/5c8a5ef5/attachment.bin>
More information about the llvm-commits
mailing list