[llvm-branch-commits] [cfe-branch] r71707 - in /cfe/branches/Apple/Dib: lib/Analysis/CFRefCount.cpp test/Analysis/pr4209.m

Mike Stump mrs at apple.com
Wed May 13 13:06:20 PDT 2009


Author: mrs
Date: Wed May 13 15:06:17 2009
New Revision: 71707

URL: http://llvm.org/viewvc/llvm-project?rev=71707&view=rev
Log:
Merge in 71685:

Fix crasher reported in PR 4209 caused by an invalid summary
generation when EvalObjCMessageExpr() did not resolve the
ObjCInterfaceDecl* for a receiver when the receiver's symbolic value
wasn't being explicitly tracked.

Added:
    cfe/branches/Apple/Dib/test/Analysis/pr4209.m
      - copied unchanged from r71685, cfe/trunk/test/Analysis/pr4209.m
Modified:
    cfe/branches/Apple/Dib/lib/Analysis/CFRefCount.cpp

Modified: cfe/branches/Apple/Dib/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/Dib/lib/Analysis/CFRefCount.cpp?rev=71707&r1=71706&r2=71707&view=diff

==============================================================================
--- cfe/branches/Apple/Dib/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/branches/Apple/Dib/lib/Analysis/CFRefCount.cpp Wed May 13 15:06:17 2009
@@ -439,6 +439,9 @@
 
   ObjCSummaryKey(const ObjCInterfaceDecl* d, Selector s)
     : II(d ? d->getIdentifier() : 0), S(s) {}
+
+  ObjCSummaryKey(const ObjCInterfaceDecl* d, IdentifierInfo *ii, Selector s)
+    : II(d ? d->getIdentifier() : ii), S(s) {}
   
   ObjCSummaryKey(Selector s)
     : II(0), S(s) {}
@@ -1265,7 +1268,7 @@
   updateSummaryFromAnnotations(*Summ, MD);
   
   // Memoize the summary.
-  ObjCMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ;
+  ObjCMethodSummaries[ObjCSummaryKey(ID, ClsName, S)] = Summ;
   return Summ;
 }
 
@@ -1288,7 +1291,7 @@
   updateSummaryFromAnnotations(*Summ, MD);
 
   // Memoize the summary.
-  ObjCClassMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ;
+  ObjCClassMethodSummaries[ObjCSummaryKey(ID, ClsName, S)] = Summ;
   return Summ;
 }
 
@@ -2926,7 +2929,7 @@
   if (Expr* Receiver = ME->getReceiver()) {
     // We need the type-information of the tracked receiver object
     // Retrieve it from the state.
-    ObjCInterfaceDecl* ID = 0;
+    const ObjCInterfaceDecl* ID = 0;
 
     // FIXME: Wouldn't it be great if this code could be reduced?  It's just
     // a chain of lookups.
@@ -2948,7 +2951,16 @@
         }
       }
     }
-    
+
+    // FIXME: this is a hack.  This may or may not be the actual method
+    //  that is called.
+    if (!ID) {
+      if (const PointerType *PT = Receiver->getType()->getAsPointerType())
+        if (const ObjCInterfaceType *p =
+            PT->getPointeeType()->getAsObjCInterfaceType())
+          ID = p->getDecl();
+    }
+
     // FIXME: The receiver could be a reference to a class, meaning that
     //  we should use the class method.
     Summ = Summaries.getInstanceMethodSummary(ME, ID);





More information about the llvm-branch-commits mailing list