[cfe-commits] r81061 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/GRExprEngine.cpp

Zhongxing Xu xuzhongxing at gmail.com
Fri Sep 4 22:00:58 PDT 2009


Author: zhongxingxu
Date: Sat Sep  5 00:00:57 2009
New Revision: 81061

URL: http://llvm.org/viewvc/llvm-project?rev=81061&view=rev
Log:
Refactor builtin function evaluation code into its own function.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
    cfe/trunk/lib/Analysis/GRExprEngine.cpp

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=81061&r1=81060&r2=81061&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Sat Sep  5 00:00:57 2009
@@ -578,6 +578,9 @@
   SVal EvalComplement(SVal X) {
     return X.isValid() ? SVator.EvalComplement(cast<NonLoc>(X)) : X;
   }
+
+  bool EvalBuiltinFunction(const FunctionDecl *FD, CallExpr *CE,
+                           ExplodedNode *Pred, ExplodedNodeSet &Dst);
   
 public:
   

Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=81061&r1=81060&r2=81061&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Sat Sep  5 00:00:57 2009
@@ -1503,6 +1503,46 @@
   }
 }
 
+bool GRExprEngine::EvalBuiltinFunction(const FunctionDecl *FD, CallExpr *CE,
+                                       ExplodedNode *Pred,
+                                       ExplodedNodeSet &Dst) {
+  if (!FD)
+    return false;
+      
+  unsigned id = FD->getBuiltinID(getContext());
+  if (!id)
+    return false;
+
+  const GRState *state = Pred->getState();
+
+  switch (id) {
+  case Builtin::BI__builtin_expect: {
+    // For __builtin_expect, just return the value of the subexpression.
+    assert (CE->arg_begin() != CE->arg_end());            
+    SVal X = state->getSVal(*(CE->arg_begin()));
+    MakeNode(Dst, CE, Pred, state->BindExpr(CE, X));
+    return true;
+  }
+            
+  case Builtin::BI__builtin_alloca: {
+    // FIXME: Refactor into StoreManager itself?
+    MemRegionManager& RM = getStateManager().getRegionManager();
+    const MemRegion* R =
+      RM.getAllocaRegion(CE, Builder->getCurrentBlockCount());
+    
+    // Set the extent of the region in bytes. This enables us to use the
+    // SVal of the argument directly. If we save the extent in bits, we
+    // cannot represent values like symbol*8.
+    SVal Extent = state->getSVal(*(CE->arg_begin()));
+    state = getStoreManager().setExtent(state, R, Extent);
+    MakeNode(Dst, CE, Pred, state->BindExpr(CE, loc::MemRegionVal(R)));
+    return true;
+  }
+  }
+
+  return false;
+}
+
 void GRExprEngine::EvalCall(ExplodedNodeSet& Dst, CallExpr* CE, SVal L, 
                             ExplodedNode* Pred) {
   assert (Builder && "GRStmtNodeBuilder must be defined.");
@@ -1571,7 +1611,8 @@
   }
   
   // Finally, evaluate the function call.
-  for (ExplodedNodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); DI!=DE; ++DI) {
+  for (ExplodedNodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); 
+       DI != DE; ++DI) {
 
     const GRState* state = GetState(*DI);
     SVal L = state->getSVal(Callee);
@@ -1587,38 +1628,8 @@
     MarkNoReturnFunction(FD, CE, state, Builder);
     
     // Evaluate the call.
-
-    if (FD) {
-      
-      if (unsigned id = FD->getBuiltinID(getContext()))
-        switch (id) {
-          case Builtin::BI__builtin_expect: {
-            // For __builtin_expect, just return the value of the subexpression.
-            assert (CE->arg_begin() != CE->arg_end());            
-            SVal X = state->getSVal(*(CE->arg_begin()));
-            MakeNode(Dst, CE, *DI, state->BindExpr(CE, X));
-            continue;            
-          }
-            
-          case Builtin::BI__builtin_alloca: {
-            // FIXME: Refactor into StoreManager itself?
-            MemRegionManager& RM = getStateManager().getRegionManager();
-            const MemRegion* R =
-              RM.getAllocaRegion(CE, Builder->getCurrentBlockCount());
-
-            // Set the extent of the region in bytes. This enables us to use the
-            // SVal of the argument directly. If we save the extent in bits, we
-            // cannot represent values like symbol*8.
-            SVal Extent = state->getSVal(*(CE->arg_begin()));
-            state = getStoreManager().setExtent(state, R, Extent);
-            MakeNode(Dst, CE, *DI, state->BindExpr(CE, loc::MemRegionVal(R)));
-            continue;            
-          }
-            
-          default:
-            break;
-        }
-    }       
+    if (EvalBuiltinFunction(FD, CE, Pred, Dst))
+      continue;
 
     // Dispatch to the plug-in transfer function.      
     





More information about the cfe-commits mailing list