Add back analyzer support for ns_returns_retained and cf_returns_retained.

llvm-svn: 71309
This commit is contained in:
Ted Kremenek 2009-05-09 02:58:13 +00:00
parent 9ecdfaf66d
commit c2de72776c
1 changed files with 51 additions and 1 deletions

View 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;