[cfe-commits] r58056 - in /cfe/trunk: Driver/Analyses.def Driver/AnalysisConsumer.cpp Driver/AnalysisConsumer.h Driver/clang.cpp include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/Store.h lib/Analysis/GRExprEngine.cpp lib/Analysis/RegionStore.cpp

Ted Kremenek kremenek at apple.com
Thu Oct 23 18:05:00 PDT 2008


Author: kremenek
Date: Thu Oct 23 20:04:59 2008
New Revision: 58056

URL: http://llvm.org/viewvc/llvm-project?rev=58056&view=rev
Log:
Make the analyzer store (memory model) a command line option.

Modified:
    cfe/trunk/Driver/Analyses.def
    cfe/trunk/Driver/AnalysisConsumer.cpp
    cfe/trunk/Driver/AnalysisConsumer.h
    cfe/trunk/Driver/clang.cpp
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
    cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
    cfe/trunk/lib/Analysis/GRExprEngine.cpp
    cfe/trunk/lib/Analysis/RegionStore.cpp

Modified: cfe/trunk/Driver/Analyses.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/Analyses.def?rev=58056&r1=58055&r2=58056&view=diff

==============================================================================
--- cfe/trunk/Driver/Analyses.def (original)
+++ cfe/trunk/Driver/Analyses.def Thu Oct 23 20:04:59 2008
@@ -11,6 +11,14 @@
 //
 //===----------------------------------------------------------------------===//
 
+#ifndef ANALYSIS
+#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE)
+#endif
+
+#ifndef ANALYSIS_STORE
+#define ANALYSIS_STORE(NAME, CMDFLAG, DESC)
+#endif
+
 ANALYSIS(CFGDump, "cfg-dump",
          "Display Control-Flow Graphs", Code)
 
@@ -43,4 +51,9 @@
 ANALYSIS(CheckerCFRef, "checker-cfref",
          "Run the [Core] Foundation reference count checker", Code)
 
+
+ANALYSIS_STORE(BasicStore, "basic", "Use basic analyzer store")
+ANALYSIS_STORE(RegionStore, "region", "Use region-based analyzer store")
+
 #undef ANALYSIS
+#undef ANALYSIS_STORE

Modified: cfe/trunk/Driver/AnalysisConsumer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/AnalysisConsumer.cpp?rev=58056&r1=58055&r2=58056&view=diff

==============================================================================
--- cfe/trunk/Driver/AnalysisConsumer.cpp (original)
+++ cfe/trunk/Driver/AnalysisConsumer.cpp Thu Oct 23 20:04:59 2008
@@ -65,7 +65,7 @@
     const bool VisGraphviz;
     const bool VisUbigraph;
     const bool TrimGraph;
-    const LangOptions& LOpts;
+    const LangOptions& LOpts;    
     Diagnostic &Diags;
     ASTContext* Ctx;
     Preprocessor* PP;
@@ -74,19 +74,21 @@
     const std::string FName;
     llvm::OwningPtr<PathDiagnosticClient> PD;
     bool AnalyzeAll;  
+    AnalysisStores SM;
 
     AnalysisConsumer(Diagnostic &diags, Preprocessor* pp,
                      PreprocessorFactory* ppf,
                      const LangOptions& lopts,
                      const std::string& fname,
                      const std::string& htmldir,
+                     AnalysisStores sm,
                      bool visgraphviz, bool visubi, bool trim, bool analyzeAll) 
       : VisGraphviz(visgraphviz), VisUbigraph(visubi), TrimGraph(trim),
         LOpts(lopts), Diags(diags),
         Ctx(0), PP(pp), PPF(ppf),
         HTMLDir(htmldir),
         FName(fname),
-        AnalyzeAll(analyzeAll) {}
+        AnalyzeAll(analyzeAll), SM(sm) {}
     
     void addCodeAction(CodeAction action) {
       FunctionActions.push_back(action);
@@ -126,6 +128,15 @@
     Decl* getCodeDecl() const { return D; }
     Stmt* getBody() const { return Body; }
     
+    GRStateManager::StoreManagerCreator getStoreManagerCreator() {
+      switch (C.SM) {
+        default:
+#define ANALYSIS_STORE(NAME, CMDFLAG, DESC)\
+case NAME##Model: return Create##NAME##Manager;
+#include "Analyses.def"
+      }
+    };
+    
     virtual CFG* getCFG() {
       if (!cfg) cfg.reset(CFG::buildCFG(getBody()));
       return cfg.get();
@@ -324,7 +335,9 @@
   // Display progress.
   mgr.DisplayFunction();
   
-  GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), *L);
+  GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), *L,
+                   mgr.getStoreManagerCreator());
+
   Eng.setTransferFunctions(tf);
   
   if (StandardWarnings) {
@@ -436,6 +449,7 @@
 //===----------------------------------------------------------------------===//
 
 ASTConsumer* clang::CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
+                                           AnalysisStores SM,
                                            Diagnostic &diags, Preprocessor* pp,
                                            PreprocessorFactory* ppf,
                                            const LangOptions& lopts,
@@ -446,7 +460,7 @@
                                            bool analyzeAll) {
   
   llvm::OwningPtr<AnalysisConsumer>
-  C(new AnalysisConsumer(diags, pp, ppf, lopts, fname, htmldir,
+  C(new AnalysisConsumer(diags, pp, ppf, lopts, fname, htmldir, SM,
                          VisGraphviz, VisUbi, trim, analyzeAll));
   
   for ( ; Beg != End ; ++Beg)

Modified: cfe/trunk/Driver/AnalysisConsumer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/AnalysisConsumer.h?rev=58056&r1=58055&r2=58056&view=diff

==============================================================================
--- cfe/trunk/Driver/AnalysisConsumer.h (original)
+++ cfe/trunk/Driver/AnalysisConsumer.h Thu Oct 23 20:04:59 2008
@@ -21,8 +21,15 @@
 #include "Analyses.def"
 NumAnalyses
 };
+  
+enum AnalysisStores {
+#define ANALYSIS_STORE(NAME, CMDFLAG, DESC) NAME##Model,
+#include "Analyses.def"
+NumStores
+};
 
 ASTConsumer* CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
+                                    AnalysisStores SM,
                                     Diagnostic &diags, Preprocessor* pp,
                                     PreprocessorFactory* ppf,
                                     const LangOptions& lopts,
@@ -30,7 +37,7 @@
                                     const std::string& htmldir,
                                     bool VisualizeGraphViz,
                                     bool VisualizeUbi,
-                                    bool VizTrimGraph,
+                                    bool VizTrimGraph,                                    
                                     bool AnalyzeAll);
 } // end clang namespace
 

Modified: cfe/trunk/Driver/clang.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=58056&r1=58055&r2=58056&view=diff

==============================================================================
--- cfe/trunk/Driver/clang.cpp (original)
+++ cfe/trunk/Driver/clang.cpp Thu Oct 23 20:04:59 2008
@@ -203,13 +203,22 @@
                    "functions defined in header files"));
 
 static llvm::cl::list<Analyses>
-AnalysisList(llvm::cl::desc("Available Source Code Analyses:"),
+AnalysisList(llvm::cl::desc("SCA Checks/Analyses:"),
 llvm::cl::values(
 #define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE)\
 clEnumValN(NAME, CMDFLAG, DESC),
 #include "Analyses.def"
 clEnumValEnd));
 
+static llvm::cl::opt<AnalysisStores> 
+AnalysisStoreOpt(llvm::cl::desc("SCA Low-Level Options (Store):"),
+                  llvm::cl::init(BasicStoreModel),
+                  llvm::cl::values(
+#define ANALYSIS_STORE(NAME, CMDFLAG, DESC)\
+clEnumValN(NAME##Model, "analyzer-store-" CMDFLAG, DESC),
+#include "Analyses.def"
+clEnumValEnd));
+
 //===----------------------------------------------------------------------===//
 // Language Options
 //===----------------------------------------------------------------------===//
@@ -1190,6 +1199,7 @@
       assert (!AnalysisList.empty());
       return CreateAnalysisConsumer(&AnalysisList[0],
                                     &AnalysisList[0]+AnalysisList.size(),
+                                    AnalysisStoreOpt,
                                     Diag, PP, PPF, LangOpts,
                                     AnalyzeSpecificFunction,
                                     OutputFile, VisualizeEGDot, VisualizeEGUbi,

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=58056&r1=58055&r2=58056&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Thu Oct 23 20:04:59 2008
@@ -167,7 +167,10 @@
   UndefArgsTy MsgExprUndefArgs;
   
 public:
-  GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, LiveVariables& L);
+  GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, LiveVariables& L,
+               GRStateManager::StoreManagerCreator SMC =
+                CreateBasicStoreManager);
+  
   ~GRExprEngine();
   
   void ExecuteWorkList(unsigned Steps = 150000) {

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Thu Oct 23 20:04:59 2008
@@ -88,6 +88,7 @@
 };
   
 StoreManager* CreateBasicStoreManager(GRStateManager& StMgr);
+StoreManager* CreateRegionStoreManager(GRStateManager& StMgr);
   
 } // end clang namespace
 

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Oct 23 20:04:59 2008
@@ -115,12 +115,13 @@
 
 
 GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx,
-                           LiveVariables& L)
+                           LiveVariables& L,
+                           GRStateManager::StoreManagerCreator SMC)
   : CoreEngine(cfg, CD, Ctx, *this), 
     G(CoreEngine.getGraph()),
     Liveness(L),
     Builder(NULL),
-    StateMgr(G.getContext(), CreateBasicStoreManager,
+    StateMgr(G.getContext(), SMC,
              CreateBasicConstraintManager, G.getAllocator(), G.getCFG(), L),
     SymMgr(StateMgr.getSymbolManager()),
     CurrentStmt(NULL),

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

==============================================================================
--- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
+++ cfe/trunk/lib/Analysis/RegionStore.cpp Thu Oct 23 20:04:59 2008
@@ -66,6 +66,11 @@
 
 } // end anonymous namespace
 
+StoreManager* clang::CreateRegionStoreManager(GRStateManager& StMgr) {
+  // return new RegionStoreManager(StMgr);
+  return 0; // Uncomment the above line when RegionStoreManager is not abstract.
+}
+
 Loc RegionStoreManager::getElementLoc(const VarDecl* VD, SVal Idx) {
   MemRegion* R = MRMgr.getVarRegion(VD);
   ElementRegion* ER = MRMgr.getElementRegion(Idx, R);





More information about the cfe-commits mailing list