From eb90adffe11072f0378cb3251747086a27ddf4d2 Mon Sep 17 00:00:00 2001 From: Nuno Lopes Date: Fri, 8 Jun 2012 16:31:42 +0000 Subject: [PATCH] BoundsChecking: add support for ConstantPointerNull. fixes a bunch of instrumentation failures in loops with reallocs git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158210 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/BoundsChecking.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/Scalar/BoundsChecking.cpp b/lib/Transforms/Scalar/BoundsChecking.cpp index a81ddfa1dce..d10d97ca050 100644 --- a/lib/Transforms/Scalar/BoundsChecking.cpp +++ b/lib/Transforms/Scalar/BoundsChecking.cpp @@ -377,11 +377,13 @@ bool BoundsChecking::computeAllocSize(Value *Ptr, APInt &Offset, } RETURN(true); - // TODO: handle more standard functions: + // TODO: handle more standard functions (+ wchar cousins): // - strdup / strndup // - strcpy / strncpy + // - strcat / strncat // - memcpy / memmove // - strcat / strncat + // - memset } else if (PHINode *PHI = dyn_cast(Ptr)) { // create 2 PHIs: one for offset and another for size @@ -389,8 +391,7 @@ bool BoundsChecking::computeAllocSize(Value *Ptr, APInt &Offset, PHINode *SizePHI = Builder->CreatePHI(IntTy, PHI->getNumIncomingValues()); // insert right away in the cache to handle recursive PHIs - CacheData CacheEntry(APInt(), OffsetPHI, APInt(), SizePHI, true); - CacheMap[Ptr] = CacheEntry; + CacheMap[Ptr] = CacheData(APInt(), OffsetPHI, APInt(), SizePHI, true); // compute offset/size for each PHI incoming pointer for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) { @@ -419,7 +420,7 @@ bool BoundsChecking::computeAllocSize(Value *Ptr, APInt &Offset, SizeValue = SizePHI; RETURN(true); - } else if (isa(Ptr)) { + } else if (isa(Ptr) || isa(Ptr)) { Size = 0; RETURN(true); @@ -428,12 +429,12 @@ bool BoundsChecking::computeAllocSize(Value *Ptr, APInt &Offset, RETURN(false); } + DEBUG(dbgs() << "computeAllocSize unhandled value:\n" << *Ptr << "\n"); RETURN(false); cache_and_return: // cache the result and return - CacheData CacheEntry(Offset, OffsetValue, Size, SizeValue, ReturnVal); - CacheMap[Ptr] = CacheEntry; + CacheMap[Ptr] = CacheData(Offset, OffsetValue, Size, SizeValue, ReturnVal); // non-computable results can be safely cached if (!ReturnVal)