summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorNuno Lopes <nunoplopes@sapo.pt>2012-06-08 16:31:42 +0000
committerNuno Lopes <nunoplopes@sapo.pt>2012-06-08 16:31:42 +0000
commit4b68c1da54813a7fbaff152fdf58112e87446413 (patch)
treef5b2ea98d07596f9b541f22f9e9d7b4d1fe04d3c /llvm/lib/Transforms
parent5412cef77d9c2a8d4ee00679a87a2e15143cec62 (diff)
downloadbcm5719-llvm-4b68c1da54813a7fbaff152fdf58112e87446413.tar.gz
bcm5719-llvm-4b68c1da54813a7fbaff152fdf58112e87446413.zip
BoundsChecking: add support for ConstantPointerNull. fixes a bunch of instrumentation failures in loops with reallocs
llvm-svn: 158210
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/BoundsChecking.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/BoundsChecking.cpp b/llvm/lib/Transforms/Scalar/BoundsChecking.cpp
index a81ddfa1dce..d10d97ca050 100644
--- a/llvm/lib/Transforms/Scalar/BoundsChecking.cpp
+++ b/llvm/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<PHINode>(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<UndefValue>(Ptr)) {
+ } else if (isa<UndefValue>(Ptr) || isa<ConstantPointerNull>(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)
OpenPOWER on IntegriCloud