@@ -1,3 +1,7 @@
+2023-08-18 Sandra Loosemore <sandra@codesourcery.com>
+
+ * c-omp.cc (c_omp_directives): Uncomment "declare mapper" entry.
+
2023-08-10 Julian Brown <julian@codesourcery.com>
* c-common.h (c_omp_region_type): Add C_ORT_UPDATE and C_ORT_OMP_UPDATE
@@ -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,
@@ -1,3 +1,8 @@
+2023-08-18 Sandra Loosemore <sandra@codesourcery.com>
+
+ * parser.cc (cp_parser_omp_declare_mapper): Allow commas between
+ clauses.
+
2023-08-18 Sandra Loosemore <sandra@codesourcery.com>
* parser.cc (analyze_metadirective_body): Handle CPP_PRAGMA and
@@ -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)
{
@@ -1,3 +1,10 @@
+2023-08-18 Sandra Loosemore <sandra@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 <sandra@codesourcery.com>
* g++.dg/gomp/attrs-metadirective-1.C: New file.
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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++ } } } */
new file mode 100644
@@ -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 } */
new file mode 100644
@@ -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;