diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-05-06 08:33:50 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-05-06 08:33:50 +0000 |
commit | 20794948a00ca03dee272cb131905a8f07c3cc02 (patch) | |
tree | 6d4429e6c59635a09aedfcc1ad60918c16ec976a /lib/Analysis/RegionStore.cpp | |
parent | 4c44e243e36aaaab3fee24ba1190ca65d33bf2ca (diff) |
Add a GDM for recording the cast type of regions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71076 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/RegionStore.cpp')
-rw-r--r-- | lib/Analysis/RegionStore.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index 5f8e6c3f92..043fc95e08 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -48,6 +48,17 @@ namespace clang { }; } +// RegionCasts records the current cast type of a region. +namespace { class VISIBILITY_HIDDEN RegionCasts {}; } +static int RegionCastsIndex = 0; +namespace clang { + template<> struct GRStateTrait<RegionCasts> + : public GRStatePartialTrait<llvm::ImmutableMap<const MemRegion*, + QualType> > { + static void* GDMIndex() { return &RegionCastsIndex; } + }; +} + //===----------------------------------------------------------------------===// // Region "Extents" //===----------------------------------------------------------------------===// @@ -253,6 +264,7 @@ public: } const GRState* setExtent(const GRState* St, const MemRegion* R, SVal Extent); + const GRState* setCastType(const GRState* St, const MemRegion* R, QualType T); static inline RegionBindingsTy GetRegionBindings(Store store) { return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store)); @@ -488,6 +500,9 @@ SVal RegionStoreManager::getSizeInElements(const GRState* St, // return the size as signed integer. return NonLoc::MakeVal(getBasicVals(), CAT->getSize(), false); } + + // If the VarRegion is cast to other type, compute the size with respect to + // that type. // Clients can use ordinary variables as if they were arrays. These // essentially are arrays of size 1. @@ -650,9 +665,11 @@ RegionStoreManager::CastRegion(const GRState* state, const MemRegion* R, || isa<ObjCIvarRegion>(R) || isa<CompoundLiteralRegion>(R)) { if (isSmallerThan(PointeeTy, cast<TypedRegion>(R)->getRValueType(getContext()))) { + // Record the cast type of the region. + state = setCastType(state, R, ToTy); + SVal Idx = ValMgr.makeZeroArrayIndex(); - ElementRegion* ER = MRMgr.getElementRegion(PointeeTy, Idx, - cast<TypedRegion>(R)); + ElementRegion* ER = MRMgr.getElementRegion(PointeeTy, Idx, R); return CastResult(state, ER); } else return CastResult(state, R); @@ -1295,3 +1312,9 @@ const GRState* RegionStoreManager::RemoveRegionView(const GRState* St, return state.set<RegionViewMap>(Base, V); } + +const GRState* RegionStoreManager::setCastType(const GRState* St, + const MemRegion* R, QualType T) { + GRStateRef state(St, StateMgr); + return state.set<RegionCasts>(R, T); +} |