jansvoboda11 updated this revision to Diff 311527. jansvoboda11 added a comment.
Rebase, remove `InlineMaxStackDepth` initialization from `AnalyzerOptions.h` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84186/new/ https://reviews.llvm.org/D84186 Files: clang/include/clang/Driver/Options.td clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h clang/lib/Frontend/CompilerInvocation.cpp llvm/include/llvm/Option/OptParser.td
Index: llvm/include/llvm/Option/OptParser.td =================================================================== --- llvm/include/llvm/Option/OptParser.td +++ llvm/include/llvm/Option/OptParser.td @@ -161,6 +161,12 @@ 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"; Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -93,6 +93,7 @@ #include <memory> #include <string> #include <tuple> +#include <type_traits> #include <utility> #include <vector> @@ -281,12 +282,29 @@ return std::string(Arg->getValue()); } -static void denormalizeString(SmallVectorImpl<const char *> &Args, - const char *Spelling, - CompilerInvocation::StringAllocator SA, - unsigned TableIndex, const std::string &Value) { +template <typename T> +static void +denormalizeString(SmallVectorImpl<const char *> &Args, const char *Spelling, + CompilerInvocation::StringAllocator SA, unsigned, T &&Value) { + static_assert(std::is_constructible<Twine, T>::value, + "Cannot convert this value to Twine"); Args.push_back(Spelling); - Args.push_back(SA(Value)); + Args.push_back(SA(Twine(std::forward<T>(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, @@ -507,14 +525,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)) { Index: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ 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; Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -3990,7 +3990,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<analyze_function>; def trim_egraph : Flag<["-"], "trim-egraph">, HelpText<"Only show error-related paths in the analysis graph">, @@ -4004,7 +4005,9 @@ 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>; @@ -4017,7 +4020,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">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits