зеркало из https://github.com/microsoft/clang-1.git
Factor CheckerManager to be able to pass AnalyzerOptions to checkers
during checker registration. There are no immediate clients of this, but this provides a way for checkers to query the options table at startup instead. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179626 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a9ad400e7a
Коммит
8dae128d16
|
@ -232,6 +232,7 @@ private:
|
|||
/// \sa getMaxNodesPerTopLevelFunction
|
||||
Optional<unsigned> MaxNodesPerTopLevelFunction;
|
||||
|
||||
public:
|
||||
/// Interprets an option's string value as a boolean.
|
||||
///
|
||||
/// Accepts the strings "true" and "false".
|
||||
|
@ -244,7 +245,6 @@ private:
|
|||
/// Interprets an option's string value as an integer value.
|
||||
int getOptionAsInteger(StringRef Name, int DefaultVal);
|
||||
|
||||
public:
|
||||
/// \brief Retrieves and sets the UserMode. This is a high-level option,
|
||||
/// which is used to set other low-level options. It is not accessible
|
||||
/// outside of AnalyzerOptions.
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "clang/Analysis/ProgramPoint.h"
|
||||
#include "clang/Basic/LangOptions.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h"
|
||||
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
|
@ -134,9 +135,13 @@ enum PointerEscapeKind {
|
|||
|
||||
class CheckerManager {
|
||||
const LangOptions LangOpts;
|
||||
|
||||
AnalyzerOptionsRef AOptions;
|
||||
public:
|
||||
CheckerManager(const LangOptions &langOpts) : LangOpts(langOpts) { }
|
||||
CheckerManager(const LangOptions &langOpts,
|
||||
AnalyzerOptionsRef AOptions)
|
||||
: LangOpts(langOpts),
|
||||
AOptions(AOptions) {}
|
||||
|
||||
~CheckerManager();
|
||||
|
||||
bool hasPathSensitiveCheckers() const;
|
||||
|
@ -144,6 +149,7 @@ public:
|
|||
void finishedCheckerRegistration();
|
||||
|
||||
const LangOptions &getLangOpts() const { return LangOpts; }
|
||||
AnalyzerOptions &getAnalyzerOptions() { return *AOptions; }
|
||||
|
||||
typedef CheckerBase *CheckerRef;
|
||||
typedef const void *CheckerTag;
|
||||
|
@ -170,6 +176,20 @@ public:
|
|||
return checker;
|
||||
}
|
||||
|
||||
template <typename CHECKER>
|
||||
CHECKER *registerChecker(AnalyzerOptions &AOpts) {
|
||||
CheckerTag tag = getTag<CHECKER>();
|
||||
CheckerRef &ref = CheckerTags[tag];
|
||||
if (ref)
|
||||
return static_cast<CHECKER *>(ref); // already registered.
|
||||
|
||||
CHECKER *checker = new CHECKER(AOpts);
|
||||
CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>));
|
||||
CHECKER::_register(checker, *this);
|
||||
ref = checker;
|
||||
return checker;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Functions for running checkers for AST traversing..
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace clang {
|
|||
namespace ento {
|
||||
class CheckerManager;
|
||||
|
||||
CheckerManager *createCheckerManager(const AnalyzerOptions &opts,
|
||||
CheckerManager *createCheckerManager(AnalyzerOptions &opts,
|
||||
const LangOptions &langOpts,
|
||||
ArrayRef<std::string> plugins,
|
||||
DiagnosticsEngine &diags);
|
||||
|
|
|
@ -100,11 +100,12 @@ void ClangCheckerRegistry::warnIncompatible(DiagnosticsEngine *diags,
|
|||
}
|
||||
|
||||
|
||||
CheckerManager *ento::createCheckerManager(const AnalyzerOptions &opts,
|
||||
CheckerManager *ento::createCheckerManager(AnalyzerOptions &opts,
|
||||
const LangOptions &langOpts,
|
||||
ArrayRef<std::string> plugins,
|
||||
DiagnosticsEngine &diags) {
|
||||
OwningPtr<CheckerManager> checkerMgr(new CheckerManager(langOpts));
|
||||
OwningPtr<CheckerManager> checkerMgr(new CheckerManager(langOpts,
|
||||
&opts));
|
||||
|
||||
SmallVector<CheckerOptInfo, 8> checkerOpts;
|
||||
for (unsigned i = 0, e = opts.CheckersControlList.size(); i != e; ++i) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче