[PATCH] D84186: Convert Analyzer option string based options to new option parsing system
Daniel Grumberg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 20 10:02:42 PDT 2020
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">;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84186.279292.patch
Type: text/x-patch
Size: 4124 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200720/b03783eb/attachment.bin>
More information about the llvm-commits
mailing list