Skip to content

Commit ed6b605

Browse files
committed
Merge from 'main' to 'sycl-web' (#2)
CONFLICT (content): Merge conflict in clang/lib/Frontend/CompilerInvocation.cpp CONFLICT (content): Merge conflict in clang/include/clang/Driver/Options.td
2 parents 23cab0b + d0fa7a0 commit ed6b605

File tree

6 files changed

+92
-88
lines changed

6 files changed

+92
-88
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4162,9 +4162,7 @@ defm sycl : BoolOption<"sycl",
41624162
BothFlags<[CoreOption], " SYCL kernels compilation for device">, "f">,
41634163
Group<sycl_Group>;
41644164
def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group<sycl_Group>, Flags<[CC1Option, NoArgumentUnused, CoreOption]>,
4165-
HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">,
4166-
NormalizedValues<["SYCL_2017", "SYCL_2017", "SYCL_2017", "SYCL_2017"]>, NormalizedValuesScope<"LangOptions">,
4167-
MarshallingInfoString<"LangOpts->SYCLVersion", "SYCL_None">, ShouldParseIf<fsycl.KeyPath>, AutoNormalizeEnum;
4165+
HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">;
41684166
def fsycl_esimd : Flag<["-"], "fsycl-explicit-simd">, Group<sycl_Group>, Flags<[CC1Option, NoArgumentUnused, CoreOption]>,
41694167
HelpText<"Enable SYCL explicit SIMD extension">;
41704168
def fno_sycl_esimd : Flag<["-"], "fno-sycl-explicit-simd">, Group<sycl_Group>,

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,21 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
22992299
Opts.SYCLStdLayoutKernelParams =
23002300
Args.hasArg(options::OPT_fsycl_std_layout_kernel_params);
23012301
Opts.SYCLUnnamedLambda = Args.hasArg(options::OPT_fsycl_unnamed_lambda);
2302+
// -sycl-std applies to any SYCL source, not only those containing kernels,
2303+
// but also those using the SYCL API
2304+
if (const Arg *A = Args.getLastArg(OPT_sycl_std_EQ)) {
2305+
Opts.setSYCLVersion(
2306+
llvm::StringSwitch<LangOptions::SYCLMajorVersion>(A->getValue())
2307+
.Cases("2017", "1.2.1", "121", "sycl-1.2.1",
2308+
LangOptions::SYCL_2017)
2309+
.Default(LangOptions::SYCL_None));
2310+
2311+
if (Opts.getSYCLVersion() == LangOptions::SYCL_None) {
2312+
// User has passed an invalid value to the flag, this is an error
2313+
Diags.Report(diag::err_drv_invalid_value)
2314+
<< A->getAsString(Args) << A->getValue();
2315+
}
2316+
}
23022317
Opts.SYCLExplicitSIMD = Args.hasArg(options::OPT_fsycl_esimd);
23032318
Opts.EnableDAEInSpirKernels = Args.hasArg(options::OPT_fenable_sycl_dae);
23042319
Opts.SYCLValueFitInMaxInt =
@@ -3013,17 +3028,16 @@ bool CompilerInvocation::parseSimpleArgs(const ArgList &Args,
30133028
DiagnosticsEngine &Diags) {
30143029
#define OPTION_WITH_MARSHALLING( \
30153030
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
3016-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
3017-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
3018-
MERGER, EXTRACTOR, TABLE_INDEX) \
3031+
HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
3032+
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
3033+
TABLE_INDEX) \
30193034
if ((FLAGS)&options::CC1Option) { \
30203035
this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE); \
30213036
if (IMPLIED_CHECK) \
30223037
this->KEYPATH = MERGER(this->KEYPATH, IMPLIED_VALUE); \
3023-
if (SHOULD_PARSE) \
3024-
if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, Args, Diags)) \
3025-
this->KEYPATH = MERGER( \
3026-
this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue)); \
3038+
if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, Args, Diags)) \
3039+
this->KEYPATH = MERGER( \
3040+
this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue)); \
30273041
}
30283042

30293043
#include "clang/Driver/Options.inc"
@@ -3280,9 +3294,9 @@ void CompilerInvocation::generateCC1CommandLine(
32803294
// with lifetime extension of the reference.
32813295
#define OPTION_WITH_MARSHALLING( \
32823296
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
3283-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
3284-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
3285-
MERGER, EXTRACTOR, TABLE_INDEX) \
3297+
HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
3298+
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
3299+
TABLE_INDEX) \
32863300
if ((FLAGS)&options::CC1Option) { \
32873301
[&](const auto &Extracted) { \
32883302
if (ALWAYS_EMIT || \

clang/unittests/Frontend/CompilerInvocationTest.cpp

Lines changed: 64 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,61 @@ class CommandLineTest : public ::testing::Test {
3939
}
4040
};
4141

42+
template <typename M>
43+
std::string describeContainsN(M InnerMatcher, unsigned N, bool Negation) {
44+
StringRef Contains = Negation ? "doesn't contain" : "contains";
45+
StringRef Instance = N == 1 ? " instance " : " instances ";
46+
StringRef Element = "of element that ";
47+
48+
std::ostringstream Inner;
49+
InnerMatcher.impl().DescribeTo(&Inner);
50+
51+
return (Contains + " exactly " + Twine(N) + Instance + Element + Inner.str())
52+
.str();
53+
}
54+
55+
MATCHER_P2(ContainsN, InnerMatcher, N,
56+
describeContainsN(InnerMatcher, N, negation)) {
57+
auto InnerMatches = [this](const auto &Element) {
58+
::testing::internal::DummyMatchResultListener InnerListener;
59+
return InnerMatcher.impl().MatchAndExplain(Element, &InnerListener);
60+
};
61+
62+
return count_if(arg, InnerMatches) == N;
63+
}
64+
65+
TEST(ContainsN, Empty) {
66+
const char *Array[] = {""};
67+
68+
ASSERT_THAT(Array, ContainsN(StrEq("x"), 0));
69+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 1)));
70+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 2)));
71+
}
72+
73+
TEST(ContainsN, Zero) {
74+
const char *Array[] = {"y"};
75+
76+
ASSERT_THAT(Array, ContainsN(StrEq("x"), 0));
77+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 1)));
78+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 2)));
79+
}
80+
81+
TEST(ContainsN, One) {
82+
const char *Array[] = {"a", "b", "x", "z"};
83+
84+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 0)));
85+
ASSERT_THAT(Array, ContainsN(StrEq("x"), 1));
86+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 2)));
87+
}
88+
89+
TEST(ContainsN, Two) {
90+
const char *Array[] = {"x", "a", "b", "x"};
91+
92+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 0)));
93+
ASSERT_THAT(Array, Not(ContainsN(StrEq("x"), 1)));
94+
ASSERT_THAT(Array, ContainsN(StrEq("x"), 2));
95+
}
96+
4297
// Boolean option with a keypath that defaults to true.
4398
// The only flag with a negative spelling can set the keypath to false.
4499

@@ -270,7 +325,7 @@ TEST_F(CommandLineTest, BoolOptionCC1ViaLetPresentPos) {
270325

271326
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
272327

273-
ASSERT_EQ(count(GeneratedArgs, StringRef("-fdebug-pass-manager")), 1);
328+
ASSERT_THAT(GeneratedArgs, ContainsN(StrEq("-fdebug-pass-manager"), 1));
274329
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fno-debug-pass-manager"))));
275330
}
276331

@@ -418,7 +473,8 @@ TEST_F(CommandLineTest, StringVectorEmpty) {
418473
ASSERT_TRUE(Invocation.getFrontendOpts().ModuleMapFiles.empty());
419474

420475
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
421-
ASSERT_THAT(GeneratedArgs, Not(Contains(HasSubstr("-fmodule-map-file="))));
476+
477+
ASSERT_THAT(GeneratedArgs, Not(Contains(HasSubstr("-fmodule-map-file"))));
422478
}
423479

424480
TEST_F(CommandLineTest, StringVectorSingle) {
@@ -431,7 +487,9 @@ TEST_F(CommandLineTest, StringVectorSingle) {
431487
std::vector<std::string>({"a"}));
432488

433489
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
434-
ASSERT_EQ(count(GeneratedArgs, StringRef("-fmodule-map-file=a")), 1);
490+
491+
ASSERT_THAT(GeneratedArgs, ContainsN(StrEq("-fmodule-map-file=a"), 1));
492+
ASSERT_THAT(GeneratedArgs, ContainsN(HasSubstr("-fmodule-map-file"), 1));
435493
}
436494

437495
TEST_F(CommandLineTest, StringVectorMultiple) {
@@ -443,71 +501,11 @@ TEST_F(CommandLineTest, StringVectorMultiple) {
443501
ASSERT_TRUE(Invocation.getFrontendOpts().ModuleMapFiles ==
444502
std::vector<std::string>({"a", "b"}));
445503

446-
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
447-
ASSERT_EQ(count(GeneratedArgs, StringRef("-fmodule-map-file=a")), 1);
448-
ASSERT_EQ(count(GeneratedArgs, StringRef("-fmodule-map-file=b")), 1);
449-
}
450-
451-
// A flag that should be parsed only if a condition is met.
452-
453-
TEST_F(CommandLineTest, ConditionalParsingIfFalseFlagNotPresent) {
454-
const char *Args[] = {""};
455-
456-
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
457-
458-
ASSERT_FALSE(Diags->hasErrorOccurred());
459-
ASSERT_FALSE(Invocation.getLangOpts()->SYCL);
460-
ASSERT_EQ(Invocation.getLangOpts()->getSYCLVersion(), LangOptions::SYCL_None);
461-
462-
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
463-
464-
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fsycl"))));
465-
ASSERT_THAT(GeneratedArgs, Not(Contains(HasSubstr("-sycl-std="))));
466-
}
467-
468-
TEST_F(CommandLineTest, ConditionalParsingIfFalseFlagPresent) {
469-
const char *Args[] = {"-sycl-std=2017"};
470-
471-
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
472-
473-
ASSERT_FALSE(Diags->hasErrorOccurred());
474-
ASSERT_FALSE(Invocation.getLangOpts()->SYCL);
475-
ASSERT_EQ(Invocation.getLangOpts()->getSYCLVersion(), LangOptions::SYCL_None);
476-
477-
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
478-
479-
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fsycl"))));
480-
ASSERT_THAT(GeneratedArgs, Not(Contains(HasSubstr("-sycl-std="))));
481-
}
482-
483-
TEST_F(CommandLineTest, ConditionalParsingIfTrueFlagNotPresent) {
484-
const char *Args[] = {"-fsycl"};
485-
486-
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
487-
488-
ASSERT_FALSE(Diags->hasErrorOccurred());
489-
ASSERT_TRUE(Invocation.getLangOpts()->SYCL);
490-
ASSERT_EQ(Invocation.getLangOpts()->getSYCLVersion(), LangOptions::SYCL_None);
491-
492-
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
493-
494-
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fsycl")));
495-
ASSERT_THAT(GeneratedArgs, Not(Contains(HasSubstr("-sycl-std="))));
496-
}
497-
498-
TEST_F(CommandLineTest, ConditionalParsingIfTrueFlagPresent) {
499-
const char *Args[] = {"-fsycl", "-sycl-std=2017"};
500-
501-
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
502-
503-
ASSERT_FALSE(Diags->hasErrorOccurred());
504-
ASSERT_TRUE(Invocation.getLangOpts()->SYCL);
505-
ASSERT_EQ(Invocation.getLangOpts()->getSYCLVersion(), LangOptions::SYCL_2017);
506-
507504
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
508505

509-
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fsycl")));
510-
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-sycl-std=2017")));
506+
ASSERT_THAT(GeneratedArgs, ContainsN(StrEq("-fmodule-map-file=a"), 1));
507+
ASSERT_THAT(GeneratedArgs, ContainsN(StrEq("-fmodule-map-file=b"), 1));
508+
ASSERT_THAT(GeneratedArgs, ContainsN(HasSubstr("-fmodule-map-file"), 2));
511509
}
512510

513511
// Wide integer option.

llvm/include/llvm/Option/OptParser.td

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ class Option<list<string> prefixes, string name, OptionKind kind> {
101101
code DefaultValue = ?;
102102
code ImpliedValue = ?;
103103
code ImpliedCheck = "false";
104-
code ShouldParse = "true";
105104
bit ShouldAlwaysEmit = false;
106105
code NormalizerRetTy = ?;
107106
code NormalizedValuesScope = "";
@@ -203,7 +202,6 @@ class MarshallingInfoBooleanFlag<code keypath, code defaultvalue, code value, co
203202

204203
// Mixins for additional marshalling attributes.
205204

206-
class ShouldParseIf<code condition> { code ShouldParse = condition; }
207205
class AlwaysEmit { bit ShouldAlwaysEmit = true; }
208206
class Normalizer<code normalizer> { code Normalizer = normalizer; }
209207
class Denormalizer<code denormalizer> { code Denormalizer = denormalizer; }

llvm/unittests/Option/OptionMarshallingTest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ struct OptionWithMarshallingInfo {
1818
static const OptionWithMarshallingInfo MarshallingTable[] = {
1919
#define OPTION_WITH_MARSHALLING( \
2020
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
21-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
22-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
23-
MERGER, EXTRACTOR, TABLE_INDEX) \
21+
HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
22+
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
23+
TABLE_INDEX) \
2424
{NAME, #KEYPATH, #IMPLIED_CHECK, #IMPLIED_VALUE},
2525
#include "Opts.inc"
2626
#undef OPTION_WITH_MARSHALLING

llvm/utils/TableGen/OptParserEmitter.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ class MarshallingInfo {
7171
StringRef NormalizedValuesScope;
7272
StringRef ImpliedCheck;
7373
StringRef ImpliedValue;
74-
StringRef ShouldParse;
7574
StringRef Normalizer;
7675
StringRef Denormalizer;
7776
StringRef ValueMerger;
@@ -103,8 +102,6 @@ struct SimpleEnumValueTable {
103102
void emit(raw_ostream &OS) const {
104103
write_cstring(OS, StringRef(getOptionSpelling(R)));
105104
OS << ", ";
106-
OS << ShouldParse;
107-
OS << ", ";
108105
OS << ShouldAlwaysEmit;
109106
OS << ", ";
110107
OS << KeyPath;
@@ -170,7 +167,6 @@ static MarshallingInfo createMarshallingInfo(const Record &R) {
170167
Ret.ImpliedValue =
171168
R.getValueAsOptionalString("ImpliedValue").getValueOr(Ret.DefaultValue);
172169

173-
Ret.ShouldParse = R.getValueAsString("ShouldParse");
174170
Ret.Normalizer = R.getValueAsString("Normalizer");
175171
Ret.Denormalizer = R.getValueAsString("Denormalizer");
176172
Ret.ValueMerger = R.getValueAsString("ValueMerger");

0 commit comments

Comments
 (0)