diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-28 01:26:28 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-28 01:26:28 +0000 |
commit | 3fe71f445f76003649b5da24209e80225a7ee74f (patch) | |
tree | 19fb58143efec0fd7a696e3c033bf7d3cc8747d6 | |
parent | 035287d73947320d2ff65b7d9a5c3d990427eee3 (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.h | 17 |
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 { |