diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-05-05 18:44:20 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-05-05 18:44:20 +0000 |
commit | 69aa08072decc20094bd1f75f4f9842e9bd357ad (patch) | |
tree | 5d0cf553fe7a9b77d72dc4109b5e551b52dd9aba /lib/Analysis/CFRefCount.cpp | |
parent | 041f2fd6237c7ce72864e42c66c6b12b52f35f9c (diff) |
Implement attribute 'ns_autorelease'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70990 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 07dbf10c40..ca420006d2 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -779,8 +779,8 @@ public: RetainSummary* getCommonMethodSummary(const ObjCMethodDecl* MD, Selector S, QualType RetTy); - void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, unsigned i, - const ParmVarDecl *PD); + void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, const Decl *D, + unsigned argIdx = 0); void updateSummaryFromAnnotations(RetainSummary &Summ, const ObjCMethodDecl *MD); @@ -1097,22 +1097,32 @@ RetainSummaryManager::getInitMethodSummary(QualType RetTy) { // 'init' methods only return an alias if the return type is a location type. return getPersistentSummary(Loc::IsLocType(RetTy) ? RetEffect::MakeReceiverAlias() - : RetEffect::MakeNoRet()); + : RetEffect::MakeNoRet()); } - void RetainSummaryManager::updateSummaryArgEffFromAnnotations(RetainSummary &Summ, - unsigned i, - const ParmVarDecl *PD){ - if (PD->getAttr<NSOwnershipRetainAttr>()) - Summ.setArgEffect(AF, i, IncRefMsg); - else if (PD->getAttr<CFOwnershipRetainAttr>()) - Summ.setArgEffect(AF, i, IncRef); - else if (PD->getAttr<NSOwnershipReleaseAttr>()) - Summ.setArgEffect(AF, i, DecRefMsg); - else if (PD->getAttr<CFOwnershipReleaseAttr>()) - Summ.setArgEffect(AF, i, DecRef); + const Decl *D, + unsigned i) { + ArgEffect E = DoNothing; + + if (D->getAttr<NSOwnershipRetainAttr>()) + E = IncRefMsg; + else if (D->getAttr<CFOwnershipRetainAttr>()) + E = IncRef; + else if (D->getAttr<NSOwnershipReleaseAttr>()) + E = DecRefMsg; + else if (D->getAttr<CFOwnershipReleaseAttr>()) + E = DecRef; + else if (D->getAttr<NSOwnershipAutoreleaseAttr>()) + E = Autorelease; + else + return; + + if (isa<ParmVarDecl>(D)) + Summ.setArgEffect(AF, i, E); + else + Summ.setReceiverEffect(E); } void @@ -1137,7 +1147,7 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, unsigned i = 0; for (FunctionDecl::param_const_iterator I = FD->param_begin(), E = FD->param_end(); I != E; ++I, ++i) - updateSummaryArgEffFromAnnotations(Summ, i, *I); + updateSummaryArgEffFromAnnotations(Summ, *I, i); } void @@ -1162,13 +1172,10 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, unsigned i = 0; for (ObjCMethodDecl::param_iterator I = MD->param_begin(), E = MD->param_end(); I != E; ++I, ++i) - updateSummaryArgEffFromAnnotations(Summ, i, *I); + updateSummaryArgEffFromAnnotations(Summ, *I, i); // Determine any effects on the receiver. - if (MD->getAttr<NSOwnershipRetainAttr>()) - Summ.setReceiverEffect(IncRefMsg); - else if (MD->getAttr<NSOwnershipReleaseAttr>()) - Summ.setReceiverEffect(DecRefMsg); + updateSummaryArgEffFromAnnotations(Summ, MD); } RetainSummary* |