summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-02-02 02:01:55 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-02-02 02:01:55 +0000
commit34090db51632aa24c46eeba5713539d8cc6f039d (patch)
tree07a490a0bb38a0b43f096d421828173a0edba703 /clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
parent98af4664e0b7940a65f10b4946e27cc8cc7c66e0 (diff)
downloadbcm5719-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/Core/CoreEngine.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/CoreEngine.cpp33
1 files changed, 29 insertions, 4 deletions
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) {
OpenPOWER on IntegriCloud