Hi!

No testcases yet, tested on x86_64-linux, committed to gomp-4_5-branch.

2016-05-31  Jakub Jelinek  <ja...@redhat.com>

        * trans-openmp.c (gfc_trans_omp_target_enter_data,
        gfc_trans_omp_target_exit_data): New functions.
        (gfc_trans_omp_directive): Handle EXEC_OMP_TARGET_ENTER_DATA
        and EXEC_OMP_TARGET_EXIT_DATA.
        * openmp.c (resolve_omp_clauses): Diagnose map kinds not allowed
        for various constructs.  Diagnose target {enter ,exit ,}data without
        any map clauses.

--- gcc/fortran/trans-openmp.c.jj       2016-05-31 14:39:50.000000000 +0200
+++ gcc/fortran/trans-openmp.c  2016-05-31 18:32:37.742582958 +0200
@@ -4775,6 +4775,36 @@ gfc_trans_omp_target_data (gfc_code *cod
 }
 
 static tree
+gfc_trans_omp_target_enter_data (gfc_code *code)
+{
+  stmtblock_t block;
+  tree stmt, omp_clauses;
+
+  gfc_start_block (&block);
+  omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
+                                      code->loc);
+  stmt = build1_loc (input_location, OMP_TARGET_ENTER_DATA, void_type_node,
+                    omp_clauses);
+  gfc_add_expr_to_block (&block, stmt);
+  return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_target_exit_data (gfc_code *code)
+{
+  stmtblock_t block;
+  tree stmt, omp_clauses;
+
+  gfc_start_block (&block);
+  omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
+                                      code->loc);
+  stmt = build1_loc (input_location, OMP_TARGET_EXIT_DATA, void_type_node,
+                    omp_clauses);
+  gfc_add_expr_to_block (&block, stmt);
+  return gfc_finish_block (&block);
+}
+
+static tree
 gfc_trans_omp_target_update (gfc_code *code)
 {
   stmtblock_t block;
@@ -5060,6 +5090,10 @@ gfc_trans_omp_directive (gfc_code *code)
       return gfc_trans_omp_target (code);
     case EXEC_OMP_TARGET_DATA:
       return gfc_trans_omp_target_data (code);
+    case EXEC_OMP_TARGET_ENTER_DATA:
+      return gfc_trans_omp_target_enter_data (code);
+    case EXEC_OMP_TARGET_EXIT_DATA:
+      return gfc_trans_omp_target_exit_data (code);
     case EXEC_OMP_TARGET_UPDATE:
       return gfc_trans_omp_target_update (code);
     case EXEC_OMP_TASK:
--- gcc/fortran/openmp.c.jj     2016-05-31 16:20:07.000000000 +0200
+++ gcc/fortran/openmp.c        2016-05-31 19:33:55.339516471 +0200
@@ -4218,6 +4218,62 @@ resolve_omp_clauses (gfc_code *code, gfc
                    else
                      resolve_oacc_data_clauses (n->sym, n->where, name);
                  }
+               if (list == OMP_LIST_MAP && !openacc)
+                 switch (code->op)
+                   {
+                   case EXEC_OMP_TARGET:
+                   case EXEC_OMP_TARGET_DATA:
+                     switch (n->u.map_op)
+                       {
+                       case OMP_MAP_TO:
+                       case OMP_MAP_ALWAYS_TO:
+                       case OMP_MAP_FROM:
+                       case OMP_MAP_ALWAYS_FROM:
+                       case OMP_MAP_TOFROM:
+                       case OMP_MAP_ALWAYS_TOFROM:
+                       case OMP_MAP_ALLOC:
+                         break;
+                       default:
+                         gfc_error ("TARGET%s with map-type other than TO, "
+                                    "FROM, TOFROM, or ALLOC on MAP clause "
+                                    "at %L",
+                                    code->op == EXEC_OMP_TARGET
+                                    ? "" : " DATA", &n->where);
+                         break;
+                       }
+                     break;
+                   case EXEC_OMP_TARGET_ENTER_DATA:
+                     switch (n->u.map_op)
+                       {
+                       case OMP_MAP_TO:
+                       case OMP_MAP_ALWAYS_TO:
+                       case OMP_MAP_ALLOC:
+                         break;
+                       default:
+                         gfc_error ("TARGET ENTER DATA with map-type other "
+                                    "than TO, or ALLOC on MAP clause at %L",
+                                    &n->where);
+                         break;
+                       }
+                     break;
+                   case EXEC_OMP_TARGET_EXIT_DATA:
+                     switch (n->u.map_op)
+                       {
+                       case OMP_MAP_FROM:
+                       case OMP_MAP_ALWAYS_FROM:
+                       case OMP_MAP_RELEASE:
+                       case OMP_MAP_DELETE:
+                         break;
+                       default:
+                         gfc_error ("TARGET EXIT DATA with map-type other "
+                                    "than FROM, RELEASE, or DELETE on MAP "
+                                    "clause at %L", &n->where);
+                         break;
+                       }
+                     break;
+                   default:
+                     break;
+                   }
              }
 
            if (list != OMP_LIST_DEPEND)
@@ -4533,6 +4589,20 @@ resolve_omp_clauses (gfc_code *code, gfc
   if (omp_clauses->depend_source && code->op != EXEC_OMP_ORDERED)
     gfc_error ("SOURCE dependence type only allowed "
               "on ORDERED directive at %L", &code->loc);
+  if (!openacc && code && omp_clauses->lists[OMP_LIST_MAP] == NULL)
+    {
+      const char *p = NULL;
+      switch (code->op)
+       {
+       case EXEC_OMP_TARGET_DATA: p = "TARGET DATA"; break;
+       case EXEC_OMP_TARGET_ENTER_DATA: p = "TARGET ENTER DATA"; break;
+       case EXEC_OMP_TARGET_EXIT_DATA: p = "TARGET EXIT DATA"; break;
+       default: break;
+       }
+      if (p)
+       gfc_error ("%s must contain at least one MAP clause at %L",
+                  p, &code->loc);
+    }
 }
 
 

        Jakub

Reply via email to