From c5458622a30ede903e8d1e800cbf9382bd45b69f Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Thu, 11 Dec 2008 09:08:46 +0000 Subject: [PATCH] Identify AnonPointeeRegion by the symbol that is concretized. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60870 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/Analysis/PathSensitive/MemRegion.h | 21 +++++++++++-------- lib/Analysis/MemRegion.cpp | 17 +++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h index 07507381ed..90f295d1f9 100644 --- a/include/clang/Analysis/PathSensitive/MemRegion.h +++ b/include/clang/Analysis/PathSensitive/MemRegion.h @@ -237,25 +237,28 @@ 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 by the MemRegion of the pointer pointing to them. We create -/// them lazily. +/// identified by the symbols that are concretized. We create them lazily. class AnonPointeeRegion : public TypedRegion { friend class MemRegionManager; - // VD - the pointer variable that points at this region. - const TypedRegion* Pointer; - AnonPointeeRegion(const TypedRegion* r, MemRegion* sreg) - : TypedRegion(sreg, AnonPointeeRegionKind), Pointer(r) {} + // Sym - the symbol that is concretized. + SymbolRef Sym; + + // Ty - the type of the region. + QualType T; + + AnonPointeeRegion(SymbolRef sym, QualType t, MemRegion* sreg) + : TypedRegion(sreg, AnonPointeeRegionKind), Sym(sym), T(t) {} public: QualType getType(ASTContext& C) const; - static void ProfileRegion(llvm::FoldingSetNodeID& ID, const TypedRegion* R, + static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef Sym, const MemRegion* superRegion); void Profile(llvm::FoldingSetNodeID& ID) const { - ProfileRegion(ID, Pointer, superRegion); + ProfileRegion(ID, Sym, superRegion); } static bool classof(const MemRegion* R) { @@ -519,7 +522,7 @@ public: AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); - AnonPointeeRegion* getAnonPointeeRegion(const TypedRegion* r); + AnonPointeeRegion* getAnonPointeeRegion(SymbolRef Sym, QualType T); bool hasStackStorage(const MemRegion* R); diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp index 22df07b716..1e580a8cd3 100644 --- a/lib/Analysis/MemRegion.cpp +++ b/lib/Analysis/MemRegion.cpp @@ -52,18 +52,14 @@ void AnonTypedRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, } QualType AnonPointeeRegion::getType(ASTContext& C) const { - QualType T = C.getCanonicalType(Pointer->getType(C)); - PointerType* PTy = cast(T.getTypePtr()); - - QualType PointeeTy = C.getCanonicalType(PTy->getPointeeType()); - return PointeeTy; + return C.getCanonicalType(T); } void AnonPointeeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, - const TypedRegion* R, + SymbolRef Sym, const MemRegion* superRegion) { ID.AddInteger((unsigned) AnonPointeeRegionKind); - ID.AddPointer(R); + Sym.Profile(ID); ID.AddPointer(superRegion); } @@ -394,11 +390,12 @@ MemRegionManager::getAnonTypedRegion(QualType t, const MemRegion* superRegion) { return R; } -AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const TypedRegion* r) { +AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(SymbolRef Sym, + QualType T) { llvm::FoldingSetNodeID ID; MemRegion* superRegion = getUnknownRegion(); - AnonPointeeRegion::ProfileRegion(ID, r, superRegion); + AnonPointeeRegion::ProfileRegion(ID, Sym, superRegion); void* InsertPos; MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); @@ -406,7 +403,7 @@ AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const TypedRegion* r) if (!R) { R = (AnonPointeeRegion*) A.Allocate(); - new (R) AnonPointeeRegion(r, superRegion); + new (R) AnonPointeeRegion(Sym, T, superRegion); Regions.InsertNode(R, InsertPos); } -- 2.40.0