mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 08:56:15 +08:00
Make AnalyzerOptions a shared object between CompilerInvocation and
AnalysisManager, allowing the StringMap of configuration values to be propagated. llvm-svn: 162978
This commit is contained in:
@@ -189,10 +189,7 @@ public:
|
||||
/// @name Forwarding Methods
|
||||
/// {
|
||||
|
||||
AnalyzerOptions &getAnalyzerOpts() {
|
||||
return Invocation->getAnalyzerOpts();
|
||||
}
|
||||
const AnalyzerOptions &getAnalyzerOpts() const {
|
||||
AnalyzerOptionsRef getAnalyzerOpts() {
|
||||
return Invocation->getAnalyzerOpts();
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
/// options, the warning flags, and so on.
|
||||
class CompilerInvocation : public CompilerInvocationBase {
|
||||
/// Options controlling the static analyzer.
|
||||
AnalyzerOptions AnalyzerOpts;
|
||||
AnalyzerOptionsRef AnalyzerOpts;
|
||||
|
||||
MigratorOptions MigratorOpts;
|
||||
|
||||
@@ -100,7 +100,7 @@ class CompilerInvocation : public CompilerInvocationBase {
|
||||
TargetOptions TargetOpts;
|
||||
|
||||
public:
|
||||
CompilerInvocation() {}
|
||||
CompilerInvocation() : AnalyzerOpts(new AnalyzerOptions()) {}
|
||||
|
||||
/// @name Utility Methods
|
||||
/// @{
|
||||
@@ -148,8 +148,7 @@ public:
|
||||
/// @name Option Subgroups
|
||||
/// @{
|
||||
|
||||
AnalyzerOptions &getAnalyzerOpts() { return AnalyzerOpts; }
|
||||
const AnalyzerOptions &getAnalyzerOpts() const {
|
||||
AnalyzerOptionsRef getAnalyzerOpts() const {
|
||||
return AnalyzerOpts;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
|
||||
namespace clang {
|
||||
class ASTConsumer;
|
||||
@@ -75,7 +76,7 @@ enum AnalysisInliningMode {
|
||||
NumInliningModes
|
||||
};
|
||||
|
||||
class AnalyzerOptions {
|
||||
class AnalyzerOptions : public llvm::RefCountedBase<AnalyzerOptions> {
|
||||
public:
|
||||
typedef llvm::StringMap<std::string> ConfigTable;
|
||||
|
||||
@@ -164,7 +165,9 @@ public:
|
||||
InliningMode = NoRedundancy;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
typedef llvm::IntrusiveRefCntPtr<AnalyzerOptions> AnalyzerOptionsRef;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -931,7 +931,7 @@ static void TargetOptsToArgs(const TargetOptions &Opts,
|
||||
|
||||
void CompilerInvocation::toArgs(std::vector<std::string> &Res) const {
|
||||
ToArgsList List(Res);
|
||||
AnalyzerOptsToArgs(getAnalyzerOpts(), List);
|
||||
AnalyzerOptsToArgs(*getAnalyzerOpts(), List);
|
||||
CodeGenOptsToArgs(getCodeGenOpts(), List);
|
||||
DependencyOutputOptsToArgs(getDependencyOutputOpts(), List);
|
||||
DiagnosticOptsToArgs(getDiagnosticOpts(), List);
|
||||
@@ -2323,7 +2323,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
|
||||
}
|
||||
}
|
||||
|
||||
Success = ParseAnalyzerArgs(Res.getAnalyzerOpts(), *Args, Diags) && Success;
|
||||
Success = ParseAnalyzerArgs(*Res.getAnalyzerOpts(), *Args, Diags) && Success;
|
||||
Success = ParseMigratorArgs(Res.getMigratorOpts(), *Args) && Success;
|
||||
ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args);
|
||||
Success = ParseDiagnosticArgs(Res.getDiagnosticOpts(), *Args, &Diags)
|
||||
|
||||
@@ -175,7 +175,7 @@ bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
|
||||
|
||||
// Honor -analyzer-checker-help.
|
||||
// This should happen AFTER plugins have been loaded!
|
||||
if (Clang->getAnalyzerOpts().ShowCheckerHelp) {
|
||||
if (Clang->getAnalyzerOpts()->ShowCheckerHelp) {
|
||||
ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ public:
|
||||
ASTContext *Ctx;
|
||||
const Preprocessor &PP;
|
||||
const std::string OutDir;
|
||||
AnalyzerOptions Opts;
|
||||
AnalyzerOptionsRef Opts;
|
||||
ArrayRef<std::string> Plugins;
|
||||
|
||||
/// \brief Stores the declarations from the local translation unit.
|
||||
@@ -163,19 +163,19 @@ public:
|
||||
|
||||
AnalysisConsumer(const Preprocessor& pp,
|
||||
const std::string& outdir,
|
||||
const AnalyzerOptions& opts,
|
||||
AnalyzerOptionsRef opts,
|
||||
ArrayRef<std::string> plugins)
|
||||
: RecVisitorMode(ANALYSIS_ALL), RecVisitorBR(0),
|
||||
Ctx(0), PP(pp), OutDir(outdir), Opts(opts), Plugins(plugins) {
|
||||
DigestAnalyzerOptions();
|
||||
if (Opts.PrintStats) {
|
||||
if (Opts->PrintStats) {
|
||||
llvm::EnableStatistics();
|
||||
TUTotalTimer = new llvm::Timer("Analyzer Total Time");
|
||||
}
|
||||
}
|
||||
|
||||
~AnalysisConsumer() {
|
||||
if (Opts.PrintStats)
|
||||
if (Opts->PrintStats)
|
||||
delete TUTotalTimer;
|
||||
}
|
||||
|
||||
@@ -184,20 +184,20 @@ public:
|
||||
PathConsumers.push_back(new ClangDiagPathDiagConsumer(PP.getDiagnostics()));
|
||||
|
||||
if (!OutDir.empty()) {
|
||||
switch (Opts.AnalysisDiagOpt) {
|
||||
switch (Opts->AnalysisDiagOpt) {
|
||||
default:
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN, AUTOCREATE) \
|
||||
case PD_##NAME: CREATEFN(PathConsumers, OutDir, PP); break;
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
}
|
||||
} else if (Opts.AnalysisDiagOpt == PD_TEXT) {
|
||||
} else if (Opts->AnalysisDiagOpt == PD_TEXT) {
|
||||
// Create the text client even without a specified output file since
|
||||
// it just uses diagnostic notes.
|
||||
createTextPathDiagnosticConsumer(PathConsumers, "", PP);
|
||||
}
|
||||
|
||||
// Create the analyzer component creators.
|
||||
switch (Opts.AnalysisStoreOpt) {
|
||||
switch (Opts->AnalysisStoreOpt) {
|
||||
default:
|
||||
llvm_unreachable("Unknown store manager.");
|
||||
#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATEFN) \
|
||||
@@ -205,7 +205,7 @@ public:
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
}
|
||||
|
||||
switch (Opts.AnalysisConstraintsOpt) {
|
||||
switch (Opts->AnalysisConstraintsOpt) {
|
||||
default:
|
||||
llvm_unreachable("Unknown store manager.");
|
||||
#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATEFN) \
|
||||
@@ -215,7 +215,7 @@ public:
|
||||
}
|
||||
|
||||
void DisplayFunction(const Decl *D, AnalysisMode Mode) {
|
||||
if (!Opts.AnalyzerDisplayProgress)
|
||||
if (!Opts->AnalyzerDisplayProgress)
|
||||
return;
|
||||
|
||||
SourceManager &SM = Mgr->getASTContext().getSourceManager();
|
||||
@@ -245,7 +245,7 @@ public:
|
||||
|
||||
virtual void Initialize(ASTContext &Context) {
|
||||
Ctx = &Context;
|
||||
checkerMgr.reset(createCheckerManager(Opts, PP.getLangOpts(), Plugins,
|
||||
checkerMgr.reset(createCheckerManager(*Opts, PP.getLangOpts(), Plugins,
|
||||
PP.getDiagnostics()));
|
||||
Mgr.reset(new AnalysisManager(*Ctx,
|
||||
PP.getDiagnostics(),
|
||||
@@ -254,7 +254,7 @@ public:
|
||||
CreateStoreMgr,
|
||||
CreateConstraintMgr,
|
||||
checkerMgr.get(),
|
||||
Opts));
|
||||
*Opts));
|
||||
}
|
||||
|
||||
/// \brief Store the top level decls in the set to be processed later on.
|
||||
@@ -519,15 +519,15 @@ static std::string getFunctionName(const Decl *D) {
|
||||
}
|
||||
|
||||
bool AnalysisConsumer::skipFunction(Decl *D) {
|
||||
if (!Opts.AnalyzeSpecificFunction.empty() &&
|
||||
getFunctionName(D) != Opts.AnalyzeSpecificFunction)
|
||||
if (!Opts->AnalyzeSpecificFunction.empty() &&
|
||||
getFunctionName(D) != Opts->AnalyzeSpecificFunction)
|
||||
return true;
|
||||
|
||||
// Don't run the actions on declarations in header files unless
|
||||
// otherwise specified.
|
||||
SourceManager &SM = Ctx->getSourceManager();
|
||||
SourceLocation SL = SM.getExpansionLoc(D->getLocation());
|
||||
if (!Opts.AnalyzeAll && !SM.isFromMainFile(SL))
|
||||
if (!Opts->AnalyzeAll && !SM.isFromMainFile(SL))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -553,7 +553,7 @@ void AnalysisConsumer::HandleCode(Decl *D, AnalysisMode Mode,
|
||||
SmallVector<Decl*, 10> WL;
|
||||
WL.push_back(D);
|
||||
|
||||
if (D->hasBody() && Opts.AnalyzeNestedBlocks)
|
||||
if (D->hasBody() && Opts->AnalyzeNestedBlocks)
|
||||
FindBlocks(cast<DeclContext>(D), WL);
|
||||
|
||||
BugReporter BR(*Mgr);
|
||||
@@ -634,7 +634,7 @@ void AnalysisConsumer::RunPathSensitiveChecks(Decl *D,
|
||||
|
||||
ASTConsumer* ento::CreateAnalysisConsumer(const Preprocessor& pp,
|
||||
const std::string& outDir,
|
||||
const AnalyzerOptions& opts,
|
||||
AnalyzerOptionsRef opts,
|
||||
ArrayRef<std::string> plugins) {
|
||||
// Disable the effects of '-Werror' when using the AnalysisConsumer.
|
||||
pp.getDiagnostics().setWarningsAsErrors(false);
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
#define LLVM_CLANG_GR_ANALYSISCONSUMER_H
|
||||
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
|
||||
#include <string>
|
||||
|
||||
namespace clang {
|
||||
|
||||
class AnalyzerOptions;
|
||||
class ASTConsumer;
|
||||
class Preprocessor;
|
||||
class DiagnosticsEngine;
|
||||
@@ -33,7 +33,7 @@ class CheckerManager;
|
||||
/// options.)
|
||||
ASTConsumer* CreateAnalysisConsumer(const Preprocessor &pp,
|
||||
const std::string &output,
|
||||
const AnalyzerOptions& opts,
|
||||
AnalyzerOptionsRef opts,
|
||||
ArrayRef<std::string> plugins);
|
||||
|
||||
} // end GR namespace
|
||||
|
||||
Reference in New Issue
Block a user