dang updated this revision to Diff 281614.
dang added a comment.
Ensure that the default value is assigned even if the option should not get
parsed.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84674/new/
https://reviews.llvm.org/D84674
Files:
clang/include/clang/Driver/Options.td
clang/lib/Frontend/CompilerInvocation.cpp
llvm/include/llvm/Option/OptParser.td
llvm/utils/TableGen/OptParserEmitter.cpp
Index: llvm/utils/TableGen/OptParserEmitter.cpp
===================================================================
--- llvm/utils/TableGen/OptParserEmitter.cpp
+++ llvm/utils/TableGen/OptParserEmitter.cpp
@@ -66,6 +66,7 @@
const char *MacroName;
const Record &R;
bool ShouldAlwaysEmit;
+ StringRef ShouldParse;
StringRef KeyPath;
StringRef DefaultValue;
StringRef NormalizedValuesScope;
@@ -107,6 +108,8 @@
OS << ", ";
OS << ShouldAlwaysEmit;
OS << ", ";
+ OS << ShouldParse;
+ OS << ", ";
OS << KeyPath;
OS << ", ";
emitScopedNormalizedValue(OS, DefaultValue);
@@ -194,6 +197,7 @@
}
Ret->ShouldAlwaysEmit = R.getValueAsBit("ShouldAlwaysEmit");
+ Ret->ShouldParse = R.getValueAsString("ShouldParse");
Ret->KeyPath = R.getValueAsString("KeyPath");
Ret->DefaultValue = R.getValueAsString("DefaultValue");
Ret->NormalizedValuesScope = R.getValueAsString("NormalizedValuesScope");
Index: llvm/include/llvm/Option/OptParser.td
===================================================================
--- llvm/include/llvm/Option/OptParser.td
+++ llvm/include/llvm/Option/OptParser.td
@@ -102,6 +102,7 @@
code KeyPath = ?;
code DefaultValue = ?;
bit ShouldAlwaysEmit = 0;
+ code ShouldParse = "true";
code NormalizedValuesScope = "";
code Normalizer = "";
code Denormalizer = "";
@@ -201,6 +202,7 @@
class ValueMerger<code merger> { code ValueMerger = merger; }
class ValueExtractor<code extractor> { code ValueExtractor = extractor; }
class DiagnosticArg { bit IsDiagnosticArg = 1; }
+class ShouldParseIf<code shouldparse> { code ShouldParse = shouldparse; }
// Predefined options.
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -1260,29 +1260,25 @@
#define DIAG_OPTION_WITH_MARSHALLING( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
- { \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
+ Opts.KEYPATH = MERGER(Opts.KEYPATH, DEFAULT_VALUE); \
+ if (SHOULD_PARSE) \
if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, Args, Diags)) \
Opts.KEYPATH = MERGER(Opts.KEYPATH, \
- static_cast<decltype(Opts.KEYPATH)>(*MaybeValue)); \
- else \
- Opts.KEYPATH = MERGER(Opts.KEYPATH, DEFAULT_VALUE); \
- }
+ static_cast<decltype(Opts.KEYPATH)>(*MaybeValue));
#define DIAG_OPTION_WITH_MARSHALLING_BOOLEAN( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID, \
- NEG_SPELLING) \
- { \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, \
+ NEG_ID, NEG_SPELLING) \
+ Opts.KEYPATH = MERGER(Opts.KEYPATH, DEFAULT_VALUE); \
+ if (SHOULD_PARSE) \
if (auto MaybeValue = \
NORMALIZER(OPT_##ID, OPT_##NEG_ID, TABLE_INDEX, Args, Diags)) \
Opts.KEYPATH = MERGER(Opts.KEYPATH, \
- static_cast<decltype(Opts.KEYPATH)>(*MaybeValue)); \
- else \
- Opts.KEYPATH = MERGER(Opts.KEYPATH, DEFAULT_VALUE); \
- }
+ static_cast<decltype(Opts.KEYPATH)>(*MaybeValue));
#include "clang/Driver/Options.inc"
#undef DIAG_OPTION_WITH_MARSHALLING_BOOLEAN
@@ -2065,21 +2061,6 @@
}
Opts.SYCLIsDevice = Opts.SYCL && Args.hasArg(options::OPT_fsycl_is_device);
- if (Opts.SYCL) {
- // -sycl-std applies to any SYCL source, not only those containing kernels,
- // but also those using the SYCL API
- if (const Arg *A = Args.getLastArg(OPT_sycl_std_EQ)) {
- Opts.SYCLVersion = llvm::StringSwitch<unsigned>(A->getValue())
- .Cases("2017", "1.2.1", "121", "sycl-1.2.1", 2017)
- .Default(0U);
-
- if (Opts.SYCLVersion == 0U) {
- // User has passed an invalid value to the flag, this is an error
- Diags.Report(diag::err_drv_invalid_value)
- << A->getAsString(Args) << A->getValue();
- }
- }
- }
llvm::Triple T(TargetOpts.Triple);
CompilerInvocation::setLangDefaults(Opts, IK, T, PPOpts, LangStd);
@@ -2720,29 +2701,25 @@
DiagnosticsEngine &Diags) {
#define OPTION_WITH_MARSHALLING( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
- { \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
+ this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE); \
+ if (SHOULD_PARSE) \
if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, Args, &Diags)) \
this->KEYPATH = MERGER( \
- this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue)); \
- else \
- this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE); \
- }
+ this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue));
#define OPTION_WITH_MARSHALLING_BOOLEAN( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID, \
- NEG_SPELLING) \
- { \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, \
+ NEG_ID, NEG_SPELLING) \
+ this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE); \
+ if (SHOULD_PARSE) \
if (auto MaybeValue = \
NORMALIZER(OPT_##ID, OPT_##NEG_ID, TABLE_INDEX, Args, &Diags)) \
this->KEYPATH = MERGER( \
- this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue)); \
- else \
- this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE); \
- }
+ this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue));
#include "clang/Driver/Options.inc"
#undef OPTION_WITH_MARSHALLING_BOOLEAN
@@ -2988,8 +2965,8 @@
SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
#define OPTION_WITH_MARSHALLING( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
if ((FLAGS)&options::CC1Option) { \
const auto &Extracted = EXTRACTOR(this->KEYPATH); \
if (ALWAYS_EMIT || \
@@ -3000,9 +2977,9 @@
#define OPTION_WITH_MARSHALLING_BOOLEAN( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID, \
- NEG_SPELLING) \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, \
+ NEG_ID, NEG_SPELLING) \
if ((FLAGS)&options::CC1Option) { \
const auto &Extracted = EXTRACTOR(this->KEYPATH); \
if (ALWAYS_EMIT || \
@@ -3012,22 +2989,22 @@
#define DIAG_OPTION_WITH_MARSHALLING( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
OPTION_WITH_MARSHALLING(PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, \
ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, \
- SPELLING, ALWAYS_EMIT, DiagnosticOpts->KEYPATH, \
- DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, \
- EXTRACTOR, TABLE_INDEX)
+ SPELLING, ALWAYS_EMIT, SHOULD_PARSE, \
+ DiagnosticOpts->KEYPATH, DEFAULT_VALUE, NORMALIZER, \
+ DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX)
#define DIAG_OPTION_WITH_MARSHALLING_BOOLEAN( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
- NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID, \
- NEG_SPELLING) \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, KEYPATH, \
+ DEFAULT_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, \
+ NEG_ID, NEG_SPELLING) \
OPTION_WITH_MARSHALLING_BOOLEAN( \
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, \
+ HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, SHOULD_PARSE, \
DiagnosticOpts->KEYPATH, DEFAULT_VALUE, NORMALIZER, DENORMALIZER, \
MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID, NEG_SPELLING)
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -1700,6 +1700,11 @@
// Should this actually be enforced in CC1
HelpText<"Force double to be 32 bits or 64 bits">,
MarshallingInfoStringInt<"LangOpts->DoubleSize", "0">;
+def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group<sycl_Group>, Flags<[CC1Option, NoArgumentUnused, CoreOption]>,
+ HelpText<"SYCL language standard to compile for.">, Values<"2017,121,1.2.1,sycl-1.2.1">,
+ MarshallingInfoString<"LangOpts->SYCLVersion", "0">,
+ NormalizedValues<["2017", "2017", "2017", "2017"]>, AutoNormalizeEnum,
+ ShouldParseIf<"LangOpts->SYCL">;
let Flags = [CC1Option, CC1AsOption, NoDriverOption] in {
@@ -4375,10 +4380,6 @@
defm underscoring : BooleanFFlag<"underscoring">, Group<gfortran_Group>;
defm whole_file : BooleanFFlag<"whole-file">, Group<gfortran_Group>;
-// C++ SYCL options
-def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group<sycl_Group>, Flags<[CC1Option, NoArgumentUnused, CoreOption]>,
- HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">;
-
//===----------------------------------------------------------------------===//
// CC1 Options
//===----------------------------------------------------------------------===//
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits