aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/module.c
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-07-29 10:37:44 +0200
committerTobias Burnus <tobias@codesourcery.com>2020-07-29 10:37:44 +0200
commit269322ece17202632bc354e9c510e4a5bd6ad84b (patch)
tree0f455436d3c7c8d20fa70bb68296c9e9445fb3b1 /gcc/fortran/module.c
parent5c180464b7b0827b3cc07a78e96dfe55352db33f (diff)
downloadgcc-269322ece17202632bc354e9c510e4a5bd6ad84b.zip
gcc-269322ece17202632bc354e9c510e4a5bd6ad84b.tar.gz
gcc-269322ece17202632bc354e9c510e4a5bd6ad84b.tar.bz2
OpenMP: Add 'omp requires' to Fortran (mostly parsing)
gcc/fortran/ChangeLog: * gfortran.h (enum gfc_statement): Add ST_OMP_REQUIRES. (enum gfc_omp_requires_kind): New. (enum gfc_omp_atomic_op): Add GFC_OMP_ATOMIC_ACQ_REL. (struct gfc_namespace): Add omp_requires and omp_target_seen. (gfc_omp_requires_add_clause, (gfc_check_omp_requires): New. * match.h (gfc_match_omp_requires): New. * module.c (enum ab_attribute, attr_bits): Add omp requires clauses. (mio_symbol_attribute): Read/write them. * openmp.c (gfc_check_omp_requires, (gfc_omp_requires_add_clause, gfc_match_omp_requires): New. (gfc_match_omp_oacc_atomic): Use requires's default mem-order. * parse.c (decode_omp_directive): Match requires, set omp_target_seen. (gfc_ascii_statement): Handle ST_OMP_REQUIRES. * trans-openmp.c (gfc_trans_omp_atomic): Handle GFC_OMP_ATOMIC_ACQ_REL. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/requires-1.f90: New test. * gfortran.dg/gomp/requires-2.f90: New test. * gfortran.dg/gomp/requires-3.f90: New test. * gfortran.dg/gomp/requires-4.f90: New test. * gfortran.dg/gomp/requires-5.f90: New test. * gfortran.dg/gomp/requires-6.f90: New test. * gfortran.dg/gomp/requires-7.f90: New test. * gfortran.dg/gomp/requires-8.f90: New test. * gfortran.dg/gomp/requires-9.f90: New test.
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r--gcc/fortran/module.c73
1 files changed, 71 insertions, 2 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index eccf92b..384d0ae 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -2047,7 +2047,11 @@ enum ab_attribute
AB_OMP_DECLARE_TARGET_LINK, AB_PDT_KIND, AB_PDT_LEN, AB_PDT_TYPE,
AB_PDT_TEMPLATE, AB_PDT_ARRAY, AB_PDT_STRING,
AB_OACC_ROUTINE_LOP_GANG, AB_OACC_ROUTINE_LOP_WORKER,
- AB_OACC_ROUTINE_LOP_VECTOR, AB_OACC_ROUTINE_LOP_SEQ
+ AB_OACC_ROUTINE_LOP_VECTOR, AB_OACC_ROUTINE_LOP_SEQ,
+ AB_OMP_REQ_REVERSE_OFFLOAD, AB_OMP_REQ_UNIFIED_ADDRESS,
+ AB_OMP_REQ_UNIFIED_SHARED_MEMORY, AB_OMP_REQ_DYNAMIC_ALLOCATORS,
+ AB_OMP_REQ_MEM_ORDER_SEQ_CST, AB_OMP_REQ_MEM_ORDER_ACQ_REL,
+ AB_OMP_REQ_MEM_ORDER_RELAXED
};
static const mstring attr_bits[] =
@@ -2121,6 +2125,13 @@ static const mstring attr_bits[] =
minit ("OACC_ROUTINE_LOP_WORKER", AB_OACC_ROUTINE_LOP_WORKER),
minit ("OACC_ROUTINE_LOP_VECTOR", AB_OACC_ROUTINE_LOP_VECTOR),
minit ("OACC_ROUTINE_LOP_SEQ", AB_OACC_ROUTINE_LOP_SEQ),
+ minit ("OMP_REQ_REVERSE_OFFLOAD", AB_OMP_REQ_REVERSE_OFFLOAD),
+ minit ("OMP_REQ_UNIFIED_ADDRESS", AB_OMP_REQ_UNIFIED_ADDRESS),
+ minit ("OMP_REQ_UNIFIED_SHARED_MEMORY", AB_OMP_REQ_UNIFIED_SHARED_MEMORY),
+ minit ("OMP_REQ_DYNAMIC_ALLOCATORS", AB_OMP_REQ_DYNAMIC_ALLOCATORS),
+ minit ("OMP_REQ_MEM_ORDER_SEQ_CST", AB_OMP_REQ_MEM_ORDER_SEQ_CST),
+ minit ("OMP_REQ_MEM_ORDER_ACQ_REL", AB_OMP_REQ_MEM_ORDER_ACQ_REL),
+ minit ("OMP_REQ_MEM_ORDER_RELAXED", AB_OMP_REQ_MEM_ORDER_RELAXED),
minit (NULL, -1)
};
@@ -2366,8 +2377,27 @@ mio_symbol_attribute (symbol_attribute *attr)
gcc_unreachable ();
}
+ if (attr->flavor == FL_MODULE && gfc_current_ns->omp_requires)
+ {
+ if (gfc_current_ns->omp_requires & OMP_REQ_REVERSE_OFFLOAD)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_REVERSE_OFFLOAD, attr_bits);
+ if (gfc_current_ns->omp_requires & OMP_REQ_UNIFIED_ADDRESS)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_UNIFIED_ADDRESS, attr_bits);
+ if (gfc_current_ns->omp_requires & OMP_REQ_UNIFIED_SHARED_MEMORY)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_UNIFIED_SHARED_MEMORY, attr_bits);
+ if (gfc_current_ns->omp_requires & OMP_REQ_DYNAMIC_ALLOCATORS)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_DYNAMIC_ALLOCATORS, attr_bits);
+ if ((gfc_current_ns->omp_requires & OMP_REQ_ATOMIC_MEM_ORDER_MASK)
+ == OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_MEM_ORDER_SEQ_CST, attr_bits);
+ if ((gfc_current_ns->omp_requires & OMP_REQ_ATOMIC_MEM_ORDER_MASK)
+ == OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_MEM_ORDER_ACQ_REL, attr_bits);
+ if ((gfc_current_ns->omp_requires & OMP_REQ_ATOMIC_MEM_ORDER_MASK)
+ == OMP_REQ_ATOMIC_MEM_ORDER_RELAXED)
+ MIO_NAME (ab_attribute) (AB_OMP_REQ_MEM_ORDER_RELAXED, attr_bits);
+ }
mio_rparen ();
-
}
else
{
@@ -2592,6 +2622,45 @@ mio_symbol_attribute (symbol_attribute *attr)
verify_OACC_ROUTINE_LOP_NONE (attr->oacc_routine_lop);
attr->oacc_routine_lop = OACC_ROUTINE_LOP_SEQ;
break;
+ case AB_OMP_REQ_REVERSE_OFFLOAD:
+ gfc_omp_requires_add_clause (OMP_REQ_REVERSE_OFFLOAD,
+ "reverse_offload",
+ &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_UNIFIED_ADDRESS:
+ gfc_omp_requires_add_clause (OMP_REQ_UNIFIED_ADDRESS,
+ "unified_address",
+ &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_UNIFIED_SHARED_MEMORY:
+ gfc_omp_requires_add_clause (OMP_REQ_UNIFIED_SHARED_MEMORY,
+ "unified_shared_memory",
+ &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_DYNAMIC_ALLOCATORS:
+ gfc_omp_requires_add_clause (OMP_REQ_DYNAMIC_ALLOCATORS,
+ "dynamic_allocators",
+ &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_MEM_ORDER_SEQ_CST:
+ gfc_omp_requires_add_clause (OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST,
+ "seq_cst", &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_MEM_ORDER_ACQ_REL:
+ gfc_omp_requires_add_clause (OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL,
+ "acq_rel", &gfc_current_locus,
+ module_name);
+ break;
+ case AB_OMP_REQ_MEM_ORDER_RELAXED:
+ gfc_omp_requires_add_clause (OMP_REQ_ATOMIC_MEM_ORDER_RELAXED,
+ "relaxed", &gfc_current_locus,
+ module_name);
+ break;
}
}
}