diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-15 23:44:31 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-15 23:44:31 +0000 |
commit | 8534820eab07a45e5a50a41cfeb4359108900826 (patch) | |
tree | 2685113387e01faddf49c7dd8cdcafefea4247a1 /lib | |
parent | e695e1cd7d8a579455e8969be36cbaf10a316a64 (diff) |
Added initial boilerplate to support toll-free bridging in the ref-count checker.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49756 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index ff8b3e5e69..051cad341f 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/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, |