]> granicus.if.org Git - clang/commitdiff
retain checker: Add checker support for FunctionDecl ownership annotations. Need...
authorTed Kremenek <kremenek@apple.com>
Mon, 4 May 2009 16:43:50 +0000 (16:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 4 May 2009 16:43:50 +0000 (16:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70873 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp

index 59d484525031a053a1bee6d2623878c1c1f1f1e6..711127b79d964a475ffca83c321e36c84a8f4a4d 100644 (file)
@@ -785,6 +785,9 @@ public:
   void updateSummaryFromAnnotations(RetainSummary &Summ,
                                     const ObjCMethodDecl *MD);
   
+  void updateSummaryFromAnnotations(RetainSummary &Summ,
+                                    const FunctionDecl *FD);
+  
   bool isGCEnabled() const { return GCEnabled; }
   
   RetainSummary *copySummary(RetainSummary *OldSumm) {
@@ -1009,6 +1012,10 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD) {
   if (!S)
     S = getDefaultSummary();
 
+  // Annotations override defaults.
+  assert(S);
+  updateSummaryFromAnnotations(*S, FD);
+
   FuncSummaries[FD] = S;
   return S;  
 }
@@ -1110,6 +1117,28 @@ RetainSummaryManager::updateSummaryArgEffFromAnnotations(RetainSummary &Summ,
     Summ.setArgEffect(AF, i, MakeCollectable);  
 }
 
+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<ObjCOwnershipReturnsAttr>()) {
+      Summ.setRetEffect(isGCEnabled()
+                        ? RetEffect::MakeGCNotOwned()
+                        : RetEffect::MakeOwned(RetEffect::ObjC, true));
+    }
+  }
+  
+  // Determine if there are any arguments with a specific ArgEffect.
+  unsigned i = 0;
+  for (FunctionDecl::param_const_iterator I = FD->param_begin(),
+       E = FD->param_end(); I != E; ++I, ++i)
+    updateSummaryArgEffFromAnnotations(Summ, i, *I);
+}
+  
 void
 RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ,
                                                    const ObjCMethodDecl *MD) {