aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/CC1Options.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-11-22 22:08:20 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-11-22 22:08:20 +0000
commite2814d89025b847ad7363b21e3e053bbae180b54 (patch)
tree67ea90ffd5dd0d6776527152b32292ec053b2873 /lib/Driver/CC1Options.cpp
parente33f82f346222b87b1632c38fefff20cb01b82da (diff)
Add clang -cc1 parsing of analyzer options.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89629 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/CC1Options.cpp')
-rw-r--r--lib/Driver/CC1Options.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/Driver/CC1Options.cpp b/lib/Driver/CC1Options.cpp
index f92ada77fa..f49c641c19 100644
--- a/lib/Driver/CC1Options.cpp
+++ b/lib/Driver/CC1Options.cpp
@@ -14,6 +14,7 @@
#include "clang/Driver/Option.h"
#include "clang/Frontend/CompilerInvocation.h"
#include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Host.h"
@@ -79,6 +80,73 @@ getAllArgValues(ArgList &Args, cc1options::ID ID) {
//
+static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args) {
+ Opts.AnalysisList.clear();
+#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE) \
+ if (Args.hasArg(cc1options::OPT_analysis_##NAME)) \
+ Opts.AnalysisList.push_back(NAME);
+#include "clang/Frontend/Analyses.def"
+
+ if (Arg *A = Args.getLastArg(cc1options::OPT_analyzer_store)) {
+ llvm::StringRef Name = A->getValue(Args);
+ AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name)
+#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
+ .Case(CMDFLAG, NAME##Model)
+#include "clang/Frontend/Analyses.def"
+ .Default(NumStores);
+ // FIXME: Error handling.
+ if (Value == NumStores)
+ llvm::errs() << "error: invalid analysis store '" << Name << "'\n";
+ else
+ Opts.AnalysisStoreOpt = Value;
+ }
+
+ if (Arg *A = Args.getLastArg(cc1options::OPT_analyzer_constraints)) {
+ llvm::StringRef Name = A->getValue(Args);
+ AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name)
+#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
+ .Case(CMDFLAG, NAME##Model)
+#include "clang/Frontend/Analyses.def"
+ .Default(NumConstraints);
+ // FIXME: Error handling.
+ if (Value == NumConstraints)
+ llvm::errs() << "error: invalid analysis constraints '" << Name << "'\n";
+ else
+ Opts.AnalysisConstraintsOpt = Value;
+ }
+
+ if (Arg *A = Args.getLastArg(cc1options::OPT_analyzer_output)) {
+ llvm::StringRef Name = A->getValue(Args);
+ AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
+#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) \
+ .Case(CMDFLAG, PD_##NAME)
+#include "clang/Frontend/Analyses.def"
+ .Default(NUM_ANALYSIS_DIAG_CLIENTS);
+ // FIXME: Error handling.
+ if (Value == NUM_ANALYSIS_DIAG_CLIENTS)
+ llvm::errs() << "error: invalid analysis output '" << Name << "'\n";
+ else
+ Opts.AnalysisDiagOpt = Value;
+ }
+
+ Opts.VisualizeEGDot =
+ Args.hasArg(cc1options::OPT_analyzer_viz_egraph_graphviz);
+ Opts.VisualizeEGUbi =
+ Args.hasArg(cc1options::OPT_analyzer_viz_egraph_ubigraph);
+ Opts.AnalyzeAll = Args.hasArg(cc1options::OPT_analyzer_opt_analyze_headers);
+ Opts.AnalyzerDisplayProgress =
+ Args.hasArg(cc1options::OPT_analyzer_display_progress);
+ Opts.PurgeDead = !Args.hasArg(cc1options::OPT_analyzer_no_purge_dead);
+ Opts.EagerlyAssume = Args.hasArg(cc1options::OPT_analyzer_eagerly_assume);
+ Opts.AnalyzeSpecificFunction =
+ getLastArgValue(Args, cc1options::OPT_analyze_function);
+ Opts.EnableExperimentalChecks =
+ Args.hasArg(cc1options::OPT_analyzer_experimental_checks);
+ Opts.EnableExperimentalInternalChecks =
+ Args.hasArg(cc1options::OPT_analyzer_experimental_internal_checks);
+ Opts.TrimGraph = Args.hasArg(cc1options::OPT_trim_egraph);
+}
+
static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args) {
// -Os implies -O2
if (Args.hasArg(cc1options::OPT_Os))
@@ -160,6 +228,7 @@ void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
<< " value )\n";
}
+ ParseAnalyzerArgs(Res.getAnalyzerOpts(), *InputArgs);
ParseCodeGenArgs(Res.getCodeGenOpts(), *InputArgs);
ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *InputArgs);
ParseTargetArgs(Res.getTargetOpts(), *InputArgs);