[OpenMP] Parsing + sema for "target exit data" directive.
Patch by Arpith Jacob. Thanks!
llvm-svn: 258177
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index a3e33bc..1b51553 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -1611,6 +1611,7 @@
case OMPD_cancel:
case OMPD_flush:
case OMPD_target_enter_data:
+ case OMPD_target_exit_data:
llvm_unreachable("OpenMP Directive is not allowed");
case OMPD_unknown:
llvm_unreachable("Unknown OpenMP directive");
@@ -1727,6 +1728,8 @@
// | parallel | target | * |
// | parallel | target enter | * |
// | | data | |
+ // | parallel | target exit | * |
+ // | | data | |
// | parallel | teams | + |
// | parallel | cancellation | |
// | | point | ! |
@@ -1758,6 +1761,8 @@
// | for | target | * |
// | for | target enter | * |
// | | data | |
+ // | for | target exit | * |
+ // | | data | |
// | for | teams | + |
// | for | cancellation | |
// | | point | ! |
@@ -1789,6 +1794,8 @@
// | master | target | * |
// | master | target enter | * |
// | | data | |
+ // | master | target exit | * |
+ // | | data | |
// | master | teams | + |
// | master | cancellation | |
// | | point | |
@@ -1819,6 +1826,8 @@
// | critical | target | * |
// | critical | target enter | * |
// | | data | |
+ // | critical | target exit | * |
+ // | | data | |
// | critical | teams | + |
// | critical | cancellation | |
// | | point | |
@@ -1850,6 +1859,8 @@
// | simd | target | |
// | simd | target enter | |
// | | data | |
+ // | simd | target exit | |
+ // | | data | |
// | simd | teams | |
// | simd | cancellation | |
// | | point | |
@@ -1881,6 +1892,8 @@
// | for simd | target | |
// | for simd | target enter | |
// | | data | |
+ // | for simd | target exit | |
+ // | | data | |
// | for simd | teams | |
// | for simd | cancellation | |
// | | point | |
@@ -1912,6 +1925,8 @@
// | parallel for simd| target | |
// | parallel for simd| target enter | |
// | | data | |
+ // | parallel for simd| target exit | |
+ // | | data | |
// | parallel for simd| teams | |
// | parallel for simd| cancellation | |
// | | point | |
@@ -1943,6 +1958,8 @@
// | sections | target | * |
// | sections | target enter | * |
// | | data | |
+ // | sections | target exit | * |
+ // | | data | |
// | sections | teams | + |
// | sections | cancellation | |
// | | point | ! |
@@ -1974,6 +1991,8 @@
// | section | target | * |
// | section | target enter | * |
// | | data | |
+ // | section | target exit | * |
+ // | | data | |
// | section | teams | + |
// | section | cancellation | |
// | | point | ! |
@@ -2005,6 +2024,8 @@
// | single | target | * |
// | single | target enter | * |
// | | data | |
+ // | single | target exit | * |
+ // | | data | |
// | single | teams | + |
// | single | cancellation | |
// | | point | |
@@ -2036,6 +2057,8 @@
// | parallel for | target | * |
// | parallel for | target enter | * |
// | | data | |
+ // | parallel for | target exit | * |
+ // | | data | |
// | parallel for | teams | + |
// | parallel for | cancellation | |
// | | point | ! |
@@ -2067,6 +2090,8 @@
// | parallel sections| target | * |
// | parallel sections| target enter | * |
// | | data | |
+ // | parallel sections| target exit | * |
+ // | | data | |
// | parallel sections| teams | + |
// | parallel sections| cancellation | |
// | | point | ! |
@@ -2098,6 +2123,8 @@
// | task | target | * |
// | task | target enter | * |
// | | data | |
+ // | task | target exit | * |
+ // | | data | |
// | task | teams | + |
// | task | cancellation | |
// | | point | ! |
@@ -2129,6 +2156,8 @@
// | ordered | target | * |
// | ordered | target enter | * |
// | | data | |
+ // | ordered | target exit | * |
+ // | | data | |
// | ordered | teams | + |
// | ordered | cancellation | |
// | | point | |
@@ -2160,6 +2189,8 @@
// | atomic | target | |
// | atomic | target enter | |
// | | data | |
+ // | atomic | target exit | |
+ // | | data | |
// | atomic | teams | |
// | atomic | cancellation | |
// | | point | |
@@ -2191,6 +2222,8 @@
// | target | target | * |
// | target | target enter | * |
// | | data | |
+ // | target | target exit | * |
+ // | | data | |
// | target | teams | * |
// | target | cancellation | |
// | | point | |
@@ -2222,6 +2255,8 @@
// | teams | target | + |
// | teams | target enter | + |
// | | data | |
+ // | teams | target exit | + |
+ // | | data | |
// | teams | teams | + |
// | teams | cancellation | |
// | | point | |
@@ -2253,6 +2288,8 @@
// | taskloop | target | * |
// | taskloop | target enter | * |
// | | data | |
+ // | taskloop | target exit | * |
+ // | | data | |
// | taskloop | teams | + |
// | taskloop | cancellation | |
// | | point | |
@@ -2283,6 +2320,8 @@
// | taskloop simd | target | |
// | taskloop simd | target enter | |
// | | data | |
+ // | taskloop simd | target exit | |
+ // | | data | |
// | taskloop simd | teams | |
// | taskloop simd | cancellation | |
// | | point | |
@@ -2314,6 +2353,8 @@
// | distribute | target | |
// | distribute | target enter | |
// | | data | |
+ // | distribute | target exit | |
+ // | | data | |
// | distribute | teams | |
// | distribute | cancellation | + |
// | | point | |
@@ -2743,6 +2784,11 @@
EndLoc);
AllowedNameModifiers.push_back(OMPD_target_enter_data);
break;
+ case OMPD_target_exit_data:
+ Res = ActOnOpenMPTargetExitDataDirective(ClausesWithImplicit, StartLoc,
+ EndLoc);
+ AllowedNameModifiers.push_back(OMPD_target_exit_data);
+ break;
case OMPD_taskloop:
Res = ActOnOpenMPTaskLoopDirective(ClausesWithImplicit, AStmt, StartLoc,
EndLoc, VarsWithInheritedDSA);
@@ -5522,6 +5568,21 @@
Clauses);
}
+StmtResult
+Sema::ActOnOpenMPTargetExitDataDirective(ArrayRef<OMPClause *> Clauses,
+ SourceLocation StartLoc,
+ SourceLocation EndLoc) {
+ // OpenMP [2.10.3, Restrictions, p. 102]
+ // At least one map clause must appear on the directive.
+ if (!HasMapClause(Clauses)) {
+ Diag(StartLoc, diag::err_omp_no_map_for_directive)
+ << getOpenMPDirectiveName(OMPD_target_exit_data);
+ return StmtError();
+ }
+
+ return OMPTargetExitDataDirective::Create(Context, StartLoc, EndLoc, Clauses);
+}
+
StmtResult Sema::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses,
Stmt *AStmt, SourceLocation StartLoc,
SourceLocation EndLoc) {
@@ -8539,6 +8600,23 @@
// further spurious messages
}
+ // target exit_data
+ // OpenMP [2.10.3, Restrictions, p. 102]
+ // A map-type must be specified in all map clauses and must be either
+ // from, release, or delete.
+ DKind = DSAStack->getCurrentDirective();
+ if (DKind == OMPD_target_exit_data &&
+ !(MapType == OMPC_MAP_from || MapType == OMPC_MAP_release ||
+ MapType == OMPC_MAP_delete)) {
+ Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive)
+ <<
+ // TODO: Need to determine if map type is implicitly determined
+ 0 << getOpenMPSimpleClauseTypeName(OMPC_map, MapType)
+ << getOpenMPDirectiveName(DKind);
+ // Proceed to add the variable in a map clause anyway, to prevent
+ // further spurious messages
+ }
+
Vars.push_back(RE);
MI.RefExpr = RE;
DSAStack->addMapInfoForVar(VD, MI);