@@ -385,6 +385,21 @@ static T extractMaskValue(T KeyPath) {
385
385
return KeyPath & Value;
386
386
}
387
387
388
+ #define PARSE_OPTION_WITH_MARSHALLING (ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
389
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
390
+ IMPLIED_CHECK, IMPLIED_VALUE, \
391
+ NORMALIZER, MERGER, TABLE_INDEX) \
392
+ if ((FLAGS)&options::CC1Option) { \
393
+ KEYPATH = MERGER (KEYPATH, DEFAULT_VALUE); \
394
+ if (IMPLIED_CHECK) \
395
+ KEYPATH = MERGER (KEYPATH, IMPLIED_VALUE); \
396
+ if (SHOULD_PARSE) \
397
+ if (auto MaybeValue = \
398
+ NORMALIZER (OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
399
+ KEYPATH = \
400
+ MERGER (KEYPATH, static_cast <decltype (KEYPATH)>(*MaybeValue)); \
401
+ }
402
+
388
403
static void FixupInvocation (CompilerInvocation &Invocation,
389
404
DiagnosticsEngine &Diags,
390
405
const InputArgList &Args) {
@@ -911,7 +926,8 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
911
926
InputKind IK,
912
927
DiagnosticsEngine &Diags,
913
928
const llvm::Triple &T,
914
- const std::string &OutputFile) {
929
+ const std::string &OutputFile,
930
+ const LangOptions &LangOptsRef) {
915
931
bool Success = true ;
916
932
917
933
unsigned OptimizationLevel = getOptimizationLevel (Args, IK, Diags);
@@ -926,6 +942,25 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
926
942
}
927
943
Opts.OptimizationLevel = OptimizationLevel;
928
944
945
+ // The key paths of codegen options defined in Options.td start with
946
+ // "CodeGenOpts.". Let's provide the expected variable name and type.
947
+ CodeGenOptions &CodeGenOpts = Opts;
948
+ // Some codegen options depend on language options. Let's provide the expected
949
+ // variable name and type.
950
+ const LangOptions *LangOpts = &LangOptsRef;
951
+
952
+ #define CODEGEN_OPTION_WITH_MARSHALLING ( \
953
+ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
954
+ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
955
+ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
956
+ MERGER, EXTRACTOR, TABLE_INDEX) \
957
+ PARSE_OPTION_WITH_MARSHALLING (Args, Diags, Success, ID, FLAGS, PARAM, \
958
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
959
+ IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
960
+ MERGER, TABLE_INDEX)
961
+ #include " clang/Driver/Options.inc"
962
+ #undef CODEGEN_OPTION_WITH_MARSHALLING
963
+
929
964
// At O0 we want to fully disable inlining outside of cases marked with
930
965
// 'alwaysinline' that are required for correctness.
931
966
Opts.setInlining ((Opts.OptimizationLevel == 0 )
@@ -1367,21 +1402,6 @@ static bool checkVerifyPrefixes(const std::vector<std::string> &VerifyPrefixes,
1367
1402
return Success;
1368
1403
}
1369
1404
1370
- #define PARSE_OPTION_WITH_MARSHALLING (ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
1371
- SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
1372
- IMPLIED_CHECK, IMPLIED_VALUE, \
1373
- NORMALIZER, MERGER, TABLE_INDEX) \
1374
- if ((FLAGS)&options::CC1Option) { \
1375
- KEYPATH = MERGER (KEYPATH, DEFAULT_VALUE); \
1376
- if (IMPLIED_CHECK) \
1377
- KEYPATH = MERGER (KEYPATH, IMPLIED_VALUE); \
1378
- if (SHOULD_PARSE) \
1379
- if (auto MaybeValue = \
1380
- NORMALIZER (OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
1381
- KEYPATH = \
1382
- MERGER (KEYPATH, static_cast <decltype (KEYPATH)>(*MaybeValue)); \
1383
- }
1384
-
1385
1405
bool CompilerInvocation::parseSimpleArgs (const ArgList &Args,
1386
1406
DiagnosticsEngine &Diags) {
1387
1407
bool Success = true ;
@@ -1468,8 +1488,6 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
1468
1488
return Success;
1469
1489
}
1470
1490
1471
- #undef PARSE_OPTION_WITH_MARSHALLING
1472
-
1473
1491
// / Parse the argument to the -ftest-module-file-extension
1474
1492
// / command-line argument.
1475
1493
// /
@@ -1997,7 +2015,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
1997
2015
if (Opts.OpenCL ) {
1998
2016
Opts.AltiVec = 0 ;
1999
2017
Opts.ZVector = 0 ;
2000
- Opts.setLaxVectorConversions (LangOptions::LaxVectorConversionKind::None);
2001
2018
Opts.setDefaultFPContractMode (LangOptions::FPM_On);
2002
2019
Opts.NativeHalfType = 1 ;
2003
2020
Opts.NativeHalfArgsAndReturns = 1 ;
@@ -2226,6 +2243,23 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
2226
2243
2227
2244
CompilerInvocation::setLangDefaults (Opts, IK, T, Includes, LangStd);
2228
2245
2246
+ // The key paths of codegen options defined in Options.td start with
2247
+ // "LangOpts->". Let's provide the expected variable name and type.
2248
+ LangOptions *LangOpts = &Opts;
2249
+ bool Success = true ;
2250
+
2251
+ #define LANG_OPTION_WITH_MARSHALLING ( \
2252
+ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
2253
+ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
2254
+ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
2255
+ MERGER, EXTRACTOR, TABLE_INDEX) \
2256
+ PARSE_OPTION_WITH_MARSHALLING (Args, Diags, Success, ID, FLAGS, PARAM, \
2257
+ SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
2258
+ IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
2259
+ MERGER, TABLE_INDEX)
2260
+ #include " clang/Driver/Options.inc"
2261
+ #undef LANG_OPTION_WITH_MARSHALLING
2262
+
2229
2263
if (const Arg *A = Args.getLastArg (OPT_fcf_protection_EQ)) {
2230
2264
StringRef Name = A->getValue ();
2231
2265
if (Name == " full" || Name == " branch" ) {
@@ -2959,8 +2993,6 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
2959
2993
LangOpts.IsHeaderFile );
2960
2994
ParseTargetArgs (Res.getTargetOpts (), Args, Diags);
2961
2995
llvm::Triple T (Res.getTargetOpts ().Triple );
2962
- Success &= ParseCodeGenArgs (Res.getCodeGenOpts (), Args, DashX, Diags, T,
2963
- Res.getFrontendOpts ().OutputFile );
2964
2996
ParseHeaderSearchArgs (Res.getHeaderSearchOpts (), Args,
2965
2997
Res.getFileSystemOpts ().WorkingDir );
2966
2998
if (DashX.getFormat () == InputKind::Precompiled ||
@@ -3002,6 +3034,9 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
3002
3034
if (LangOpts.OpenMPIsDevice )
3003
3035
Res.getTargetOpts ().HostTriple = Res.getFrontendOpts ().AuxTriple ;
3004
3036
3037
+ Success &= ParseCodeGenArgs (Res.getCodeGenOpts (), Args, DashX, Diags, T,
3038
+ Res.getFrontendOpts ().OutputFile , LangOpts);
3039
+
3005
3040
// FIXME: Override value name discarding when asan or msan is used because the
3006
3041
// backend passes depend on the name of the alloca in order to print out
3007
3042
// names.
@@ -3179,9 +3214,13 @@ void CompilerInvocation::generateCC1CommandLine(
3179
3214
EXTRACTOR, TABLE_INDEX)
3180
3215
3181
3216
#define DIAG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
3217
+ #define LANG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
3218
+ #define CODEGEN_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
3182
3219
3183
3220
#include " clang/Driver/Options.inc"
3184
3221
3222
+ #undef CODEGEN_OPTION_WITH_MARSHALLING
3223
+ #undef LANG_OPTION_WITH_MARSHALLING
3185
3224
#undef DIAG_OPTION_WITH_MARSHALLING
3186
3225
#undef OPTION_WITH_MARSHALLING
3187
3226
#undef GENERATE_OPTION_WITH_MARSHALLING
0 commit comments