diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-05-09 02:58:13 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-05-09 02:58:13 +0000 |
commit | 4dd8fb4f3dab42426641a0aab3d6d6a72bb1eec9 (patch) | |
tree | 4b575c84ea4ae309a5f80e76532269beeebe6e6f /lib/Analysis/CFRefCount.cpp | |
parent | b71368d28532908ae1c2dc23f91761781205b3d0 (diff) |
Add back analyzer support for ns_returns_retained and cf_returns_retained.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71309 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index a9ef5cf3fc..0f251b343d 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -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; |