Skip to content

Commit 9e595e9

Browse files
committed
[Clang][OpenMP] Add support for default to/from map types on target enter/exit data
1 parent 27a26e7 commit 9e595e9

File tree

6 files changed

+150
-4
lines changed

6 files changed

+150
-4
lines changed

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4392,6 +4392,12 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
43924392
}
43934393
if (Data.ExtraModifier == OMPC_MAP_unknown) {
43944394
Data.ExtraModifier = OMPC_MAP_tofrom;
4395+
if (getLangOpts().OpenMP >= 52) {
4396+
if (DKind == OMPD_target_enter_data)
4397+
Data.ExtraModifier = OMPC_MAP_to;
4398+
else if (DKind == OMPD_target_exit_data)
4399+
Data.ExtraModifier = OMPC_MAP_from;
4400+
}
43954401
Data.IsMapTypeImplicit = true;
43964402
}
43974403

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21724,10 +21724,12 @@ static void checkMappableExpressionList(
2172421724
// target enter data
2172521725
// OpenMP [2.10.2, Restrictions, p. 99]
2172621726
// A map-type must be specified in all map clauses and must be either
21727-
// to or alloc.
21727+
// to or alloc. Starting with OpenMP 5.2 the default map type is `to` if
21728+
// no map type is present.
2172821729
OpenMPDirectiveKind DKind = DSAS->getCurrentDirective();
2172921730
if (DKind == OMPD_target_enter_data &&
21730-
!(MapType == OMPC_MAP_to || MapType == OMPC_MAP_alloc)) {
21731+
!(MapType == OMPC_MAP_to || MapType == OMPC_MAP_alloc ||
21732+
SemaRef.getLangOpts().OpenMP >= 52)) {
2173121733
SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive)
2173221734
<< (IsMapTypeImplicit ? 1 : 0)
2173321735
<< getOpenMPSimpleClauseTypeName(OMPC_map, MapType)
@@ -21738,10 +21740,11 @@ static void checkMappableExpressionList(
2173821740
// target exit_data
2173921741
// OpenMP [2.10.3, Restrictions, p. 102]
2174021742
// A map-type must be specified in all map clauses and must be either
21741-
// from, release, or delete.
21743+
// from, release, or delete. Starting with OpenMP 5.2 the default map
21744+
// type is `from` if no map type is present.
2174221745
if (DKind == OMPD_target_exit_data &&
2174321746
!(MapType == OMPC_MAP_from || MapType == OMPC_MAP_release ||
21744-
MapType == OMPC_MAP_delete)) {
21747+
MapType == OMPC_MAP_delete || SemaRef.getLangOpts().OpenMP >= 52)) {
2174521748
SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive)
2174621749
<< (IsMapTypeImplicit ? 1 : 0)
2174721750
<< getOpenMPSimpleClauseTypeName(OMPC_map, MapType)

clang/test/OpenMP/target_enter_data_ast_print.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
77
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
88

9+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -ast-print %s | FileCheck %s
10+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
11+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
12+
913
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
1014
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
1115
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -ast-print %s | FileCheck %s
2+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
3+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck --check-prefix=CHECK --check-prefix=CHECK-52 %s
4+
5+
// expected-no-diagnostics
6+
7+
#ifndef HEADER
8+
#define HEADER
9+
10+
template <typename T, int C>
11+
T tmain(T argc, T *argv) {
12+
T i_def, i;
13+
14+
i = argc;
15+
16+
#pragma omp target enter data map(i_def)
17+
18+
#pragma omp target enter data map(to: i)
19+
20+
return 0;
21+
}
22+
23+
// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
24+
// CHECK-NEXT: T i_def, i;
25+
// CHECK-NEXT: i = argc;
26+
// CHECK-NEXT: #pragma omp target enter data map(to: i_def){{$}}
27+
// CHECK-NEXT: #pragma omp target enter data map(to: i){{$}}
28+
29+
// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
30+
// CHECK-NEXT: int i_def, i;
31+
// CHECK-NEXT: i = argc;
32+
// CHECK-NEXT: #pragma omp target enter data map(to: i_def){{$}}
33+
// CHECK-NEXT: #pragma omp target enter data map(to: i)
34+
35+
// CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
36+
// CHECK-NEXT: char i_def, i;
37+
// CHECK-NEXT: i = argc;
38+
// CHECK-NEXT: #pragma omp target enter data map(to: i_def){{$}}
39+
// CHECK-NEXT: #pragma omp target enter data map(to: i)
40+
41+
int main (int argc, char **argv) {
42+
int b_def, b;
43+
static int a_def, a;
44+
// CHECK: static int a_def, a;
45+
46+
#pragma omp target enter data map(a_def)
47+
// CHECK: #pragma omp target enter data map(to: a_def)
48+
a_def=2;
49+
// CHECK-NEXT: a_def = 2;
50+
51+
#pragma omp target enter data map(to: a)
52+
// CHECK: #pragma omp target enter data map(to: a)
53+
a=2;
54+
// CHECK-NEXT: a = 2;
55+
56+
#pragma omp target enter data map(b_def)
57+
// CHECK-NEXT: #pragma omp target enter data map(to: b_def)
58+
59+
#pragma omp target enter data map(to: b)
60+
// CHECK-NEXT: #pragma omp target enter data map(to: b)
61+
62+
return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
63+
}
64+
65+
#endif

clang/test/OpenMP/target_exit_data_ast_print.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
77
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
88

9+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -ast-print %s | FileCheck %s
10+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
11+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
12+
913
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
1014
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
1115
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -ast-print %s | FileCheck %s
2+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
3+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4+
5+
// expected-no-diagnostics
6+
7+
#ifndef HEADER
8+
#define HEADER
9+
10+
template <typename T, int C>
11+
T tmain(T argc, T *argv) {
12+
T i_def, i;
13+
14+
i = argc;
15+
#pragma omp target exit data map(i_def)
16+
17+
#pragma omp target exit data map(from: i)
18+
19+
return 0;
20+
}
21+
22+
// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
23+
// CHECK-NEXT: T i_def, i;
24+
// CHECK-NEXT: i = argc;
25+
// CHECK-NEXT: #pragma omp target exit data map(from: i_def){{$}}
26+
// CHECK-NEXT: #pragma omp target exit data map(from: i){{$}}
27+
28+
// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
29+
// CHECK-NEXT: int i_def, i;
30+
// CHECK-NEXT: i = argc;
31+
// CHECK-NEXT: #pragma omp target exit data map(from: i_def)
32+
// CHECK-NEXT: #pragma omp target exit data map(from: i)
33+
34+
// CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
35+
// CHECK-NEXT: char i_def, i;
36+
// CHECK-NEXT: i = argc;
37+
// CHECK-NEXT: #pragma omp target exit data map(from: i_def)
38+
// CHECK-NEXT: #pragma omp target exit data map(from: i)
39+
40+
int main (int argc, char **argv) {
41+
int b_def, b;
42+
static int a_def, a;
43+
// CHECK: static int a_def, a;
44+
45+
#pragma omp target exit data map(a_def)
46+
// CHECK: #pragma omp target exit data map(from: a_def)
47+
a_def=2;
48+
// CHECK-NEXT: a_def = 2;
49+
50+
#pragma omp target exit data map(from: a)
51+
// CHECK: #pragma omp target exit data map(from: a)
52+
a=2;
53+
// CHECK-NEXT: a = 2;
54+
55+
#pragma omp target exit data map(b_def)
56+
// CHECK-NEXT: #pragma omp target exit data map(from: b_def)
57+
58+
#pragma omp target exit data map(from: b)
59+
// CHECK-NEXT: #pragma omp target exit data map(from: b)
60+
61+
return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
62+
}
63+
64+
#endif

0 commit comments

Comments
 (0)