[cfe-commits] r65425 - /cfe/trunk/lib/Analysis/CFRefCount.cpp

Ted Kremenek kremenek at apple.com
Tue Feb 24 18:54:57 PST 2009


Author: kremenek
Date: Tue Feb 24 20:54:57 2009
New Revision: 65425

URL: http://llvm.org/viewvc/llvm-project?rev=65425&view=rev
Log:
retain/release checker: Implement basic tracking of autorelease stack.  Next thing is to wire up pools with their contents.

Modified:
    cfe/trunk/lib/Analysis/CFRefCount.cpp

Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=65425&r1=65424&r2=65425&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Tue Feb 24 20:54:57 2009
@@ -646,6 +646,13 @@
     ObjCMethodSummaries[S] = Summ;
   }
   
+  void addInstMethSummary(const char* Cls, const char* nullaryName,
+                          RetainSummary *Summ) {
+    IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
+    Selector S = GetNullarySelector(nullaryName, Ctx);
+    ObjCMethodSummaries[ObjCSummaryKey(ClsII, S)]  = Summ;
+  }
+    
   void addInstMethSummary(const char* Cls, RetainSummary* Summ, va_list argp) {
     
     IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
@@ -1134,10 +1141,9 @@
   addNSObjectMethSummary(GetNullarySelector("autorelease", Ctx), Summ);
   
   // Specially handle NSAutoreleasePool.
-  addInstMethSummary("NSAutoreleasePool",
+  addInstMethSummary("NSAutoreleasePool", "init",
                      getPersistentSummary(RetEffect::MakeReceiverAlias(),
-                                          NewAutoreleasePool),
-                     "init", NULL);
+                                          NewAutoreleasePool));
   
   // For NSWindow, allocated objects are (initially) self-owned.  
   // FIXME: For now we opt for false negatives with NSWindow, as these objects
@@ -1369,10 +1375,10 @@
 static int AutoRBIndex = 0;
 
 namespace { class VISIBILITY_HIDDEN AutoreleasePoolContents {}; }
-namespace { class VISIBILITY_HIDDEN AutoreleaseBindings {}; }
+namespace { class VISIBILITY_HIDDEN AutoreleaseStack {}; }
 
 namespace clang {
-template<> struct GRStateTrait<AutoreleaseBindings>
+template<> struct GRStateTrait<AutoreleaseStack>
   : public GRStatePartialTrait<ARStack> {
   static inline void* GDMIndex() { return &AutoRBIndex; }  
 };
@@ -1522,6 +1528,17 @@
     (*I).second.print(Out);
     Out << nl;
   }
+  
+  // Print the autorelease stack.
+  ARStack stack = state->get<AutoreleaseStack>();
+  if (!stack.isEmpty()) {
+    Out << sep << nl << "AR pool stack:";
+  
+    for (ARStack::iterator I=stack.begin(), E=stack.end(); I!=E; ++I)
+      Out << ' ' << (*I);
+    
+    Out << nl;
+  }
 }
 
 static inline ArgEffect GetArgE(RetainSummary* Summ, unsigned idx) {
@@ -2067,7 +2084,10 @@
       }
       // Fall-through.
 
-    case NewAutoreleasePool: // FIXME: Implement pushing the pool to the stack.
+    case NewAutoreleasePool:
+      assert(!isGCEnabled());
+      return state.add<AutoreleaseStack>(sym);
+      
     case DoNothingByRef:
     case DoNothing:
       if (!isGCEnabled() && V.getKind() == RefVal::Released) {





More information about the cfe-commits mailing list