[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