summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/RetainSummaryManager.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2019-01-29 19:29:59 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2019-01-29 19:29:59 +0000
commitd37ff4e888729c807fc4b9e8d2cac0846c5dcf73 (patch)
treee3dcac2b9b1f7f0f971474fa94ae95fb9685b424 /clang/lib/Analysis/RetainSummaryManager.cpp
parentb0fc58b57c577841ede11f534768f5acf675175c (diff)
downloadbcm5719-llvm-d37ff4e888729c807fc4b9e8d2cac0846c5dcf73.tar.gz
bcm5719-llvm-d37ff4e888729c807fc4b9e8d2cac0846c5dcf73.zip
[analyzer] [RetainCountChecker] Track input parameters to the top-level function
Track them for ISL/OS objects by default, and for NS/CF under a flag. rdar://47536377 Differential Revision: https://reviews.llvm.org/D57356 llvm-svn: 352534
Diffstat (limited to 'clang/lib/Analysis/RetainSummaryManager.cpp')
-rw-r--r--clang/lib/Analysis/RetainSummaryManager.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/clang/lib/Analysis/RetainSummaryManager.cpp b/clang/lib/Analysis/RetainSummaryManager.cpp
index 9a514efb7c3..c3611711974 100644
--- a/clang/lib/Analysis/RetainSummaryManager.cpp
+++ b/clang/lib/Analysis/RetainSummaryManager.cpp
@@ -145,7 +145,7 @@ static bool isSubclass(const Decl *D,
}
static bool isOSObjectSubclass(const Decl *D) {
- return isSubclass(D, "OSMetaClassBase");
+ return D && isSubclass(D, "OSMetaClassBase");
}
static bool isOSObjectDynamicCast(StringRef S) {
@@ -156,6 +156,15 @@ static bool isOSObjectThisCast(StringRef S) {
return S == "metaCast";
}
+
+static bool isOSObjectPtr(QualType QT) {
+ return isOSObjectSubclass(QT->getPointeeCXXRecordDecl());
+}
+
+static bool isISLObjectRef(QualType Ty) {
+ return StringRef(Ty.getAsString()).startswith("isl_");
+}
+
static bool isOSIteratorSubclass(const Decl *D) {
return isSubclass(D, "OSIterator");
}
@@ -600,6 +609,38 @@ void RetainSummaryManager::updateSummaryForReceiverUnconsumedSelf(
Template->setRetEffect(RetEffect::MakeNoRet());
}
+
+void RetainSummaryManager::updateSummaryForArgumentTypes(
+ const AnyCall &C, const RetainSummary *&RS) {
+ RetainSummaryTemplate Template(RS, *this);
+
+ unsigned parm_idx = 0;
+ for (auto pi = C.param_begin(), pe = C.param_end(); pi != pe;
+ ++pi, ++parm_idx) {
+ QualType QT = (*pi)->getType();
+
+ // Skip already created values.
+ if (RS->getArgEffects().contains(parm_idx))
+ continue;
+
+ ObjKind K = ObjKind::AnyObj;
+
+ if (isISLObjectRef(QT)) {
+ K = ObjKind::Generalized;
+ } else if (isOSObjectPtr(QT)) {
+ K = ObjKind::OS;
+ } else if (cocoa::isCocoaObjectRef(QT)) {
+ K = ObjKind::ObjC;
+ } else if (coreFoundation::isCFObjectRef(QT)) {
+ K = ObjKind::CF;
+ }
+
+ if (K != ObjKind::AnyObj)
+ Template->addArg(AF, parm_idx,
+ ArgEffect(RS->getDefaultArgEffect().getKind(), K));
+ }
+}
+
const RetainSummary *
RetainSummaryManager::getSummary(AnyCall C,
bool HasNonZeroCallbackArg,
@@ -636,6 +677,8 @@ RetainSummaryManager::getSummary(AnyCall C,
if (IsReceiverUnconsumedSelf)
updateSummaryForReceiverUnconsumedSelf(Summ);
+ updateSummaryForArgumentTypes(C, Summ);
+
assert(Summ && "Unknown call type?");
return Summ;
}
OpenPOWER on IntegriCloud