HelpText<"Emit verbose output about the analyzer's progress">,
MarshallingInfoFlag<"AnalyzerOpts->AnalyzerDisplayProgress">;
def analyze_function : Separate<["-"], "analyze-function">,
- HelpText<"Run analysis on specific function (for C++ include parameters in name)">;
+ HelpText<"Run analysis on specific function (for C++ include parameters in name)">,
+ MarshallingInfoString<"AnalyzerOpts->AnalyzeSpecificFunction">;
def analyze_function_EQ : Joined<["-"], "analyze-function=">, Alias<analyze_function>;
def trim_egraph : Flag<["-"], "trim-egraph">,
HelpText<"Only show error-related paths in the analysis graph">,
def analyzer_dump_egraph_EQ : Joined<["-"], "analyzer-dump-egraph=">, Alias<analyzer_dump_egraph>;
def analyzer_inline_max_stack_depth : Separate<["-"], "analyzer-inline-max-stack-depth">,
- HelpText<"Bound on stack depth while inlining (4 by default)">;
+ HelpText<"Bound on stack depth while inlining (4 by default)">,
+ // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls).
+ MarshallingInfoStringInt<"AnalyzerOpts->InlineMaxStackDepth", "5">;
def analyzer_inline_max_stack_depth_EQ : Joined<["-"], "analyzer-inline-max-stack-depth=">,
Alias<analyzer_inline_max_stack_depth>;
MarshallingInfoFlag<"AnalyzerOpts->NoRetryExhausted">;
def analyzer_max_loop : Separate<["-"], "analyzer-max-loop">,
- HelpText<"The maximum number of times the analyzer will go through a loop">;
+ HelpText<"The maximum number of times the analyzer will go through a loop">,
+ MarshallingInfoStringInt<"AnalyzerOpts->maxBlockVisitOnPath", "4">;
def analyzer_stats : Flag<["-"], "analyzer-stats">,
HelpText<"Print internal analyzer statistics.">,
MarshallingInfoFlag<"AnalyzerOpts->PrintStats">;
bool AnalyzerWerror : 1;
/// The inlining stack depth limit.
- // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls).
- unsigned InlineMaxStackDepth = 5;
+ unsigned InlineMaxStackDepth;
/// The mode of function selection used during inlining.
AnalysisInliningMode InliningMode = NoRedundancy;
#include <memory>
#include <string>
#include <tuple>
+#include <type_traits>
#include <utility>
#include <vector>
static void denormalizeString(SmallVectorImpl<const char *> &Args,
const char *Spelling,
- CompilerInvocation::StringAllocator SA,
- unsigned TableIndex, const std::string &Value) {
+ CompilerInvocation::StringAllocator SA, unsigned,
+ Twine Value) {
Args.push_back(Spelling);
Args.push_back(SA(Value));
}
+template <typename T,
+ std::enable_if_t<!std::is_convertible<T, Twine>::value &&
+ std::is_constructible<Twine, T>::value,
+ bool> = false>
+static void denormalizeString(SmallVectorImpl<const char *> &Args,
+ const char *Spelling,
+ CompilerInvocation::StringAllocator SA,
+ unsigned TableIndex, T Value) {
+ denormalizeString(Args, Spelling, SA, TableIndex, Twine(Value));
+}
+
+template <typename IntTy>
+static Optional<IntTy> normalizeStringIntegral(OptSpecifier Opt, int,
+ const ArgList &Args,
+ DiagnosticsEngine &Diags) {
+ auto *Arg = Args.getLastArg(Opt);
+ if (!Arg)
+ return None;
+ IntTy Res;
+ if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
+ Diags.Report(diag::err_drv_invalid_int_value)
+ << Arg->getAsString(Args) << Arg->getValue();
+ }
+ return Res;
+}
+
static Optional<std::string> normalizeTriple(OptSpecifier Opt, int TableIndex,
const ArgList &Args,
DiagnosticsEngine &Diags) {
.Case("false", false)
.Default(false);
- Opts.AnalyzeSpecificFunction =
- std::string(Args.getLastArgValue(OPT_analyze_function));
- Opts.maxBlockVisitOnPath =
- getLastArgIntValue(Args, OPT_analyzer_max_loop, 4, Diags);
- Opts.InlineMaxStackDepth =
- getLastArgIntValue(Args, OPT_analyzer_inline_max_stack_depth,
- Opts.InlineMaxStackDepth, Diags);
-
Opts.CheckersAndPackages.clear();
for (const Arg *A :
Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
code Denormalizer = "denormalizeString";
}
+class MarshallingInfoStringInt<code keypath, code defaultvalue="0", code type="unsigned">
+ : MarshallingInfo<keypath, defaultvalue> {
+ code Normalizer = "normalizeStringIntegral<"#type#">";
+ code Denormalizer = "denormalizeString";
+}
+
class MarshallingInfoFlag<code keypath, code defaultvalue = "false">
: MarshallingInfo<keypath, defaultvalue> {
code Normalizer = "normalizeSimpleFlag";