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
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to