[cfe-commits] r79628 - /cfe/trunk/lib/Analysis/RegionStore.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Fri Aug 21 06:25:16 PDT 2009
Author: zhongxingxu
Date: Fri Aug 21 08:25:15 2009
New Revision: 79628
URL: http://llvm.org/viewvc/llvm-project?rev=79628&view=rev
Log:
Eagerly bind 'self' to SelfRegion. Thus we do not need to get code decl from
GRStateManager to create the SelfRegion.
Modified:
cfe/trunk/lib/Analysis/RegionStore.cpp
Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=79628&r1=79627&r2=79628&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
+++ cfe/trunk/lib/Analysis/RegionStore.cpp Fri Aug 21 08:25:15 2009
@@ -15,6 +15,7 @@
//
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathSensitive/MemRegion.h"
+#include "clang/Analysis/PathSensitive/AnalysisContext.h"
#include "clang/Analysis/PathSensitive/GRState.h"
#include "clang/Analysis/PathSensitive/GRStateTrait.h"
#include "clang/Analysis/Analyses/LiveVariables.h"
@@ -169,18 +170,13 @@
RegionBindings::Factory RBFactory;
const MemRegion* SelfRegion;
- const ImplicitParamDecl *SelfDecl;
public:
RegionStoreManager(GRStateManager& mgr, const RegionStoreFeatures &f)
: StoreManager(mgr),
Features(f),
RBFactory(mgr.getAllocator()),
- SelfRegion(0), SelfDecl(0) {
- if (const ObjCMethodDecl* MD =
- dyn_cast<ObjCMethodDecl>(&StateMgr.getCodeDecl()))
- SelfDecl = MD->getSelfDecl();
- }
+ SelfRegion(0) {}
virtual ~RegionStoreManager() {}
@@ -232,22 +228,35 @@
NonLoc R, QualType resultTy);
Store getInitialStore(const LocationContext *InitLoc) {
- return RBFactory.GetEmptyMap().getRoot();
+ RegionBindings B = RBFactory.GetEmptyMap();
+
+ // Eagerly bind 'self' to SelfRegion, because this is the only place we can
+ // get the ObjCMethodDecl.
+ typedef LiveVariables::AnalysisDataTy LVDataTy;
+ LVDataTy &D = InitLoc->getLiveVariables()->getAnalysisData();
+ for (LVDataTy::decl_iterator I=D.begin_decl(), E=D.end_decl(); I!=E; ++I){
+ const NamedDecl *ND = I->first;
+
+ if (const ImplicitParamDecl *PD = dyn_cast<ImplicitParamDecl>(ND)) {
+ const Decl &CD = *InitLoc->getDecl();
+ if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(&CD)) {
+ if (MD->getSelfDecl() == PD) {
+ SelfRegion = MRMgr.getObjCObjectRegion(MD->getClassInterface(),
+ MRMgr.getHeapRegion());
+ B = RBFactory.Add(B, MRMgr.getVarRegion(PD),
+ ValMgr.makeLoc(SelfRegion));
+ }
+ }
+ }
+ }
+
+ return B.getRoot();
}
/// getSelfRegion - Returns the region for the 'self' (Objective-C) or
/// 'this' object (C++). When used when analyzing a normal function this
/// method returns NULL.
const MemRegion* getSelfRegion(Store) {
- if (!SelfDecl)
- return 0;
-
- if (!SelfRegion) {
- const ObjCMethodDecl *MD = cast<ObjCMethodDecl>(&StateMgr.getCodeDecl());
- SelfRegion = MRMgr.getObjCObjectRegion(MD->getClassInterface(),
- MRMgr.getHeapRegion());
- }
-
return SelfRegion;
}
@@ -1197,9 +1206,6 @@
// Lazily derive a value for the VarRegion.
const VarDecl *VD = R->getDecl();
- if (VD == SelfDecl)
- return loc::MemRegionVal(getSelfRegion(0));
-
if (R->hasGlobalsOrParametersStorage())
return ValMgr.getRegionValueSymbolValOrUnknown(R, VD->getType());
More information about the cfe-commits
mailing list