aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2008-12-11 02:27:34 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2008-12-11 02:27:34 +0000
commit3bb662a8635a1f85a64719759ead76abffe0e172 (patch)
tree4acea5a5b36a3b2d37bd718293055c8ae2ebfe8d
parent83df2d230166fed729797b112f5faf27fce2bdd5 (diff)
AnonPointeeRegions are now identified by the MemRegion of the pointer pointing
to them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60868 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Analysis/PathSensitive/MemRegion.h13
-rw-r--r--lib/Analysis/MemRegion.cpp12
2 files changed, 13 insertions, 12 deletions
diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h
index ad06c410d0..07507381ed 100644
--- a/include/clang/Analysis/PathSensitive/MemRegion.h
+++ b/include/clang/Analysis/PathSensitive/MemRegion.h
@@ -237,20 +237,21 @@ public:
/// parameters or pointer globals. In RegionStoreManager, we assume pointer
/// parameters or globals point at some anonymous region. Such regions are not
/// the regions associated with the pointer variables themselves. They are
-/// identified with the VarDecl of the pointer variable. We create them lazily.
+/// identified by the MemRegion of the pointer pointing to them. We create
+/// them lazily.
class AnonPointeeRegion : public TypedRegion {
friend class MemRegionManager;
// VD - the pointer variable that points at this region.
- const VarDecl* Pointer;
+ const TypedRegion* Pointer;
- AnonPointeeRegion(const VarDecl* d, MemRegion* sreg)
- : TypedRegion(sreg, AnonPointeeRegionKind), Pointer(d) {}
+ AnonPointeeRegion(const TypedRegion* r, MemRegion* sreg)
+ : TypedRegion(sreg, AnonPointeeRegionKind), Pointer(r) {}
public:
QualType getType(ASTContext& C) const;
- static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD,
+ static void ProfileRegion(llvm::FoldingSetNodeID& ID, const TypedRegion* R,
const MemRegion* superRegion);
void Profile(llvm::FoldingSetNodeID& ID) const {
@@ -518,7 +519,7 @@ public:
AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion);
- AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d);
+ AnonPointeeRegion* getAnonPointeeRegion(const TypedRegion* r);
bool hasStackStorage(const MemRegion* R);
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 6aff286dc1..22df07b716 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -52,7 +52,7 @@ void AnonTypedRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
}
QualType AnonPointeeRegion::getType(ASTContext& C) const {
- QualType T = C.getCanonicalType(Pointer->getType());
+ QualType T = C.getCanonicalType(Pointer->getType(C));
PointerType* PTy = cast<PointerType>(T.getTypePtr());
QualType PointeeTy = C.getCanonicalType(PTy->getPointeeType());
@@ -60,10 +60,10 @@ QualType AnonPointeeRegion::getType(ASTContext& C) const {
}
void AnonPointeeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
- const VarDecl* VD,
+ const TypedRegion* R,
const MemRegion* superRegion) {
ID.AddInteger((unsigned) AnonPointeeRegionKind);
- ID.AddPointer(VD);
+ ID.AddPointer(R);
ID.AddPointer(superRegion);
}
@@ -394,11 +394,11 @@ MemRegionManager::getAnonTypedRegion(QualType t, const MemRegion* superRegion) {
return R;
}
-AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const VarDecl* d) {
+AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const TypedRegion* r) {
llvm::FoldingSetNodeID ID;
MemRegion* superRegion = getUnknownRegion();
- AnonPointeeRegion::ProfileRegion(ID, d, superRegion);
+ AnonPointeeRegion::ProfileRegion(ID, r, superRegion);
void* InsertPos;
MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
@@ -406,7 +406,7 @@ AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const VarDecl* d) {
if (!R) {
R = (AnonPointeeRegion*) A.Allocate<AnonPointeeRegion>();
- new (R) AnonPointeeRegion(d, superRegion);
+ new (R) AnonPointeeRegion(r, superRegion);
Regions.InsertNode(R, InsertPos);
}