gcc/c-family/ChangeLog * c-omp.cc (c_omp_directives): Uncomment "declare mapper" entry.
gcc/cp/ChangeLog * parser.cc (cp_parser_omp_declare_mapper): Allow commas between clauses. gcc/testsuite/ChangeLog * g++.dg/gomp/attrs-declare-mapper-3.C: New file. * g++.dg/gomp/attrs-declare-mapper-4.C: New file. * g++.dg/gomp/attrs-declare-mapper-5.C: New file. * g++.dg/gomp/attrs-declare-mapper-6.C: New file. --- gcc/c-family/ChangeLog.omp | 4 + gcc/c-family/c-omp.cc | 4 +- gcc/cp/ChangeLog.omp | 5 ++ gcc/cp/parser.cc | 2 + gcc/testsuite/ChangeLog.omp | 7 ++ .../g++.dg/gomp/attrs-declare-mapper-3.C | 31 ++++++++ .../g++.dg/gomp/attrs-declare-mapper-4.C | 74 +++++++++++++++++++ .../g++.dg/gomp/attrs-declare-mapper-5.C | 26 +++++++ .../g++.dg/gomp/attrs-declare-mapper-6.C | 22 ++++++ 9 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C create mode 100644 gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp index 60f5c29276f..40cb8e811e5 100644 --- a/gcc/c-family/ChangeLog.omp +++ b/gcc/c-family/ChangeLog.omp @@ -1,3 +1,7 @@ +2023-08-18 Sandra Loosemore <san...@codesourcery.com> + + * c-omp.cc (c_omp_directives): Uncomment "declare mapper" entry. + 2023-08-10 Julian Brown <jul...@codesourcery.com> * c-common.h (c_omp_region_type): Add C_ORT_UPDATE and C_ORT_OMP_UPDATE diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc index 9ff09b59bc6..7bc69e9e2da 100644 --- a/gcc/c-family/c-omp.cc +++ b/gcc/c-family/c-omp.cc @@ -5500,8 +5500,8 @@ const struct c_omp_directive c_omp_directives[] = { C_OMP_DIR_STANDALONE, false }, { "critical", nullptr, nullptr, PRAGMA_OMP_CRITICAL, C_OMP_DIR_CONSTRUCT, false }, - /* { "declare", "mapper", nullptr, PRAGMA_OMP_DECLARE, - C_OMP_DIR_DECLARATIVE, false }, */ + { "declare", "mapper", nullptr, PRAGMA_OMP_DECLARE, + C_OMP_DIR_DECLARATIVE, false }, { "declare", "reduction", nullptr, PRAGMA_OMP_DECLARE, C_OMP_DIR_DECLARATIVE, true }, { "declare", "simd", nullptr, PRAGMA_OMP_DECLARE, diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp index 6e154ea3426..1b2d71422d8 100644 --- a/gcc/cp/ChangeLog.omp +++ b/gcc/cp/ChangeLog.omp @@ -1,3 +1,8 @@ +2023-08-18 Sandra Loosemore <san...@codesourcery.com> + + * parser.cc (cp_parser_omp_declare_mapper): Allow commas between + clauses. + 2023-08-18 Sandra Loosemore <san...@codesourcery.com> * parser.cc (analyze_metadirective_body): Handle CPP_PRAGMA and diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 84ec0de6c69..0ce2a7be608 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -50358,6 +50358,8 @@ cp_parser_omp_declare_mapper (cp_parser *parser, cp_token *pragma_tok, while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)) { + if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)) + cp_lexer_consume_token (parser->lexer); pragma_omp_clause c_kind = cp_parser_omp_clause_name (parser); if (c_kind != PRAGMA_OMP_CLAUSE_MAP) { diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index a9b4ac3d0a7..a7d11777988 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,10 @@ +2023-08-18 Sandra Loosemore <san...@codesourcery.com> + + * g++.dg/gomp/attrs-declare-mapper-3.C: New file. + * g++.dg/gomp/attrs-declare-mapper-4.C: New file. + * g++.dg/gomp/attrs-declare-mapper-5.C: New file. + * g++.dg/gomp/attrs-declare-mapper-6.C: New file. + 2023-08-18 Sandra Loosemore <san...@codesourcery.com> * g++.dg/gomp/attrs-metadirective-1.C: New file. diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C new file mode 100644 index 00000000000..36345fe0dc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-3.C @@ -0,0 +1,31 @@ +// { dg-do compile { target c++11 } } +// { dg-additional-options "-fdump-tree-gimple" } + +#include <stdlib.h> + +// Test named mapper invocation. + +struct S { + int *ptr; + int size; +}; + +int main (int argc, char *argv[]) +{ + int N = 1024; + [[omp::directive (declare mapper (mapN:struct S s) + map(to:s.ptr, s.size) + map(s.ptr[:N]))]]; + + struct S s; + s.ptr = (int *) malloc (sizeof (int) * N); + + [[omp::directive (target map(mapper(mapN), tofrom: s))]] +// { dg-final { scan-tree-dump {map\(struct:s \[len: 2\]\) map\(alloc:s\.ptr \[len: [0-9]+\]\) map\(to:s\.size \[len: [0-9]+\]\) map\(tofrom:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} "gimple" } } + { + for (int i = 0; i < N; i++) + s.ptr[i]++; + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C new file mode 100644 index 00000000000..75cb48e8e44 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-4.C @@ -0,0 +1,74 @@ +/* { dg-do compile { target c++11 } } */ +/* { dg-additional-options "-fdump-tree-original" } */ + +/* Check mapper binding clauses. */ + +struct Y { + int z; +}; + +struct Z { + int z; +}; + +[[omp::directive (declare mapper (struct Y y) map(tofrom: y))]]; +[[omp::directive (declare mapper (struct Z z) map(tofrom: z))]]; + +int foo (void) +{ + struct Y yy; + struct Z zz; + int dummy; + + [[omp::directive (target data map(dummy))]] + { + [[omp::directive (target)]] + { + yy.z++; + zz.z++; + } + yy.z++; + } + return yy.z; +} + +struct P +{ + struct Z *zp; +}; + +int bar (void) +{ + struct Y yy; + struct Z zz; + struct P pp; + struct Z t; + int dummy; + + pp.zp = &t; + + [[omp::directive (declare mapper (struct Y y) map(tofrom: y.z))]]; + [[omp::directive (declare mapper (struct Z z) map(tofrom: z.z))]]; + + [[omp::directive (target data map(dummy))]] + { + [[omp::directive (target)]] + { + yy.z++; + zz.z++; + } + yy.z++; + } + + [[omp::directive (declare mapper(struct P x) map(to:x.zp), map(tofrom:*x.zp))]]; + + [[omp::directive (target)]] + { + zz = *pp.zp; + } + + return zz.z; +} + +/* { dg-final { scan-tree-dump-times {mapper_binding\(struct Y,omp declare mapper ~1Y\) mapper_binding\(struct Z,omp declare mapper ~1Z\)} 2 "original" { target c++ } } } */ +/* { dg-final { scan-tree-dump {mapper_binding\(struct Z,omp declare mapper ~1Z\) mapper_binding\(struct P,omp declare mapper ~1P\)} "original" { target c++ } } } */ diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C new file mode 100644 index 00000000000..711f058dc2b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-5.C @@ -0,0 +1,26 @@ +/* { dg-do compile { target c++11 } } */ + +typedef struct S_ { + int *myarr; + int size; +} S; + +[[omp::directive (declare mapper (named: struct S_ v) + map(to:v.size, v.myarr) + map(tofrom: v.myarr[0:v.size]))]]; +/* { dg-note "'#pragma omp declare mapper \\(named: S_\\)' previously defined here" "" { target c++ } .-3 } */ + +[[omp::directive (declare mapper (named: S v) + map(to:v.size, v.myarr) + map(tofrom: v.myarr[0:v.size]))]]; +/* { dg-error "redefinition of '#pragma omp declare mapper \\(named: S\\)'" "" { target c++ } .-3 } */ + +[[omp::directive (declare mapper (struct S_ v) + map(to:v.size, v.myarr) + map(tofrom: v.myarr[0:v.size]))]]; +/* { dg-note "'#pragma omp declare mapper \\(S_\\)' previously defined here" "" { target c++ } .-3 } */ + +[[omp::directive (declare mapper (S v) + map(to:v.size, v.myarr) + map(tofrom: v.myarr[0:v.size]))]]; +/* { dg-error "redefinition of '#pragma omp declare mapper \\(S\\)'" "" { target c++ } .-3 } */ diff --git a/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C new file mode 100644 index 00000000000..fb3a0deb5ef --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/attrs-declare-mapper-6.C @@ -0,0 +1,22 @@ +/* { dg-do compile { target c++11 } } */ + +int x = 5; + +struct Q { + int *arr1; + int *arr2; + int *arr3; +}; + +[[omp::directive (declare mapper (struct Q myq) map(myq.arr2[0:x]))]]; + +struct R { + int *arr1; + int *arr2; + int *arr3; +}; + +[[omp::directive (declare mapper (struct R myr) map(myr.arr3[0:y]))]]; +/* { dg-error "'y' was not declared in this scope" "" { target c++ } .-1 } */ + +int y = 7; -- 2.31.1