Skip to content

Commit fde11e9

Browse files
committed
[OPENMP50]Generalize handling of context matching/scoring.
Summary: Untie context matching/scoring from the attribute for declare variant directive to simplify future uses in other context-dependent directives. Reviewers: jdoerfert Subscribers: guansong, kkwli0, caomhin, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D69952
1 parent f8c12ed commit fde11e9

File tree

10 files changed

+335
-168
lines changed

10 files changed

+335
-168
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3305,61 +3305,57 @@ def OMPDeclareVariant : InheritableAttr {
33053305
let Documentation = [OMPDeclareVariantDocs];
33063306
let Args = [
33073307
ExprArgument<"VariantFuncRef">,
3308-
ExprArgument<"Score">,
3309-
EnumArgument<"CtxSelectorSet", "CtxSelectorSetType",
3310-
[ "", "implementation"
3311-
],
3312-
[
3313-
"CtxSetUnknown", "CtxSetImplementation"
3314-
]>,
3315-
EnumArgument<"CtxSelector", "CtxSelectorType",
3316-
[ "", "vendor"
3317-
],
3318-
[
3319-
"CtxUnknown", "CtxVendor"
3320-
]>,
3308+
VariadicExprArgument<"Scores">,
3309+
VariadicUnsignedArgument<"CtxSelectorSets">,
3310+
VariadicUnsignedArgument<"CtxSelectors">,
33213311
VariadicStringArgument<"ImplVendors">
33223312
];
33233313
let AdditionalMembers = [{
3324-
void printScore(raw_ostream & OS, const PrintingPolicy &Policy) const {
3325-
if (const Expr *E = getScore()) {
3314+
void printScore(raw_ostream & OS, const PrintingPolicy &Policy, unsigned I) const {
3315+
if (const Expr *E = *std::next(scores_begin(), I)) {
33263316
OS << "score(";
33273317
E->printPretty(OS, nullptr, Policy);
33283318
OS << "):";
33293319
}
33303320
}
33313321
void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
33323322
const {
3333-
assert(getCtxSelectorSet() != CtxSetUnknown &&
3334-
getCtxSelector() != CtxUnknown && "Unknown context selector.");
33353323
if (const Expr *E = getVariantFuncRef()) {
33363324
OS << "(";
33373325
E->printPretty(OS, nullptr, Policy);
33383326
OS << ")";
33393327
}
33403328
// TODO: add printing of real context selectors.
33413329
OS << " match(";
3342-
switch (getCtxSelectorSet()) {
3343-
case CtxSetImplementation:
3344-
OS << "implementation={";
3345-
switch (getCtxSelector()) {
3346-
case CtxVendor:
3347-
OS << "vendor(";
3348-
printScore(OS, Policy);
3349-
if (implVendors_size() > 0) {
3350-
OS << *implVendors(). begin();
3351-
for (StringRef VendorName : llvm::drop_begin(implVendors(), 1))
3352-
OS << ", " << VendorName;
3330+
for (unsigned I = 0, E = ctxSelectorSets_size(); I < E; ++I) {
3331+
auto CtxSet = static_cast<OpenMPContextSelectorSetKind>(
3332+
*std::next(ctxSelectorSets_begin(), I));
3333+
auto Ctx = static_cast<OpenMPContextSelectorKind>(
3334+
*std::next(ctxSelectors_begin(), I));
3335+
assert(CtxSet != OMP_CTX_SET_unknown && Ctx != OMP_CTX_unknown &&
3336+
"Unknown context selector.");
3337+
switch (CtxSet) {
3338+
case OMP_CTX_SET_implementation:
3339+
OS << "implementation={";
3340+
switch (Ctx) {
3341+
case OMP_CTX_vendor:
3342+
OS << "vendor(";
3343+
printScore(OS, Policy, I);
3344+
if (implVendors_size() > 0) {
3345+
OS << *implVendors(). begin();
3346+
for (StringRef VendorName : llvm::drop_begin(implVendors(), 1))
3347+
OS << ", " << VendorName;
3348+
}
3349+
OS << ")";
3350+
break;
3351+
case OMP_CTX_unknown:
3352+
llvm_unreachable("Unknown context selector.");
33533353
}
3354-
OS << ")";
3354+
OS << "}";
33553355
break;
3356-
case CtxUnknown:
3357-
llvm_unreachable("Unknown context selector.");
3356+
case OMP_CTX_SET_unknown:
3357+
llvm_unreachable("Unknown context selector set.");
33583358
}
3359-
OS << "}";
3360-
break;
3361-
case CtxSetUnknown:
3362-
llvm_unreachable("Unknown context selector set.");
33633359
}
33643360
OS << ")";
33653361
}

clang/include/clang/Basic/OpenMPKinds.def

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,18 @@
212212
#ifndef OPENMP_MATCH_KIND
213213
#define OPENMP_MATCH_KIND(Name)
214214
#endif
215+
#ifndef OPENMP_CONTEXT_SELECTOR_SET
216+
#define OPENMP_CONTEXT_SELECTOR_SET(Name)
217+
#endif
218+
#ifndef OPENMP_CONTEXT_SELECTOR
219+
#define OPENMP_CONTEXT_SELECTOR(Name)
220+
#endif
221+
222+
// OpenMP context selector sets.
223+
OPENMP_CONTEXT_SELECTOR_SET(implementation)
224+
225+
// OpenMP context selectors.
226+
OPENMP_CONTEXT_SELECTOR(vendor)
215227

216228
// OpenMP directives.
217229
OPENMP_DIRECTIVE(threadprivate)
@@ -1076,6 +1088,8 @@ OPENMP_DECLARE_VARIANT_CLAUSE(match)
10761088
// TODO: add other context selectors.
10771089
OPENMP_MATCH_KIND(implementation)
10781090

1091+
#undef OPENMP_CONTEXT_SELECTOR
1092+
#undef OPENMP_CONTEXT_SELECTOR_SET
10791093
#undef OPENMP_MATCH_KIND
10801094
#undef OPENMP_DECLARE_VARIANT_CLAUSE
10811095
#undef OPENMP_DEVICE_TYPE_KIND

clang/include/clang/Basic/OpenMPKinds.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,46 @@
1818

1919
namespace clang {
2020

21+
/// OpenMP context selector sets.
22+
enum OpenMPContextSelectorSetKind {
23+
#define OPENMP_CONTEXT_SELECTOR_SET(Name) OMP_CTX_SET_##Name,
24+
#include "clang/Basic/OpenMPKinds.def"
25+
OMP_CTX_SET_unknown,
26+
};
27+
28+
/// OpenMP context selectors.
29+
enum OpenMPContextSelectorKind {
30+
#define OPENMP_CONTEXT_SELECTOR(Name) OMP_CTX_##Name,
31+
#include "clang/Basic/OpenMPKinds.def"
32+
OMP_CTX_unknown,
33+
};
34+
35+
OpenMPContextSelectorSetKind getOpenMPContextSelectorSet(llvm::StringRef Str);
36+
llvm::StringRef
37+
getOpenMPContextSelectorSetName(OpenMPContextSelectorSetKind Kind);
38+
OpenMPContextSelectorKind getOpenMPContextSelector(llvm::StringRef Str);
39+
llvm::StringRef getOpenMPContextSelectorName(OpenMPContextSelectorKind Kind);
40+
41+
/// Struct to store the context selectors info.
42+
template <typename T, typename VectorType, typename ScoreT>
43+
struct OpenMPCtxSelectorData {
44+
OpenMPContextSelectorSetKind CtxSet = OMP_CTX_SET_unknown;
45+
OpenMPContextSelectorKind Ctx = OMP_CTX_unknown;
46+
ScoreT Score;
47+
VectorType Names;
48+
explicit OpenMPCtxSelectorData() = default;
49+
explicit OpenMPCtxSelectorData(OpenMPContextSelectorSetKind CtxSet,
50+
OpenMPContextSelectorKind Ctx,
51+
const ScoreT &Score, VectorType &&Names)
52+
: CtxSet(CtxSet), Ctx(Ctx), Score(Score), Names(Names) {}
53+
template <typename U>
54+
explicit OpenMPCtxSelectorData(OpenMPContextSelectorSetKind CtxSet,
55+
OpenMPContextSelectorKind Ctx,
56+
const ScoreT &Score, const U &Names)
57+
: CtxSet(CtxSet), Ctx(Ctx), Score(Score),
58+
Names(Names.begin(), Names.end()) {}
59+
};
60+
2161
/// OpenMP directives.
2262
enum OpenMPDirectiveKind {
2363
#define OPENMP_DIRECTIVE(Name) \

clang/include/clang/Parse/Parser.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2851,11 +2851,9 @@ class Parser : public CodeCompletionHandler {
28512851
SourceLocation Loc);
28522852
/// Parses OpenMP context selectors and calls \p Callback for each
28532853
/// successfully parsed context selector.
2854-
bool parseOpenMPContextSelectors(
2855-
SourceLocation Loc,
2856-
llvm::function_ref<
2857-
void(SourceRange, const Sema::OpenMPDeclareVariantCtsSelectorData &)>
2858-
Callback);
2854+
bool
2855+
parseOpenMPContextSelectors(SourceLocation Loc,
2856+
SmallVectorImpl<Sema::OMPCtxSelectorData> &Data);
28592857

28602858
/// Parse clauses for '#pragma omp declare variant'.
28612859
void ParseOMPDeclareVariantClauses(DeclGroupPtrTy Ptr, CachedTokens &Toks,

clang/include/clang/Sema/Sema.h

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9307,21 +9307,10 @@ class Sema {
93079307

93089308
public:
93099309
/// Struct to store the context selectors info for declare variant directive.
9310-
struct OpenMPDeclareVariantCtsSelectorData {
9311-
OMPDeclareVariantAttr::CtxSelectorSetType CtxSet =
9312-
OMPDeclareVariantAttr::CtxSetUnknown;
9313-
OMPDeclareVariantAttr::CtxSelectorType Ctx =
9314-
OMPDeclareVariantAttr::CtxUnknown;
9315-
MutableArrayRef<StringRef> ImplVendors;
9316-
ExprResult CtxScore;
9317-
explicit OpenMPDeclareVariantCtsSelectorData() = default;
9318-
explicit OpenMPDeclareVariantCtsSelectorData(
9319-
OMPDeclareVariantAttr::CtxSelectorSetType CtxSet,
9320-
OMPDeclareVariantAttr::CtxSelectorType Ctx,
9321-
MutableArrayRef<StringRef> ImplVendors, ExprResult CtxScore)
9322-
: CtxSet(CtxSet), Ctx(Ctx), ImplVendors(ImplVendors),
9323-
CtxScore(CtxScore) {}
9324-
};
9310+
using OMPCtxStringType = SmallString<8>;
9311+
using OMPCtxSelectorData =
9312+
OpenMPCtxSelectorData<OMPCtxStringType, SmallVector<OMPCtxStringType, 4>,
9313+
ExprResult>;
93259314

93269315
/// Checks if the variant/multiversion functions are compatible.
93279316
bool areMultiversionVariantFunctionsCompatible(
@@ -9799,9 +9788,9 @@ class Sema {
97999788
/// must be used instead of the original one, specified in \p DG.
98009789
/// \param Data Set of context-specific data for the specified context
98019790
/// selector.
9802-
void ActOnOpenMPDeclareVariantDirective(
9803-
FunctionDecl *FD, Expr *VariantRef, SourceRange SR,
9804-
const Sema::OpenMPDeclareVariantCtsSelectorData &Data);
9791+
void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef,
9792+
SourceRange SR,
9793+
ArrayRef<OMPCtxSelectorData> Data);
98059794

98069795
OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
98079796
Expr *Expr,

clang/lib/Basic/OpenMPKinds.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,49 @@
1919

2020
using namespace clang;
2121

22+
OpenMPContextSelectorSetKind
23+
clang::getOpenMPContextSelectorSet(llvm::StringRef Str) {
24+
return llvm::StringSwitch<OpenMPContextSelectorSetKind>(Str)
25+
#define OPENMP_CONTEXT_SELECTOR_SET(Name) .Case(#Name, OMP_CTX_SET_##Name)
26+
#include "clang/Basic/OpenMPKinds.def"
27+
.Default(OMP_CTX_SET_unknown);
28+
}
29+
30+
llvm::StringRef
31+
clang::getOpenMPContextSelectorSetName(OpenMPContextSelectorSetKind Kind) {
32+
switch (Kind) {
33+
case OMP_CTX_SET_unknown:
34+
return "unknown";
35+
#define OPENMP_CONTEXT_SELECTOR_SET(Name) \
36+
case OMP_CTX_SET_##Name: \
37+
return #Name;
38+
#include "clang/Basic/OpenMPKinds.def"
39+
break;
40+
}
41+
llvm_unreachable("Invalid OpenMP context selector set kind");
42+
}
43+
44+
OpenMPContextSelectorKind clang::getOpenMPContextSelector(llvm::StringRef Str) {
45+
return llvm::StringSwitch<OpenMPContextSelectorKind>(Str)
46+
#define OPENMP_CONTEXT_SELECTOR(Name) .Case(#Name, OMP_CTX_##Name)
47+
#include "clang/Basic/OpenMPKinds.def"
48+
.Default(OMP_CTX_unknown);
49+
}
50+
51+
llvm::StringRef
52+
clang::getOpenMPContextSelectorName(OpenMPContextSelectorKind Kind) {
53+
switch (Kind) {
54+
case OMP_CTX_unknown:
55+
return "unknown";
56+
#define OPENMP_CONTEXT_SELECTOR(Name) \
57+
case OMP_CTX_##Name: \
58+
return #Name;
59+
#include "clang/Basic/OpenMPKinds.def"
60+
break;
61+
}
62+
llvm_unreachable("Invalid OpenMP context selector kind");
63+
}
64+
2265
OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) {
2366
return llvm::StringSwitch<OpenMPDirectiveKind>(Str)
2467
#define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name)

0 commit comments

Comments
 (0)