aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CFRefCount.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-04-30 20:00:31 +0000
committerTed Kremenek <kremenek@apple.com>2009-04-30 20:00:31 +0000
commit2cd1293ad32dd5db3f3fcead9720cc2676c088e6 (patch)
tree8ac5270d1d65818f994da9fc3073689030c00547 /lib/Analysis/CFRefCount.cpp
parent7b9a2ee5a4393001bdec7dec841eb7c811da492c (diff)
retain/release checker: Hook up attributes 'objc_ownership_retain' and
'objc_ownership_release' to the effects on receivers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70507 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r--lib/Analysis/CFRefCount.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index eb7d04a342..7ea462a1bb 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -1139,14 +1139,14 @@ RetainSummaryManager::getMethodSummaryFromAnnotations(const ObjCMethodDecl *MD){
assert(ScratchArgs.empty());
// Determine if there is a special return effect for this method.
- bool hasRetEffect = false;
+ bool hasEffect = false;
RetEffect RE = RetEffect::MakeNoRet();
if (isTrackedObjectType(MD->getResultType())) {
if (MD->getAttr<ObjCOwnershipReturnsAttr>()) {
RE = isGCEnabled() ? RetEffect::MakeGCNotOwned()
: RetEffect::MakeOwned(RetEffect::ObjC, true);
- hasRetEffect = true;
+ hasEffect = true;
}
else {
// Default to 'not owned'.
@@ -1155,36 +1155,46 @@ RetainSummaryManager::getMethodSummaryFromAnnotations(const ObjCMethodDecl *MD){
}
// Determine if there are any arguments with a specific ArgEffect.
- bool hasArgEffect = false;
unsigned i = 0;
for (ObjCMethodDecl::param_iterator I = MD->param_begin(),
E = MD->param_end(); I != E; ++I, ++i) {
if ((*I)->getAttr<ObjCOwnershipRetainAttr>()) {
ScratchArgs.push_back(std::make_pair(i, IncRefMsg));
- hasArgEffect = true;
+ hasEffect = true;
}
else if ((*I)->getAttr<ObjCOwnershipCFRetainAttr>()) {
ScratchArgs.push_back(std::make_pair(i, IncRef));
- hasArgEffect = true;
+ hasEffect = true;
}
else if ((*I)->getAttr<ObjCOwnershipReleaseAttr>()) {
ScratchArgs.push_back(std::make_pair(i, DecRefMsg));
- hasArgEffect = true;
+ hasEffect = true;
}
else if ((*I)->getAttr<ObjCOwnershipCFReleaseAttr>()) {
ScratchArgs.push_back(std::make_pair(i, DecRef));
- hasArgEffect = true;
+ hasEffect = true;
}
else if ((*I)->getAttr<ObjCOwnershipMakeCollectableAttr>()) {
ScratchArgs.push_back(std::make_pair(i, MakeCollectable));
- hasArgEffect = true;
+ hasEffect = true;
}
}
- if (!hasRetEffect && !hasArgEffect)
+ // Determine any effects on the receiver.
+ ArgEffect ReceiverEff = DoNothing;
+ if (MD->getAttr<ObjCOwnershipRetainAttr>()) {
+ ReceiverEff = IncRefMsg;
+ hasEffect = true;
+ }
+ else if (MD->getAttr<ObjCOwnershipReleaseAttr>()) {
+ ReceiverEff = DecRefMsg;
+ hasEffect = true;
+ }
+
+ if (!hasEffect)
return 0;
- return getPersistentSummary(RE);
+ return getPersistentSummary(RE, ReceiverEff);
}
RetainSummary*