diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-02-02 02:01:55 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-02-02 02:01:55 +0000 |
commit | 34090db51632aa24c46eeba5713539d8cc6f039d (patch) | |
tree | 07a490a0bb38a0b43f096d421828173a0edba703 /clang/lib/StaticAnalyzer | |
parent | 98af4664e0b7940a65f10b4946e27cc8cc7c66e0 (diff) | |
download | bcm5719-llvm-34090db51632aa24c46eeba5713539d8cc6f039d.tar.gz bcm5719-llvm-34090db51632aa24c46eeba5713539d8cc6f039d.zip |
[analyzer] Expose exploration strategy through analyzer options.
Differential Revision: https://reviews.llvm.org/D42774
llvm-svn: 324049
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp | 20 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/CoreEngine.cpp | 33 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 2 |
3 files changed, 50 insertions, 5 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp index 26fea772d0a..372cb2db061 100644 --- a/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ b/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -55,6 +55,26 @@ AnalyzerOptions::UserModeKind AnalyzerOptions::getUserMode() { return UserMode; } +AnalyzerOptions::ExplorationStrategyKind +AnalyzerOptions::getExplorationStrategy() { + if (ExplorationStrategy == ExplorationStrategyKind::NotSet) { + StringRef StratStr = Config.insert( + std::make_pair("exploration_strategy", "dfs")).first->second; + ExplorationStrategy = llvm::StringSwitch<ExplorationStrategyKind>(StratStr) + .Case("dfs", ExplorationStrategyKind::DFS) + .Case("bfs", ExplorationStrategyKind::BFS) + .Case("loopstack_priority", ExplorationStrategyKind::LoopstackPriority) + .Case("bfs_block_dfs_contents", ExplorationStrategyKind::BFSBlockDFSContents) + .Default(ExplorationStrategyKind::NotSet); + assert(ExplorationStrategy != ExplorationStrategyKind::NotSet + && "User mode is invalid."); + } + return ExplorationStrategy; + +} + + + IPAKind AnalyzerOptions::getIPAMode() { if (IPAMode == IPAK_NotSet) { diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp index 2fdd310fa31..a06c311590a 100644 --- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -82,8 +82,13 @@ public: // functions, and we the code for the dstor generated in one compilation unit. WorkList::~WorkList() {} -WorkList *WorkList::makeDFS() { return new DFS(); } -WorkList *WorkList::makeBFS() { return new BFS(); } +std::unique_ptr<WorkList> WorkList::makeDFS() { + return llvm::make_unique<DFS>(); +} + +std::unique_ptr<WorkList> WorkList::makeBFS() { + return llvm::make_unique<BFS>(); +} namespace { class BFSBlockDFSContents : public WorkList { @@ -119,14 +124,34 @@ namespace { }; } // end anonymous namespace -WorkList* WorkList::makeBFSBlockDFSContents() { - return new BFSBlockDFSContents(); +std::unique_ptr<WorkList> WorkList::makeBFSBlockDFSContents() { + return llvm::make_unique<BFSBlockDFSContents>(); } //===----------------------------------------------------------------------===// // Core analysis engine. //===----------------------------------------------------------------------===// +static std::unique_ptr<WorkList> generateWorkList(AnalyzerOptions &Opts) { + switch (Opts.getExplorationStrategy()) { + case AnalyzerOptions::ExplorationStrategyKind::DFS: + return WorkList::makeDFS(); + case AnalyzerOptions::ExplorationStrategyKind::BFS: + return WorkList::makeBFS(); + case AnalyzerOptions::ExplorationStrategyKind::BFSBlockDFSContents: + return WorkList::makeBFSBlockDFSContents(); + default: + llvm_unreachable("Unexpected case"); + } +} + +CoreEngine::CoreEngine(SubEngine &subengine, + FunctionSummariesTy *FS, + AnalyzerOptions &Opts) : SubEng(subengine), + WList(generateWorkList(Opts)), + BCounterFactory(G.getAllocator()), + FunctionSummaries(FS) {} + /// ExecuteWorkList - Run the worklist algorithm for a maximum number of steps. bool CoreEngine::ExecuteWorkList(const LocationContext *L, unsigned Steps, ProgramStateRef InitState) { diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 4a179c5cc46..055152dd52f 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -90,7 +90,7 @@ ExprEngine::ExprEngine(AnalysisManager &mgr, bool gcEnabled, InliningModes HowToInlineIn) : AMgr(mgr), AnalysisDeclContexts(mgr.getAnalysisDeclContextManager()), - Engine(*this, FS), + Engine(*this, FS, mgr.getAnalyzerOptions()), G(Engine.getGraph()), StateMgr(getContext(), mgr.getStoreManagerCreator(), mgr.getConstraintManagerCreator(), G.getAllocator(), |