summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-28 17:36:09 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-28 17:36:09 +0000
commita15dfec3f50ef3968cba9f2bd674379637acff39 (patch)
treed3c3f0ddce1c15adc2a9fbc063bccd2796fecdf4 /clang/lib/StaticAnalyzer
parent98b570ecad4806c8116ae8298caae039007329ef (diff)
downloadbcm5719-llvm-a15dfec3f50ef3968cba9f2bd674379637acff39.tar.gz
bcm5719-llvm-a15dfec3f50ef3968cba9f2bd674379637acff39.zip
[analyzer] Introduce "event" mechanism in CheckerManager.
A checker can register as receiver/listener of "events" (basically it registers a callback with a function getting called with an argument of the event type) and other checkers can register as "dispatchers" and can pass an event object to all the listeners. This allows cooperation amongst checkers but with very loose coupling. llvm-svn: 126658
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r--clang/lib/StaticAnalyzer/Core/CheckerManager.cpp10
-rw-r--r--clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp2
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
index 4776f5702dd..74f47e4f77e 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
@@ -20,6 +20,16 @@
using namespace clang;
using namespace ento;
+void CheckerManager::finishedCheckerRegistration() {
+#ifndef NDEBUG
+ // Make sure that for every event that has listeners, there is at least
+ // one dispatcher registered for it.
+ for (llvm::DenseMap<EventTag, EventInfo>::iterator
+ I = Events.begin(), E = Events.end(); I != E; ++I)
+ assert(I->second.HasDispatcher && "No dispatcher registered for an event");
+#endif
+}
+
//===----------------------------------------------------------------------===//
// Functions for running checkers for AST traversing..
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp b/clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
index 677e20cd9c0..0484cbed3be 100644
--- a/clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
@@ -43,6 +43,8 @@ CheckerManager *ento::registerCheckers(const AnalyzerOptions &opts,
// FIXME: Load CheckerProviders from plugins.
+ checkerMgr->finishedCheckerRegistration();
+
for (unsigned i = 0, e = checkerOpts.size(); i != e; ++i) {
if (checkerOpts[i].isUnclaimed())
diags.Report(diag::warn_unkwown_analyzer_checker)
OpenPOWER on IntegriCloud