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
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index ff8b3e5..051cad3 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -600,6 +600,18 @@
                         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 @@
   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,