diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4110,7 +4110,8 @@ 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; def trim_egraph : Flag<["-"], "trim-egraph">, HelpText<"Only show error-related paths in the analysis graph">, @@ -4124,7 +4125,9 @@ def analyzer_dump_egraph_EQ : Joined<["-"], "analyzer-dump-egraph=">, Alias; 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; @@ -4137,7 +4140,8 @@ 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">; diff --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h --- a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -259,8 +259,7 @@ 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; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -93,6 +93,7 @@ #include #include #include +#include #include #include @@ -282,12 +283,38 @@ static void denormalizeString(SmallVectorImpl &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 ::value && + std::is_constructible::value, + bool> = false> +static void denormalizeString(SmallVectorImpl &Args, + const char *Spelling, + CompilerInvocation::StringAllocator SA, + unsigned TableIndex, T Value) { + denormalizeString(Args, Spelling, SA, TableIndex, Twine(Value)); +} + +template +static Optional 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 normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags) { @@ -522,14 +549,6 @@ .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)) { diff --git a/llvm/include/llvm/Option/OptParser.td b/llvm/include/llvm/Option/OptParser.td --- a/llvm/include/llvm/Option/OptParser.td +++ b/llvm/include/llvm/Option/OptParser.td @@ -161,6 +161,12 @@ code Denormalizer = "denormalizeString"; } +class MarshallingInfoStringInt + : MarshallingInfo { + code Normalizer = "normalizeStringIntegral<"#type#">"; + code Denormalizer = "denormalizeString"; +} + class MarshallingInfoFlag : MarshallingInfo { code Normalizer = "normalizeSimpleFlag";