From: Argyrios Kyrtzidis Date: Mon, 28 Feb 2011 01:26:28 +0000 (+0000) Subject: [analyzer] Have CheckerManager::registerChecker return a pointer to the checker objec... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3fe71f445f76003649b5da24209e80225a7ee74f;p=clang [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 --- 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 - void registerChecker() { + CHECKER *registerChecker() { + CheckerTag tag = getCheckerTag(); + CheckerRef &ref = CheckerTags[tag]; + if (ref) + return static_cast(ref); // already registered. + CHECKER *checker = new CHECKER(); CheckerDtors.push_back(CheckerDtor(checker, destruct)); CHECKER::_register(checker, *this); + ref = checker; + return checker; } //===----------------------------------------------------------------------===// @@ -309,6 +319,11 @@ private: template static void destruct(void *obj) { delete static_cast(obj); } + template + static CheckerTag getCheckerTag() { static int tag; return &tag; } + + llvm::DenseMap CheckerTags; + std::vector CheckerDtors; struct DeclCheckerInfo {