[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