class DiagnosticOpts<string base>
: KeyPathAndMacro<"DiagnosticOpts->", base, "DIAG_"> {}
class LangOpts<string base>
- : KeyPathAndMacro<"LangOpts->", base> {}
+ : KeyPathAndMacro<"LangOpts->", base, "LANG_"> {}
class TargetOpts<string base>
: KeyPathAndMacro<"TargetOpts->", base> {}
class FrontendOpts<string base>
class DependencyOutputOpts<string base>
: KeyPathAndMacro<"DependencyOutputOpts.", base> {}
class CodeGenOpts<string base>
- : KeyPathAndMacro<"CodeGenOpts.", base> {}
+ : KeyPathAndMacro<"CodeGenOpts.", base, "CODEGEN_"> {}
class HeaderSearchOpts<string base>
: KeyPathAndMacro<"HeaderSearchOpts->", base> {}
class PreprocessorOpts<string base>
Group<g_Group>;
}
+// Key paths that are constant during parsing of options with the same key path prefix.
+defvar open_cl = LangOpts<"OpenCL">;
+
/////////
// Options
def flat__namespace : Flag<["-"], "flat_namespace">;
def flax_vector_conversions_EQ : Joined<["-"], "flax-vector-conversions=">, Group<f_Group>,
HelpText<"Enable implicit vector bit-casts">, Values<"none,integer,all">, Flags<[CC1Option]>,
- NormalizedValuesScope<"LangOptions::LaxVectorConversionKind">,
- NormalizedValues<["None", "Integer", "All"]>,
- MarshallingInfoString<LangOpts<"LaxVectorConversions">, "All">, AutoNormalizeEnum;
+ NormalizedValues<["LangOptions::LaxVectorConversionKind::None",
+ "LangOptions::LaxVectorConversionKind::Integer",
+ "LangOptions::LaxVectorConversionKind::All"]>,
+ MarshallingInfoString<LangOpts<"LaxVectorConversions">,
+ !strconcat(open_cl.KeyPath, " ? LangOptions::LaxVectorConversionKind::None"
+ " : LangOptions::LaxVectorConversionKind::All")>,
+ AutoNormalizeEnum;
def flax_vector_conversions : Flag<["-"], "flax-vector-conversions">, Group<f_Group>,
Alias<flax_vector_conversions_EQ>, AliasArgs<["integer"]>;
def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, Group<f_Group>;
return KeyPath & Value;
}
+#define PARSE_OPTION_WITH_MARSHALLING(ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
+ IMPLIED_CHECK, IMPLIED_VALUE, \
+ NORMALIZER, MERGER, TABLE_INDEX) \
+ if ((FLAGS)&options::CC1Option) { \
+ KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
+ if (IMPLIED_CHECK) \
+ KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
+ if (SHOULD_PARSE) \
+ if (auto MaybeValue = \
+ NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
+ KEYPATH = \
+ MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
+ }
+
static void FixupInvocation(CompilerInvocation &Invocation,
DiagnosticsEngine &Diags,
const InputArgList &Args) {
InputKind IK,
DiagnosticsEngine &Diags,
const llvm::Triple &T,
- const std::string &OutputFile) {
+ const std::string &OutputFile,
+ const LangOptions &LangOptsRef) {
bool Success = true;
unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
}
Opts.OptimizationLevel = OptimizationLevel;
+ // The key paths of codegen options defined in Options.td start with
+ // "CodeGenOpts.". Let's provide the expected variable name and type.
+ CodeGenOptions &CodeGenOpts = Opts;
+ // Some codegen options depend on language options. Let's provide the expected
+ // variable name and type.
+ const LangOptions *LangOpts = &LangOptsRef;
+
+#define CODEGEN_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) \
+ PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
+ IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
+ MERGER, TABLE_INDEX)
+#include "clang/Driver/Options.inc"
+#undef CODEGEN_OPTION_WITH_MARSHALLING
+
// At O0 we want to fully disable inlining outside of cases marked with
// 'alwaysinline' that are required for correctness.
Opts.setInlining((Opts.OptimizationLevel == 0)
return Success;
}
-#define PARSE_OPTION_WITH_MARSHALLING(ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
- SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
- IMPLIED_CHECK, IMPLIED_VALUE, \
- NORMALIZER, MERGER, TABLE_INDEX) \
- if ((FLAGS)&options::CC1Option) { \
- KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
- if (IMPLIED_CHECK) \
- KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
- if (SHOULD_PARSE) \
- if (auto MaybeValue = \
- NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
- KEYPATH = \
- MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
- }
-
bool CompilerInvocation::parseSimpleArgs(const ArgList &Args,
DiagnosticsEngine &Diags) {
bool Success = true;
return Success;
}
-#undef PARSE_OPTION_WITH_MARSHALLING
-
/// Parse the argument to the -ftest-module-file-extension
/// command-line argument.
///
if (Opts.OpenCL) {
Opts.AltiVec = 0;
Opts.ZVector = 0;
- Opts.setLaxVectorConversions(LangOptions::LaxVectorConversionKind::None);
Opts.setDefaultFPContractMode(LangOptions::FPM_On);
Opts.NativeHalfType = 1;
Opts.NativeHalfArgsAndReturns = 1;
CompilerInvocation::setLangDefaults(Opts, IK, T, Includes, LangStd);
+ // The key paths of codegen options defined in Options.td start with
+ // "LangOpts->". Let's provide the expected variable name and type.
+ LangOptions *LangOpts = &Opts;
+ bool Success = true;
+
+#define LANG_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) \
+ PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
+ IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
+ MERGER, TABLE_INDEX)
+#include "clang/Driver/Options.inc"
+#undef LANG_OPTION_WITH_MARSHALLING
+
if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
StringRef Name = A->getValue();
if (Name == "full" || Name == "branch") {
LangOpts.IsHeaderFile);
ParseTargetArgs(Res.getTargetOpts(), Args, Diags);
llvm::Triple T(Res.getTargetOpts().Triple);
- Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T,
- Res.getFrontendOpts().OutputFile);
ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args,
Res.getFileSystemOpts().WorkingDir);
if (DashX.getFormat() == InputKind::Precompiled ||
if (LangOpts.OpenMPIsDevice)
Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple;
+ Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T,
+ Res.getFrontendOpts().OutputFile, LangOpts);
+
// FIXME: Override value name discarding when asan or msan is used because the
// backend passes depend on the name of the alloca in order to print out
// names.
EXTRACTOR, TABLE_INDEX)
#define DIAG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
+#define LANG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
+#define CODEGEN_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
#include "clang/Driver/Options.inc"
+#undef CODEGEN_OPTION_WITH_MARSHALLING
+#undef LANG_OPTION_WITH_MARSHALLING
#undef DIAG_OPTION_WITH_MARSHALLING
#undef OPTION_WITH_MARSHALLING
#undef GENERATE_OPTION_WITH_MARSHALLING