diff mbox

[gomp4.5] Add support for target {enter,exit} data translation, some map clause diagnostics

Message ID 20160531184141.GI28550@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek May 31, 2016, 6:41 p.m. UTC
Hi!

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

2016-05-31  Jakub Jelinek  <jakub@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.


	Jakub
diff mbox

Patch

--- 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);
+    }
 }