dang created this revision. dang added a reviewer: Bigcheese. Herald added subscribers: llvm-commits, cfe-commits, ASDenysPetrov, dkrupp, donat.nagy, Szelethus, dexonsmith, a.sidorin, baloghadamsoftware. Herald added projects: clang, LLVM.
Depends on D84185 <https://reviews.llvm.org/D84185> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84186 Files: clang/include/clang/Driver/Options.td 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 @@ -157,6 +157,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> : MarshallingInfo<keypath, defaultvalue> { code Normalizer = "normalizeSimpleFlag"; Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -90,6 +90,7 @@ #include <memory> #include <string> #include <tuple> +#include <type_traits> #include <utility> #include <vector> @@ -251,12 +252,30 @@ return std::string(Arg->getValue()); } +template <typename T> static void denormalizeString(SmallVectorImpl<const char *> &Args, const char *Spelling, CompilerInvocation::StringAllocator SA, - unsigned TableIndex, const std::string &Value) { + unsigned TableIndex, 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 TableIndex, + 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, @@ -487,10 +506,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); Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -4115,7 +4115,8 @@ HelpText<"Emit verbose output about the analyzer's progress">, MarshallingInfoFlag<"AnalyzerOpts->AnalyzerDisplayProgress", "false">; 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">, @@ -4142,7 +4143,8 @@ MarshallingInfoFlag<"AnalyzerOpts->NoRetryExhausted", "false">; 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", "false">;
Index: llvm/include/llvm/Option/OptParser.td =================================================================== --- llvm/include/llvm/Option/OptParser.td +++ llvm/include/llvm/Option/OptParser.td @@ -157,6 +157,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> : MarshallingInfo<keypath, defaultvalue> { code Normalizer = "normalizeSimpleFlag"; Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -90,6 +90,7 @@ #include <memory> #include <string> #include <tuple> +#include <type_traits> #include <utility> #include <vector> @@ -251,12 +252,30 @@ return std::string(Arg->getValue()); } +template <typename T> static void denormalizeString(SmallVectorImpl<const char *> &Args, const char *Spelling, CompilerInvocation::StringAllocator SA, - unsigned TableIndex, const std::string &Value) { + unsigned TableIndex, 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 TableIndex, + 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, @@ -487,10 +506,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); Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -4115,7 +4115,8 @@ HelpText<"Emit verbose output about the analyzer's progress">, MarshallingInfoFlag<"AnalyzerOpts->AnalyzerDisplayProgress", "false">; 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">, @@ -4142,7 +4143,8 @@ MarshallingInfoFlag<"AnalyzerOpts->NoRetryExhausted", "false">; 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", "false">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits