mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-14 15:39:00 +00:00
[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
This commit is contained in:
parent
404fa73ef6
commit
468fabf731
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user