aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-28 01:26:28 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-28 01:26:28 +0000
commit3fe71f445f76003649b5da24209e80225a7ee74f (patch)
tree19fb58143efec0fd7a696e3c033bf7d3cc8747d6
parent035287d73947320d2ff65b7d9a5c3d990427eee3 (diff)
[analyzer] Have CheckerManager::registerChecker return a pointer to the checker object and
only allow a checker to be registered once. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126605 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/StaticAnalyzer/Core/CheckerManager.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/include/clang/StaticAnalyzer/Core/CheckerManager.h b/include/clang/StaticAnalyzer/Core/CheckerManager.h
index 276819549d..1ad85d2e42 100644
--- a/include/clang/StaticAnalyzer/Core/CheckerManager.h
+++ b/include/clang/StaticAnalyzer/Core/CheckerManager.h
@@ -99,6 +99,7 @@ public:
const LangOptions &getLangOptions() const { return LangOpts; }
typedef void *CheckerRef;
+ typedef void *CheckerTag;
typedef CheckerFn<> CheckerDtor;
//===----------------------------------------------------------------------===//
@@ -106,11 +107,20 @@ public:
//===----------------------------------------------------------------------===//
/// \brief Used to register checkers.
+ ///
+ /// \returns a pointer to the checker object.
template <typename CHECKER>
- void registerChecker() {
+ CHECKER *registerChecker() {
+ CheckerTag tag = getCheckerTag<CHECKER>();
+ CheckerRef &ref = CheckerTags[tag];
+ if (ref)
+ return static_cast<CHECKER *>(ref); // already registered.
+
CHECKER *checker = new CHECKER();
CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>));
CHECKER::_register(checker, *this);
+ ref = checker;
+ return checker;
}
//===----------------------------------------------------------------------===//
@@ -309,6 +319,11 @@ private:
template <typename CHECKER>
static void destruct(void *obj) { delete static_cast<CHECKER *>(obj); }
+ template <typename CHECKER>
+ static CheckerTag getCheckerTag() { static int tag; return &tag; }
+
+ llvm::DenseMap<CheckerTag, CheckerRef> CheckerTags;
+
std::vector<CheckerDtor> CheckerDtors;
struct DeclCheckerInfo {