summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/CFRefCount.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-15 23:44:31 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-15 23:44:31 +0000
commit748c7ce4bab8396f6d5f93e738b710d24b365d43 (patch)
treeba2d3ed99c4c3b5a461c63ec78e31aeed33d4a34 /clang/lib/Analysis/CFRefCount.cpp
parent8e5d812e9ddcad14eeac786d466d84fdb6438f9c (diff)
downloadbcm5719-llvm-748c7ce4bab8396f6d5f93e738b710d24b365d43.tar.gz
bcm5719-llvm-748c7ce4bab8396f6d5f93e738b710d24b365d43.zip
Added initial boilerplate to support toll-free bridging in the ref-count checker.
llvm-svn: 49756
Diffstat (limited to 'clang/lib/Analysis/CFRefCount.cpp')
-rw-r--r--clang/lib/Analysis/CFRefCount.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp
index ff8b3e5e697..051cad341f5 100644
--- a/clang/lib/Analysis/CFRefCount.cpp
+++ b/clang/lib/Analysis/CFRefCount.cpp
@@ -600,6 +600,18 @@ public:
CallExpr* CE, LVal L,
ExplodedNode<ValueState>* Pred);
+ virtual void EvalObjCMessageExpr(ExplodedNodeSet<ValueState>& Dst,
+ GRExprEngine& Engine,
+ GRStmtNodeBuilder<ValueState>& Builder,
+ ObjCMessageExpr* ME,
+ ExplodedNode<ValueState>* Pred);
+
+ bool EvalObjCMessageExprAux(ExplodedNodeSet<ValueState>& Dst,
+ GRExprEngine& Engine,
+ GRStmtNodeBuilder<ValueState>& Builder,
+ ObjCMessageExpr* ME,
+ ExplodedNode<ValueState>* Pred);
+
// End-of-path.
virtual void EvalEndPath(GRExprEngine& Engine,
@@ -802,6 +814,34 @@ void CFRefCount::EvalCall(ExplodedNodeSet<ValueState>& Dst,
Builder.MakeNode(Dst, CE, Pred, St);
}
+
+void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<ValueState>& Dst,
+ GRExprEngine& Eng,
+ GRStmtNodeBuilder<ValueState>& Builder,
+ ObjCMessageExpr* ME,
+ ExplodedNode<ValueState>* Pred) {
+
+ if (EvalObjCMessageExprAux(Dst, Eng, Builder, ME, Pred))
+ GRSimpleVals::EvalObjCMessageExpr(Dst, Eng, Builder, ME, Pred);
+}
+
+bool CFRefCount::EvalObjCMessageExprAux(ExplodedNodeSet<ValueState>& Dst,
+ GRExprEngine& Eng,
+ GRStmtNodeBuilder<ValueState>& Builder,
+ ObjCMessageExpr* ME,
+ ExplodedNode<ValueState>* Pred) {
+
+ // Handle "toll-free bridging." Eventually we will want to track the
+ // underlying object type associated.
+
+ Selector S = ME->getSelector();
+
+ if (!S.isUnarySelector())
+ return true;
+
+ return true; // FIXME: change to return false when more is implemented.
+}
+
// End-of-path.
void CFRefCount::EvalEndPath(GRExprEngine& Engine,
OpenPOWER on IntegriCloud