summaryrefslogtreecommitdiffstats
path: root/clang/lib/Checker
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-08-03 06:34:25 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-08-03 06:34:25 +0000
commit42b8c30de6c36b415d3ae7b6f962d3e84c936882 (patch)
tree36ce2fe742d475fe0a19d5f3c1e15f8589ef0650 /clang/lib/Checker
parent26ce60c00ed4c42e00500415ae7af09b13cc6429 (diff)
downloadbcm5719-llvm-42b8c30de6c36b415d3ae7b6f962d3e84c936882.tar.gz
bcm5719-llvm-42b8c30de6c36b415d3ae7b6f962d3e84c936882.zip
Allow offsets to be negative. Out-of-bound cases are checked elsewhere. We
shouldn't put restrictions in store manager. llvm-svn: 110106
Diffstat (limited to 'clang/lib/Checker')
-rw-r--r--clang/lib/Checker/FlatStore.cpp8
-rw-r--r--clang/lib/Checker/MemRegion.cpp3
2 files changed, 5 insertions, 6 deletions
diff --git a/clang/lib/Checker/FlatStore.cpp b/clang/lib/Checker/FlatStore.cpp
index e1683e5009c..9e7aa753eec 100644
--- a/clang/lib/Checker/FlatStore.cpp
+++ b/clang/lib/Checker/FlatStore.cpp
@@ -78,7 +78,7 @@ private:
public:
const MemRegion *R;
Interval I;
- RegionInterval(const MemRegion *r, uint64_t s, uint64_t e) : R(r), I(s, e){}
+ RegionInterval(const MemRegion *r, int64_t s, int64_t e) : R(r), I(s, e){}
};
RegionInterval RegionToInterval(const MemRegion *R);
@@ -186,7 +186,7 @@ FlatStoreManager::RegionToInterval(const MemRegion *R) {
switch (R->getKind()) {
case MemRegion::VarRegionKind: {
QualType T = cast<VarRegion>(R)->getValueType(Ctx);
- uint64_t Size = Ctx.getTypeSize(T);
+ int64_t Size = Ctx.getTypeSize(T);
return RegionInterval(R, 0, Size-1);
}
@@ -197,8 +197,8 @@ FlatStoreManager::RegionToInterval(const MemRegion *R) {
// with symbolic offsets.
if (!Offset.getRegion())
return RegionInterval(0, 0, 0);
- uint64_t Start = Offset.getOffset();
- uint64_t Size = Ctx.getTypeSize(cast<TypedRegion>(R)->getValueType(Ctx));
+ int64_t Start = Offset.getOffset();
+ int64_t Size = Ctx.getTypeSize(cast<TypedRegion>(R)->getValueType(Ctx));
return RegionInterval(Offset.getRegion(), Start, Start+Size);
}
diff --git a/clang/lib/Checker/MemRegion.cpp b/clang/lib/Checker/MemRegion.cpp
index 87eed2a2872..58006708fa1 100644
--- a/clang/lib/Checker/MemRegion.cpp
+++ b/clang/lib/Checker/MemRegion.cpp
@@ -830,7 +830,7 @@ RegionRawOffset ElementRegion::getAsArrayOffset() const {
RegionOffset MemRegion::getAsOffset() const {
const MemRegion *R = this;
- uint64_t Offset = 0;
+ int64_t Offset = 0;
while (1) {
switch (R->getKind()) {
@@ -854,7 +854,6 @@ RegionOffset MemRegion::getAsOffset() const {
SVal Index = ER->getIndex();
if (const nonloc::ConcreteInt *CI=dyn_cast<nonloc::ConcreteInt>(&Index)) {
int64_t i = CI->getValue().getSExtValue();
- assert(i >= 0);
CharUnits Size = getContext().getTypeSizeInChars(EleTy);
Offset += i * Size.getQuantity() * 8;
} else {
OpenPOWER on IntegriCloud