]> granicus.if.org Git - clang/commitdiff
Add back analyzer support for ns_returns_retained and cf_returns_retained.
authorTed Kremenek <kremenek@apple.com>
Sat, 9 May 2009 02:58:13 +0000 (02:58 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 9 May 2009 02:58:13 +0000 (02:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71309 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp

index a9ef5cf3fcfda01f0cd1dc0e22d8bd9ff516178c..0f251b343d0b8edc43e6fd3bddfd30894f1cff5d 100644 (file)
@@ -809,6 +809,12 @@ public:
   RetainSummary* getCommonMethodSummary(const ObjCMethodDecl* MD,
                                         Selector S, QualType RetTy);
 
+  void updateSummaryFromAnnotations(RetainSummary &Summ,
+                                    const ObjCMethodDecl *MD);
+
+  void updateSummaryFromAnnotations(RetainSummary &Summ,
+                                    const FunctionDecl *FD);
+
   bool isGCEnabled() const { return GCEnabled; }
   
   RetainSummary *copySummary(RetainSummary *OldSumm) {
@@ -1033,6 +1039,10 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD) {
   if (!S)
     S = getDefaultSummary();
 
+  // Annotations override defaults.
+  assert(S);
+  updateSummaryFromAnnotations(*S, FD);
+  
   FuncSummaries[FD] = S;
   return S;  
 }
@@ -1116,7 +1126,41 @@ RetainSummaryManager::getInitMethodSummary(QualType RetTy) {
                               ? RetEffect::MakeReceiverAlias()
                               : RetEffect::MakeNoRet());
 }
-  
+
+void
+RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ,
+                                                   const FunctionDecl *FD) {
+  if (!FD)
+    return;
+
+  // Determine if there is a special return effect for this method.
+  if (isTrackedObjCObjectType(FD->getResultType())) {
+    if (FD->getAttr<NSReturnsRetainedAttr>()) {
+      Summ.setRetEffect(ObjCAllocRetE);
+    }
+    else if (FD->getAttr<CFReturnsRetainedAttr>()) {
+      Summ.setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true));
+    }
+  }
+}
+
+void
+RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ,
+                                                  const ObjCMethodDecl *MD) {
+  if (!MD)
+    return;
+
+  // Determine if there is a special return effect for this method.
+  if (isTrackedObjCObjectType(MD->getResultType())) {
+    if (MD->getAttr<NSReturnsRetainedAttr>()) {
+      Summ.setRetEffect(ObjCAllocRetE);
+    }
+    else if (MD->getAttr<CFReturnsRetainedAttr>()) {
+      Summ.setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true));
+    }
+  }
+}
+
 RetainSummary*
 RetainSummaryManager::getCommonMethodSummary(const ObjCMethodDecl* MD,
                                              Selector S, QualType RetTy) {
@@ -1199,6 +1243,9 @@ RetainSummaryManager::getInstanceMethodSummary(Selector S,
   else
     Summ = getCommonMethodSummary(MD, S, RetTy);
   
+  // Annotations override defaults.
+  updateSummaryFromAnnotations(*Summ, MD);
+  
   // Memoize the summary.
   ObjCMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ;
   return Summ;
@@ -1218,6 +1265,9 @@ RetainSummaryManager::getClassMethodSummary(Selector S, IdentifierInfo *ClsName,
     return I->second;
     
   RetainSummary *Summ = getCommonMethodSummary(MD, S, RetTy);
+  
+  // Annotations override defaults.
+  updateSummaryFromAnnotations(*Summ, MD);
 
   // Memoize the summary.
   ObjCClassMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ;