diff --git gcc/builtin-types.def gcc/builtin-types.def
index e7bfaf9..59660cd 100644
--- gcc/builtin-types.def
+++ gcc/builtin-types.def
@@ -529,6 +529,9 @@ DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR,
 		     BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR,
 		     BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG,
 		     BT_BOOL, BT_UINT, BT_PTR)
+DEF_FUNCTION_TYPE_8 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_PTR,
+		     BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE,
+		     BT_PTR, BT_PTR, BT_PTR, BT_PTR)
 
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID)
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_INT_VAR, BT_INT)
diff --git gcc/fortran/types.def gcc/fortran/types.def
index 9bbee35..9ec752a 100644
--- gcc/fortran/types.def
+++ gcc/fortran/types.def
@@ -213,5 +213,8 @@ DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR,
 		     BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR,
 		     BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG,
 		     BT_BOOL, BT_UINT, BT_PTR)
+DEF_FUNCTION_TYPE_8 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_PTR,
+		     BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE,
+		     BT_PTR, BT_PTR, BT_PTR, BT_PTR)
 
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID)
diff --git gcc/oacc-builtins.def gcc/oacc-builtins.def
index a75e42d..5057e13 100644
--- gcc/oacc-builtins.def
+++ gcc/oacc-builtins.def
@@ -28,4 +28,5 @@ along with GCC; see the file COPYING3.  If not see
    See builtins.def for details.  */
 
 DEF_GOACC_BUILTIN (BUILT_IN_GOACC_PARALLEL, "GOACC_parallel",
-		   BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+		   BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_PTR,
+		   ATTR_NOTHROW_LIST)
diff --git gcc/omp-low.c gcc/omp-low.c
index e0f7d1d..ce99835 100644
--- gcc/omp-low.c
+++ gcc/omp-low.c
@@ -4886,7 +4886,7 @@ expand_oacc_parallel (struct omp_region *region)
     }
 
   /* Emit a library call to launch CHILD_FN.  */
-  tree t1, t2, t3, t4, device, c, clauses;
+  tree t1, t2, t3, t4, t5, device, c, clauses;
   enum built_in_function start_ix;
   location_t clause_loc;
 
@@ -4918,6 +4918,7 @@ expand_oacc_parallel (struct omp_region *region)
       t2 = build_zero_cst (ptr_type_node);
       t3 = t2;
       t4 = t2;
+      t5 = t2;
     }
   else
     {
@@ -4926,6 +4927,7 @@ expand_oacc_parallel (struct omp_region *region)
       t2 = build_fold_addr_expr (TREE_VEC_ELT (t, 0));
       t3 = build_fold_addr_expr (TREE_VEC_ELT (t, 1));
       t4 = build_fold_addr_expr (TREE_VEC_ELT (t, 2));
+      t5 = build_fold_addr_expr (TREE_VEC_ELT (t, 3));
     }
 
   gimple g;
@@ -4935,7 +4937,7 @@ expand_oacc_parallel (struct omp_region *region)
   tree openmp_target = build_zero_cst (ptr_type_node);
   tree fnaddr = build_fold_addr_expr (child_fn);
   g = gimple_build_call (builtin_decl_explicit (start_ix),
-			 7, device, fnaddr, openmp_target, t1, t2, t3, t4);
+			 8, device, fnaddr, openmp_target, t1, t2, t3, t4, t5);
   gimple_set_location (g, gimple_location (entry_stmt));
   gsi_insert_before (&gsi, g, GSI_SAME_STMT);
 }
@@ -8766,7 +8768,7 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	= create_tmp_var (ctx->record_type, ".omp_data_arr");
       DECL_NAMELESS (ctx->sender_decl) = 1;
       TREE_ADDRESSABLE (ctx->sender_decl) = 1;
-      t = make_tree_vec (3);
+      t = make_tree_vec (4);
       TREE_VEC_ELT (t, 0) = ctx->sender_decl;
       TREE_VEC_ELT (t, 1)
 	= create_tmp_var (build_array_type_nelts (size_type_node, map_cnt),
@@ -8777,15 +8779,24 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
       TREE_VEC_ELT (t, 2)
 	= create_tmp_var (build_array_type_nelts (unsigned_char_type_node,
 						  map_cnt),
-			  ".omp_data_kinds");
+			  ".omp_data_alignments");
       DECL_NAMELESS (TREE_VEC_ELT (t, 2)) = 1;
       TREE_ADDRESSABLE (TREE_VEC_ELT (t, 2)) = 1;
       TREE_STATIC (TREE_VEC_ELT (t, 2)) = 1;
+      TREE_VEC_ELT (t, 3)
+	= create_tmp_var (build_array_type_nelts (unsigned_char_type_node,
+						  map_cnt),
+			  ".omp_data_kinds");
+      DECL_NAMELESS (TREE_VEC_ELT (t, 3)) = 1;
+      TREE_ADDRESSABLE (TREE_VEC_ELT (t, 3)) = 1;
+      TREE_STATIC (TREE_VEC_ELT (t, 3)) = 1;
       gimple_oacc_parallel_set_data_arg (stmt, t);
 
       vec<constructor_elt, va_gc> *vsize;
+      vec<constructor_elt, va_gc> *valign;
       vec<constructor_elt, va_gc> *vkind;
       vec_alloc (vsize, map_cnt);
+      vec_alloc (valign, map_cnt);
       vec_alloc (vkind, map_cnt);
       unsigned int map_idx = 0;
 
@@ -8884,6 +8895,14 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (TREE_CODE (s) != INTEGER_CST)
 	      TREE_STATIC (TREE_VEC_ELT (t, 1)) = 0;
 
+	    unsigned int talign = TYPE_ALIGN_UNIT (TREE_TYPE (ovar));
+	    if (DECL_P (ovar) && DECL_ALIGN_UNIT (ovar) > talign)
+	      talign = DECL_ALIGN_UNIT (ovar);
+	    talign = ceil_log2 (talign);
+	    CONSTRUCTOR_APPEND_ELT (valign, purpose,
+				    build_int_cst (unsigned_char_type_node,
+						   talign));
+
 	    unsigned char tkind = 0;
 	    switch (OMP_CLAUSE_CODE (c))
 	      {
@@ -8899,14 +8918,10 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	      default:
 		gcc_unreachable ();
 	      }
-	    unsigned int talign = TYPE_ALIGN_UNIT (TREE_TYPE (ovar));
-	    if (DECL_P (ovar) && DECL_ALIGN_UNIT (ovar) > talign)
-	      talign = DECL_ALIGN_UNIT (ovar);
-	    talign = ceil_log2 (talign);
-	    tkind |= talign << 3;
 	    CONSTRUCTOR_APPEND_ELT (vkind, purpose,
 				    build_int_cst (unsigned_char_type_node,
 						   tkind));
+
 	    if (nc && nc != c)
 	      c = nc;
 	  }
@@ -8916,7 +8931,9 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
       DECL_INITIAL (TREE_VEC_ELT (t, 1))
 	= build_constructor (TREE_TYPE (TREE_VEC_ELT (t, 1)), vsize);
       DECL_INITIAL (TREE_VEC_ELT (t, 2))
-	= build_constructor (TREE_TYPE (TREE_VEC_ELT (t, 2)), vkind);
+	= build_constructor (TREE_TYPE (TREE_VEC_ELT (t, 2)), valign);
+      DECL_INITIAL (TREE_VEC_ELT (t, 3))
+	= build_constructor (TREE_TYPE (TREE_VEC_ELT (t, 3)), vkind);
       if (!TREE_STATIC (TREE_VEC_ELT (t, 1)))
 	{
 	  gimple_seq initlist = NULL;
diff --git libgomp/libgomp_g.h libgomp/libgomp_g.h
index 394f3a8..06d7750 100644
--- libgomp/libgomp_g.h
+++ libgomp/libgomp_g.h
@@ -217,6 +217,7 @@ extern void GOMP_teams (unsigned int, unsigned int);
 /* oacc-parallel.c */
 
 extern void GOACC_parallel (int, void (*) (void *), const void *,
-			    size_t, void **, size_t *, unsigned char *);
+			    size_t, void **, size_t *, unsigned char *,
+			    unsigned char *);
 
 #endif /* LIBGOMP_G_H */
diff --git libgomp/oacc-parallel.c libgomp/oacc-parallel.c
index 730b83b..6cc04e1 100644
--- libgomp/oacc-parallel.c
+++ libgomp/oacc-parallel.c
@@ -25,12 +25,24 @@
 
 /* This file handles the OpenACC parallel construct.  */
 
+#include "libgomp.h"
 #include "libgomp_g.h"
 
 void
 GOACC_parallel (int device, void (*fn) (void *), const void *openmp_target,
 		size_t mapnum, void **hostaddrs, size_t *sizes,
-		unsigned char *kinds)
+		unsigned char *alignments, unsigned char *kinds)
 {
+  size_t i;
+
+  for (i = 0; i < mapnum; ++i)
+    {
+      if (kinds[i] > 4)
+	gomp_fatal ("memory mapping kind %x for %zd is not yet supported",
+		    kinds[i], i);
+
+      kinds[i] |= alignments[i] << 3;
+    }
+
   GOMP_target (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds);
 }
diff --git libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
index b9bdffa..142c394 100644
--- libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
+++ libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
@@ -17,7 +17,8 @@ f (void *data)
 int main(void)
 {
   i = -1;
-  GOACC_parallel (0, f, (const void *) 0, 0, (void *) 0, (void *) 0, (void *) 0);
+  GOACC_parallel (0, f, (const void *) 0,
+		  0, (void *) 0, (void *) 0, (void *) 0, (void *) 0);
   if (i != 42)
     abort ();
 
