[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG0e07383433d0: [clang][cli] Generate and round-trip analyzer options (authored by jansvoboda11). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 Files: clang/include/clang/Driver/Options.td clang/lib/Frontend/CompilerInvocation.cpp Index: clang/lib/Frontend/CompilerInvocation.cpp === --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -760,9 +760,121 @@ Funcs.insert(Funcs.end(), Values.begin(), Values.end()); } -static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, - DiagnosticsEngine &Diags) { +static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, + SmallVectorImpl &Args, + CompilerInvocation::StringAllocator SA) { + const AnalyzerOptions *AnalyzerOpts = &Opts; + +#define ANALYZER_OPTION_WITH_MARSHALLING( \ +PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,\ +HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ +DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ +MERGER, EXTRACTOR, TABLE_INDEX)\ + GENERATE_OPTION_WITH_MARSHALLING(\ + Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,\ + IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX) +#include "clang/Driver/Options.inc" +#undef ANALYZER_OPTION_WITH_MARSHALLING + + if (Opts.AnalysisStoreOpt != RegionStoreModel) { +switch (Opts.AnalysisStoreOpt) { +#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_store, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis store."); +} + } + + if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) { +switch (Opts.AnalysisConstraintsOpt) { +#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_constraints, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis constraint."); +} + } + + if (Opts.AnalysisDiagOpt != PD_HTML) { +switch (Opts.AnalysisDiagOpt) { +#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ + case PD_##NAME: \ +GenerateArg(Args, OPT_analyzer_output, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis diagnostic client."); +} + } + + if (Opts.AnalysisPurgeOpt != PurgeStmt) { +switch (Opts.AnalysisPurgeOpt) { +#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_purge, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis purge mode."); +} + } + + if (Opts.InliningMode != NoRedundancy) { +switch (Opts.InliningMode) { +#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_inlining_mode, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis inlining mode."); +} + } + + for (const auto &CP : Opts.CheckersAndPackages) { +OptSpecifier Opt = +CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker; +GenerateArg(Args, Opt, CP.first, SA); + } + + AnalyzerOptions ConfigOpts; + parseAnalyzerConfigs(ConfigOpts, nullptr); + + for (const auto &C : Opts.Config) { +// Don't generate anything that came from parseAnalyzerConfigs. It would be +// redundant and may not be valid on the command line. +auto Entry = ConfigOpts.Config.find(C.getKey()); +if (Entry != ConfigOpts.Config.end() && Entry->getValue() == C.getValue()) + continue; + +GenerateA
[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
jansvoboda11 updated this revision to Diff 320343. jansvoboda11 added a comment. Rebase, rename original parse function Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 Files: clang/include/clang/Driver/Options.td clang/lib/Frontend/CompilerInvocation.cpp Index: clang/lib/Frontend/CompilerInvocation.cpp === --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -756,9 +756,121 @@ Funcs.insert(Funcs.end(), Values.begin(), Values.end()); } -static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, - DiagnosticsEngine &Diags) { +static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, + SmallVectorImpl &Args, + CompilerInvocation::StringAllocator SA) { + const AnalyzerOptions *AnalyzerOpts = &Opts; + +#define ANALYZER_OPTION_WITH_MARSHALLING( \ +PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,\ +HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ +DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ +MERGER, EXTRACTOR, TABLE_INDEX)\ + GENERATE_OPTION_WITH_MARSHALLING(\ + Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,\ + IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX) +#include "clang/Driver/Options.inc" +#undef ANALYZER_OPTION_WITH_MARSHALLING + + if (Opts.AnalysisStoreOpt != RegionStoreModel) { +switch (Opts.AnalysisStoreOpt) { +#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_store, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis store."); +} + } + + if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) { +switch (Opts.AnalysisConstraintsOpt) { +#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_constraints, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis constraint."); +} + } + + if (Opts.AnalysisDiagOpt != PD_HTML) { +switch (Opts.AnalysisDiagOpt) { +#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ + case PD_##NAME: \ +GenerateArg(Args, OPT_analyzer_output, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis diagnostic client."); +} + } + + if (Opts.AnalysisPurgeOpt != PurgeStmt) { +switch (Opts.AnalysisPurgeOpt) { +#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_purge, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis purge mode."); +} + } + + if (Opts.InliningMode != NoRedundancy) { +switch (Opts.InliningMode) { +#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_inlining_mode, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis inlining mode."); +} + } + + for (const auto &CP : Opts.CheckersAndPackages) { +OptSpecifier Opt = +CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker; +GenerateArg(Args, Opt, CP.first, SA); + } + + AnalyzerOptions ConfigOpts; + parseAnalyzerConfigs(ConfigOpts, nullptr); + + for (const auto &C : Opts.Config) { +// Don't generate anything that came from parseAnalyzerConfigs. It would be +// redundant and may not be valid on the command line. +auto Entry = ConfigOpts.Config.find(C.getKey()); +if (Entry != ConfigOpts.Config.end() && Entry->getValue() == C.getValue()) + continue; + +GenerateArg(Args, OPT_analyzer_config, C.getKey() + "=" + C.getValue(), SA); + } + + // Nothing to generate for FullCompilerInvocat
[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
dexonsmith added inline comments. Comment at: clang/lib/Frontend/CompilerInvocation.cpp:822 + static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { jansvoboda11 wrote: > dexonsmith wrote: > > Can you rename this `ParseAnalyzerArgsImpl` for better readability? > I left this unchanged to keep the diff (and merge conflicts) minimal. We > would rename it back to `ParseAnalyzerArgs` in a few weeks anyway (when we > drop granular round-tripping in favor of one big round-trip). I still have a preference for somehow varying the two names despite the minor churn — maybe the other one could be parseAnalyzerArgsWithRoundTrip — but it’s up to you (still LGTM as-is). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
jansvoboda11 added inline comments. Comment at: clang/lib/Frontend/CompilerInvocation.cpp:822 + static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { dexonsmith wrote: > Can you rename this `ParseAnalyzerArgsImpl` for better readability? I left this unchanged to keep the diff (and merge conflicts) minimal. We would rename it back to `ParseAnalyzerArgs` in a few weeks anyway (when we drop granular round-tripping in favor of one big round-trip). Comment at: clang/lib/Frontend/CompilerInvocation.cpp:1002 + + return RoundTrip(Parse, Generate, Swap, Res, Args, Diags, "AnalyzerOptions"); +} dexonsmith wrote: > I wonder if these lambdas could/should just be defined inline in the call to > `RoundTrip`, but up to you to decide. Why not, clang-format handles the inline lambdas pretty well. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
jansvoboda11 updated this revision to Diff 320118. jansvoboda11 added a comment. Rebase, inline lambdas Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 Files: clang/include/clang/Driver/Options.td clang/lib/Frontend/CompilerInvocation.cpp Index: clang/lib/Frontend/CompilerInvocation.cpp === --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -763,9 +763,108 @@ Funcs.insert(Funcs.end(), Values.begin(), Values.end()); } +static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, + SmallVectorImpl &Args, + CompilerInvocation::StringAllocator SA) { + const AnalyzerOptions *AnalyzerOpts = &Opts; + +#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, NO_PREFIX, __VA_ARGS__) +#include "clang/Driver/Options.inc" +#undef ANALYZER_OPTION_WITH_MARSHALLING + + if (Opts.AnalysisStoreOpt != RegionStoreModel) { +switch (Opts.AnalysisStoreOpt) { +#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_store, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis store."); +} + } + + if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) { +switch (Opts.AnalysisConstraintsOpt) { +#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ + case NAME##Model:\ +GenerateArg(Args, OPT_analyzer_constraints, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis constraint."); +} + } + + if (Opts.AnalysisDiagOpt != PD_HTML) { +switch (Opts.AnalysisDiagOpt) { +#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ + case PD_##NAME: \ +GenerateArg(Args, OPT_analyzer_output, CMDFLAG, SA); \ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis diagnostic client."); +} + } + + if (Opts.AnalysisPurgeOpt != PurgeStmt) { +switch (Opts.AnalysisPurgeOpt) { +#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_purge, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis purge mode."); +} + } + + if (Opts.InliningMode != NoRedundancy) { +switch (Opts.InliningMode) { +#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC)\ + case NAME: \ +GenerateArg(Args, OPT_analyzer_inlining_mode, CMDFLAG, SA);\ +break; +#include "clang/StaticAnalyzer/Core/Analyses.def" +default: + llvm_unreachable("Tried to generate unknown analysis inlining mode."); +} + } + + for (const auto &CP : Opts.CheckersAndPackages) { +OptSpecifier Opt = +CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker; +GenerateArg(Args, Opt, CP.first, SA); + } + + AnalyzerOptions ConfigOpts; + parseAnalyzerConfigs(ConfigOpts, nullptr); + + for (const auto &C : Opts.Config) { +// Don't generate anything that came from parseAnalyzerConfigs. It would be +// redundant and may not be valid on the command line. +auto Entry = ConfigOpts.Config.find(C.getKey()); +if (Entry != ConfigOpts.Config.end() && Entry->getValue() == C.getValue()) + continue; + +GenerateArg(Args, OPT_analyzer_config, C.getKey() + "=" + C.getValue(), SA); + } + + // Nothing to generate for FullCompilerInvocation. +} + static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { + AnalyzerOptions *AnalyzerOpts = &Opts; bool Success = true; + +#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, NO_PREFIX, __VA_ARGS__) +#include "clang/Driver/Options.inc" +#undef ANALYZER_OPTION_WITH_MARSHALLING + if (Arg *A = Args.getLastArg(OPT_analyzer_store)) { StringRef Name = A->getValue(); AnalysisStores Value = llvm::StringSwitch(Name) @@ -889,8 +988,10 @@ // TODO: Check checke
[PATCH] D95369: [clang][cli] Generate and round-trip analyzer options
dexonsmith accepted this revision. dexonsmith added a comment. This revision is now accepted and ready to land. LGTM. Comment at: clang/lib/Frontend/CompilerInvocation.cpp:822 + static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { Can you rename this `ParseAnalyzerArgsImpl` for better readability? Comment at: clang/lib/Frontend/CompilerInvocation.cpp:1002 + + return RoundTrip(Parse, Generate, Swap, Res, Args, Diags, "AnalyzerOptions"); +} I wonder if these lambdas could/should just be defined inline in the call to `RoundTrip`, but up to you to decide. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95369/new/ https://reviews.llvm.org/D95369 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits