aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-common.c
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-08-26 09:32:40 +0200
committerTobias Burnus <tobias@codesourcery.com>2020-08-26 09:32:40 +0200
commitd58e7173ef964ddac3ab3ad8cc97de8f9f3b32ee (patch)
tree4554d34bd8b9a0bfc30b1db3dd075f9c09dda41e /gcc/fortran/trans-common.c
parent4797a61cc5024fc9adf5918e9bb2b78988f9e4d4 (diff)
downloadgcc-d58e7173ef964ddac3ab3ad8cc97de8f9f3b32ee.zip
gcc-d58e7173ef964ddac3ab3ad8cc97de8f9f3b32ee.tar.gz
gcc-d58e7173ef964ddac3ab3ad8cc97de8f9f3b32ee.tar.bz2
Fortran: Add 'device_type' clause to OpenMP's declare target
gcc/fortran/ChangeLog: * gfortran.h (enum gfc_omp_device_type): New. (symbol_attribute, gfc_omp_clauses, gfc_common_head): Use it. * module.c (enum ab_attribute): Add AB_OMP_DEVICE_TYPE_HOST, AB_OMP_DEVICE_TYPE_NOHOST and AB_OMP_DEVICE_TYPE_ANY. (attr_bits, mio_symbol_attribute): Handle it. (load_commons, write_common_0): Handle omp_device_type flag. * openmp.c (enum omp_mask1): Add OMP_CLAUSE_DEVICE_TYPE (OMP_DECLARE_TARGET_CLAUSES): Likewise. (gfc_match_omp_clauses): Match 'device_type'. (gfc_match_omp_declare_target): Handle it. * trans-common.c (build_common_decl): Write device-type clause. * trans-decl.c (add_attributes_to_decl): Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/declare-target-4.f90: New test. * gfortran.dg/gomp/declare-target-5.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-common.c')
-rw-r--r--gcc/fortran/trans-common.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index c6383fc..52a9b2f 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -426,6 +426,8 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init)
/* If there is no backend_decl for the common block, build it. */
if (decl == NULL_TREE)
{
+ tree omp_clauses = NULL_TREE;
+
if (com->is_bind_c == 1 && com->binding_label)
decl = build_decl (input_location, VAR_DECL, identifier, union_type);
else
@@ -460,14 +462,33 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init)
if (com->threadprivate)
set_decl_tls_model (decl, decl_default_tls_model (decl));
+ if (com->omp_device_type != OMP_DEVICE_TYPE_UNSET)
+ {
+ tree c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_DEVICE_TYPE);
+ switch (com->omp_device_type)
+ {
+ case OMP_DEVICE_TYPE_HOST:
+ OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_HOST;
+ break;
+ case OMP_DEVICE_TYPE_NOHOST:
+ OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_NOHOST;
+ break;
+ case OMP_DEVICE_TYPE_ANY:
+ OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_ANY;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ omp_clauses = c;
+ }
if (com->omp_declare_target_link)
DECL_ATTRIBUTES (decl)
= tree_cons (get_identifier ("omp declare target link"),
- NULL_TREE, DECL_ATTRIBUTES (decl));
+ omp_clauses, DECL_ATTRIBUTES (decl));
else if (com->omp_declare_target)
DECL_ATTRIBUTES (decl)
= tree_cons (get_identifier ("omp declare target"),
- NULL_TREE, DECL_ATTRIBUTES (decl));
+ omp_clauses, DECL_ATTRIBUTES (decl));
/* Place the back end declaration for this common block in
GLOBAL_BINDING_LEVEL. */