Skip to content

Commit 7a2a27c

Browse files
committedNov 2, 2018
Add support for 'atomic_default_mem_order' clause on 'requires' directive. Also renamed test files relating to 'requires'. Differntial review: https://reviews.llvm.org/D53513
llvm-svn: 345967
1 parent 5595b1e commit 7a2a27c

20 files changed

+253
-7
lines changed
 

‎clang/include/clang/AST/OpenMPClause.h

+79
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,85 @@ class OMPDynamicAllocatorsClause final : public OMPClause {
859859
}
860860
};
861861

862+
/// This represents 'atomic_default_mem_order' clause in the '#pragma omp
863+
/// requires' directive.
864+
///
865+
/// \code
866+
/// #pragma omp requires atomic_default_mem_order(seq_cst)
867+
/// \endcode
868+
/// In this example directive '#pragma omp requires' has simple
869+
/// atomic_default_mem_order' clause with kind 'seq_cst'.
870+
class OMPAtomicDefaultMemOrderClause final : public OMPClause {
871+
friend class OMPClauseReader;
872+
873+
/// Location of '('
874+
SourceLocation LParenLoc;
875+
876+
/// A kind of the 'atomic_default_mem_order' clause.
877+
OpenMPAtomicDefaultMemOrderClauseKind Kind =
878+
OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown;
879+
880+
/// Start location of the kind in source code.
881+
SourceLocation KindKwLoc;
882+
883+
/// Set kind of the clause.
884+
///
885+
/// \param K Kind of clause.
886+
void setAtomicDefaultMemOrderKind(OpenMPAtomicDefaultMemOrderClauseKind K) {
887+
Kind = K;
888+
}
889+
890+
/// Set clause kind location.
891+
///
892+
/// \param KLoc Kind location.
893+
void setAtomicDefaultMemOrderKindKwLoc(SourceLocation KLoc) {
894+
KindKwLoc = KLoc;
895+
}
896+
897+
public:
898+
/// Build 'atomic_default_mem_order' clause with argument \a A ('seq_cst',
899+
/// 'acq_rel' or 'relaxed').
900+
///
901+
/// \param A Argument of the clause ('seq_cst', 'acq_rel' or 'relaxed').
902+
/// \param ALoc Starting location of the argument.
903+
/// \param StartLoc Starting location of the clause.
904+
/// \param LParenLoc Location of '('.
905+
/// \param EndLoc Ending location of the clause.
906+
OMPAtomicDefaultMemOrderClause(OpenMPAtomicDefaultMemOrderClauseKind A,
907+
SourceLocation ALoc, SourceLocation StartLoc,
908+
SourceLocation LParenLoc,
909+
SourceLocation EndLoc)
910+
: OMPClause(OMPC_atomic_default_mem_order, StartLoc, EndLoc),
911+
LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
912+
913+
/// Build an empty clause.
914+
OMPAtomicDefaultMemOrderClause()
915+
: OMPClause(OMPC_atomic_default_mem_order, SourceLocation(),
916+
SourceLocation()) {}
917+
918+
/// Sets the location of '('.
919+
void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
920+
921+
/// Returns the locaiton of '('.
922+
SourceLocation getLParenLoc() const { return LParenLoc; }
923+
924+
/// Returns kind of the clause.
925+
OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const {
926+
return Kind;
927+
}
928+
929+
/// Returns location of clause kind.
930+
SourceLocation getAtomicDefaultMemOrderKindKwLoc() const { return KindKwLoc; }
931+
932+
child_range children() {
933+
return child_range(child_iterator(), child_iterator());
934+
}
935+
936+
static bool classof(const OMPClause *T) {
937+
return T->getClauseKind() == OMPC_atomic_default_mem_order;
938+
}
939+
};
940+
862941
/// This represents 'schedule' clause in the '#pragma omp ...' directive.
863942
///
864943
/// \code

‎clang/include/clang/AST/RecursiveASTVisitor.h

+6
Original file line numberDiff line numberDiff line change
@@ -2887,6 +2887,12 @@ bool RecursiveASTVisitor<Derived>::VisitOMPDynamicAllocatorsClause(
28872887
return true;
28882888
}
28892889

2890+
template <typename Derived>
2891+
bool RecursiveASTVisitor<Derived>::VisitOMPAtomicDefaultMemOrderClause(
2892+
OMPAtomicDefaultMemOrderClause *) {
2893+
return true;
2894+
}
2895+
28902896
template <typename Derived>
28912897
bool
28922898
RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {

‎clang/include/clang/Basic/OpenMPKinds.def

+11
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@
126126
#ifndef OPENMP_DEFAULTMAP_KIND
127127
#define OPENMP_DEFAULTMAP_KIND(Name)
128128
#endif
129+
#ifndef OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND
130+
#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name)
131+
#endif
129132
#ifndef OPENMP_DEFAULTMAP_MODIFIER
130133
#define OPENMP_DEFAULTMAP_MODIFIER(Name)
131134
#endif
@@ -283,6 +286,7 @@ OPENMP_CLAUSE(unified_address, OMPUnifiedAddressClause)
283286
OPENMP_CLAUSE(unified_shared_memory, OMPUnifiedSharedMemoryClause)
284287
OPENMP_CLAUSE(reverse_offload, OMPReverseOffloadClause)
285288
OPENMP_CLAUSE(dynamic_allocators, OMPDynamicAllocatorsClause)
289+
OPENMP_CLAUSE(atomic_default_mem_order, OMPAtomicDefaultMemOrderClause)
286290

287291
// Clauses allowed for OpenMP directive 'parallel'.
288292
OPENMP_PARALLEL_CLAUSE(if)
@@ -469,6 +473,12 @@ OPENMP_REQUIRES_CLAUSE(unified_address)
469473
OPENMP_REQUIRES_CLAUSE(unified_shared_memory)
470474
OPENMP_REQUIRES_CLAUSE(reverse_offload)
471475
OPENMP_REQUIRES_CLAUSE(dynamic_allocators)
476+
OPENMP_REQUIRES_CLAUSE(atomic_default_mem_order)
477+
478+
// Modifiers for 'atomic_default_mem_order' clause.
479+
OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(seq_cst)
480+
OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(acq_rel)
481+
OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(relaxed)
472482

473483
// Clauses allowed for OpenMP directive 'target data'.
474484
OPENMP_TARGET_DATA_CLAUSE(if)
@@ -898,6 +908,7 @@ OPENMP_TASKGROUP_CLAUSE(task_reduction)
898908
#undef OPENMP_ATOMIC_CLAUSE
899909
#undef OPENMP_TARGET_CLAUSE
900910
#undef OPENMP_REQUIRES_CLAUSE
911+
#undef OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND
901912
#undef OPENMP_TARGET_DATA_CLAUSE
902913
#undef OPENMP_TARGET_ENTER_DATA_CLAUSE
903914
#undef OPENMP_TARGET_EXIT_DATA_CLAUSE

‎clang/include/clang/Basic/OpenMPKinds.h

+8
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ enum OpenMPDefaultmapClauseModifier {
120120
OMPC_DEFAULTMAP_MODIFIER_last
121121
};
122122

123+
/// OpenMP attributes for 'atomic_default_mem_order' clause.
124+
enum OpenMPAtomicDefaultMemOrderClauseKind {
125+
#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
126+
OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name,
127+
#include "clang/Basic/OpenMPKinds.def"
128+
OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
129+
};
130+
123131
/// Scheduling data for loop-based OpenMP directives.
124132
struct OpenMPScheduleTy final {
125133
OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown;

‎clang/include/clang/Sema/Sema.h

+5
Original file line numberDiff line numberDiff line change
@@ -9209,6 +9209,11 @@ class Sema {
92099209
OMPClause *ActOnOpenMPDynamicAllocatorsClause(SourceLocation StartLoc,
92109210
SourceLocation EndLoc);
92119211

9212+
/// Called on well-formed 'atomic_default_mem_order' clause.
9213+
OMPClause *ActOnOpenMPAtomicDefaultMemOrderClause(
9214+
OpenMPAtomicDefaultMemOrderClauseKind Kind, SourceLocation KindLoc,
9215+
SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
9216+
92129217
OMPClause *ActOnOpenMPVarListClause(
92139218
OpenMPClauseKind Kind, ArrayRef<Expr *> Vars, Expr *TailExpr,
92149219
SourceLocation StartLoc, SourceLocation LParenLoc,

‎clang/lib/AST/DeclPrinter.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -1549,11 +1549,9 @@ void DeclPrinter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) {
15491549
void DeclPrinter::VisitOMPRequiresDecl(OMPRequiresDecl *D) {
15501550
Out << "#pragma omp requires ";
15511551
if (!D->clauselist_empty()) {
1552-
for (auto I = D->clauselist_begin(), E = D->clauselist_end(); I != E; ++I) {
1553-
if (I != D->clauselist_begin())
1554-
Out << ',';
1555-
Out << getOpenMPClauseName((*I)->getClauseKind());
1556-
}
1552+
OMPClausePrinter Printer(Out, Policy);
1553+
for (auto I = D->clauselist_begin(), E = D->clauselist_end(); I != E; ++I)
1554+
Printer.Visit(*I);
15571555
}
15581556
}
15591557

‎clang/lib/AST/OpenMPClause.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
111111
case OMPC_unified_shared_memory:
112112
case OMPC_reverse_offload:
113113
case OMPC_dynamic_allocators:
114+
case OMPC_atomic_default_mem_order:
114115
break;
115116
}
116117

@@ -184,6 +185,7 @@ const OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(const OMPClause *C)
184185
case OMPC_unified_shared_memory:
185186
case OMPC_reverse_offload:
186187
case OMPC_dynamic_allocators:
188+
case OMPC_atomic_default_mem_order:
187189
break;
188190
}
189191

@@ -1123,6 +1125,14 @@ void OMPClausePrinter::VisitOMPDynamicAllocatorsClause(
11231125
OS << "dynamic_allocators";
11241126
}
11251127

1128+
void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause(
1129+
OMPAtomicDefaultMemOrderClause *Node) {
1130+
OS << "atomic_default_mem_order("
1131+
<< getOpenMPSimpleClauseTypeName(OMPC_atomic_default_mem_order,
1132+
Node->getAtomicDefaultMemOrderKind())
1133+
<< ")";
1134+
}
1135+
11261136
void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) {
11271137
OS << "schedule(";
11281138
if (Node->getFirstScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) {

‎clang/lib/AST/StmtProfile.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,9 @@ void OMPClauseProfiler::VisitOMPReverseOffloadClause(
479479
void OMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
480480
const OMPDynamicAllocatorsClause *C) {}
481481

482+
void OMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
483+
const OMPAtomicDefaultMemOrderClause *C) {}
484+
482485
void OMPClauseProfiler::VisitOMPScheduleClause(const OMPScheduleClause *C) {
483486
VistOMPClauseWithPreInit(C);
484487
if (auto *S = C->getChunkSize())

‎clang/lib/Basic/OpenMPKinds.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind,
125125
.Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
126126
#include "clang/Basic/OpenMPKinds.def"
127127
.Default(OMPC_DEFAULTMAP_unknown);
128+
case OMPC_atomic_default_mem_order:
129+
return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
130+
#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
131+
.Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
132+
#include "clang/Basic/OpenMPKinds.def"
133+
.Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown);
128134
case OMPC_unknown:
129135
case OMPC_threadprivate:
130136
case OMPC_if:
@@ -270,6 +276,16 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
270276
#include "clang/Basic/OpenMPKinds.def"
271277
}
272278
llvm_unreachable("Invalid OpenMP 'schedule' clause type");
279+
case OMPC_atomic_default_mem_order:
280+
switch (Type) {
281+
case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown:
282+
return "unknown";
283+
#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
284+
case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
285+
return #Name;
286+
#include "clang/Basic/OpenMPKinds.def"
287+
}
288+
llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
273289
case OMPC_unknown:
274290
case OMPC_threadprivate:
275291
case OMPC_if:

‎clang/lib/CodeGen/CGStmtOpenMP.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3970,6 +3970,7 @@ static void emitOMPAtomicExpr(CodeGenFunction &CGF, OpenMPClauseKind Kind,
39703970
case OMPC_unified_shared_memory:
39713971
case OMPC_reverse_offload:
39723972
case OMPC_dynamic_allocators:
3973+
case OMPC_atomic_default_mem_order:
39733974
llvm_unreachable("Clause is not allowed in 'omp atomic'.");
39743975
}
39753976
}

‎clang/lib/Parse/ParseOpenMP.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1337,11 +1337,15 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
13371337
break;
13381338
case OMPC_default:
13391339
case OMPC_proc_bind:
1340+
case OMPC_atomic_default_mem_order:
13401341
// OpenMP [2.14.3.1, Restrictions]
13411342
// Only a single default clause may be specified on a parallel, task or
13421343
// teams directive.
13431344
// OpenMP [2.5, parallel Construct, Restrictions]
13441345
// At most one proc_bind clause can appear on the directive.
1346+
// OpenMP [5.0, Requires directive, Restrictions]
1347+
// At most one atomic_default_mem_order clause can appear
1348+
// on the directive
13451349
if (!FirstClause) {
13461350
Diag(Tok, diag::err_omp_more_one_clause)
13471351
<< getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;

‎clang/lib/Sema/SemaOpenMP.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -8175,6 +8175,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
81758175
case OMPC_unified_shared_memory:
81768176
case OMPC_reverse_offload:
81778177
case OMPC_dynamic_allocators:
8178+
case OMPC_atomic_default_mem_order:
81788179
llvm_unreachable("Clause is not allowed.");
81798180
}
81808181
return Res;
@@ -8700,6 +8701,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
87008701
case OMPC_unified_shared_memory:
87018702
case OMPC_reverse_offload:
87028703
case OMPC_dynamic_allocators:
8704+
case OMPC_atomic_default_mem_order:
87038705
llvm_unreachable("Unexpected OpenMP clause.");
87048706
}
87058707
return CaptureRegion;
@@ -8968,6 +8970,11 @@ OMPClause *Sema::ActOnOpenMPSimpleClause(
89688970
static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc,
89698971
LParenLoc, EndLoc);
89708972
break;
8973+
case OMPC_atomic_default_mem_order:
8974+
Res = ActOnOpenMPAtomicDefaultMemOrderClause(
8975+
static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Argument),
8976+
ArgumentLoc, StartLoc, LParenLoc, EndLoc);
8977+
break;
89718978
case OMPC_if:
89728979
case OMPC_final:
89738980
case OMPC_num_threads:
@@ -9093,6 +9100,21 @@ OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind,
90939100
OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
90949101
}
90959102

9103+
OMPClause *Sema::ActOnOpenMPAtomicDefaultMemOrderClause(
9104+
OpenMPAtomicDefaultMemOrderClauseKind Kind, SourceLocation KindKwLoc,
9105+
SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
9106+
if (Kind == OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown) {
9107+
Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
9108+
<< getListOfPossibleValues(
9109+
OMPC_atomic_default_mem_order, /*First=*/0,
9110+
/*Last=*/OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown)
9111+
<< getOpenMPClauseName(OMPC_atomic_default_mem_order);
9112+
return nullptr;
9113+
}
9114+
return new (Context) OMPAtomicDefaultMemOrderClause(Kind, KindKwLoc, StartLoc,
9115+
LParenLoc, EndLoc);
9116+
}
9117+
90969118
OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
90979119
OpenMPClauseKind Kind, ArrayRef<unsigned> Argument, Expr *Expr,
90989120
SourceLocation StartLoc, SourceLocation LParenLoc,
@@ -9181,6 +9203,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
91819203
case OMPC_unified_shared_memory:
91829204
case OMPC_reverse_offload:
91839205
case OMPC_dynamic_allocators:
9206+
case OMPC_atomic_default_mem_order:
91849207
llvm_unreachable("Clause is not allowed.");
91859208
}
91869209
return Res;
@@ -9387,6 +9410,7 @@ OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
93879410
case OMPC_from:
93889411
case OMPC_use_device_ptr:
93899412
case OMPC_is_device_ptr:
9413+
case OMPC_atomic_default_mem_order:
93909414
llvm_unreachable("Clause is not allowed.");
93919415
}
93929416
return Res;
@@ -9579,6 +9603,7 @@ OMPClause *Sema::ActOnOpenMPVarListClause(
95799603
case OMPC_unified_shared_memory:
95809604
case OMPC_reverse_offload:
95819605
case OMPC_dynamic_allocators:
9606+
case OMPC_atomic_default_mem_order:
95829607
llvm_unreachable("Clause is not allowed.");
95839608
}
95849609
return Res;

‎clang/lib/Sema/TreeTransform.h

+7
Original file line numberDiff line numberDiff line change
@@ -8456,6 +8456,13 @@ OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
84568456
"dynamic_allocators clause cannot appear in dependent context");
84578457
}
84588458

8459+
template <typename Derived>
8460+
OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8461+
OMPAtomicDefaultMemOrderClause *C) {
8462+
llvm_unreachable(
8463+
"atomic_default_mem_order clause cannot appear in dependent context");
8464+
}
8465+
84598466
template <typename Derived>
84608467
OMPClause *
84618468
TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {

‎clang/lib/Serialization/ASTReader.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -11732,7 +11732,10 @@ OMPClause *OMPClauseReader::readClause() {
1173211732
case OMPC_dynamic_allocators:
1173311733
C = new (Context) OMPDynamicAllocatorsClause();
1173411734
break;
11735-
case OMPC_private:
11735+
case OMPC_atomic_default_mem_order:
11736+
C = new (Context) OMPAtomicDefaultMemOrderClause();
11737+
break;
11738+
case OMPC_private:
1173611739
C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
1173711740
break;
1173811741
case OMPC_firstprivate:
@@ -11971,6 +11974,14 @@ void
1197111974
OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
1197211975
}
1197311976

11977+
void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11978+
OMPAtomicDefaultMemOrderClause *C) {
11979+
C->setAtomicDefaultMemOrderKind(
11980+
static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
11981+
C->setLParenLoc(Record.readSourceLocation());
11982+
C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11983+
}
11984+
1197411985
void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
1197511986
C->setLParenLoc(Record.readSourceLocation());
1197611987
unsigned NumVars = C->varlist_size();

0 commit comments

Comments
 (0)