aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2014-08-14 20:39:15 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2014-08-14 20:39:15 +0200
commitbc0229f9f6929e000bc638e26fcd25ff0e95b2ed (patch)
treef112e8c0d52e17d8eda54ec7f00375059153f751 /gcc/fortran
parentc194537c63180722ea6977000451174f5da1b40b (diff)
downloadgcc-bc0229f9f6929e000bc638e26fcd25ff0e95b2ed.zip
gcc-bc0229f9f6929e000bc638e26fcd25ff0e95b2ed.tar.gz
gcc-bc0229f9f6929e000bc638e26fcd25ff0e95b2ed.tar.bz2
gfortran.texi (caf_register_t): Add CAF_REGTYPE_CRITICAL.
gcc/fortran/ 2014-08-14 Tobias Burnus <burnus@net-b.de> * gfortran.texi (caf_register_t): Add CAF_REGTYPE_CRITICAL. (_gfortran_caf_register): Update for locking/critical. (_gfortran_caf_lock, _gfortran_caf_unlock): Add. * resolve.c (resolve_critical): New. (gfc_resolve_code): Call it. * trans-decl.c (gfor_fndecl_caf_critical, gfor_fndecl_caf_end_critical): Remove. (gfor_fndecl_caf_lock, gfor_fndecl_caf_unlock): Add. (gfc_build_builtin_function_decls): Remove critical, assign locking declarations. (generate_coarray_sym_init): Handle locking and critical variables. * trans-stmt.c (gfc_trans_critical): Add calls to lock/unlock libcaf functions. * trans.h (gfc_coarray_type): Update locking, add critical enum values. (gfor_fndecl_caf_critical, gfor_fndecl_caf_end_critical): Remove. (gfor_fndecl_caf_lock, gfor_fndecl_caf_unlock): Add. libgfortran/ 2014-08-14 Tobias Burnus <burnus@net-b.de> * caf/libcaf.h (caf_register_t): Update for critical. (_gfortran_caf_critical, _gfortran_caf_end_critical): Remove. (_gfortran_caf_lock, _gfortran_caf_unlock): Add. * caf/single.c (_gfortran_caf_register): Handle locking variables. (_gfortran_caf_sendget): Re-name args for consistency. (_gfortran_caf_lock, _gfortran_caf_unlock): Add. From-SVN: r213979
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog21
-rw-r--r--gcc/fortran/gfortran.texi121
-rw-r--r--gcc/fortran/resolve.c49
-rw-r--r--gcc/fortran/trans-decl.c43
-rw-r--r--gcc/fortran/trans-stmt.c15
-rw-r--r--gcc/fortran/trans.h9
6 files changed, 223 insertions, 35 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 50fda78..4a37198 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,26 @@
2014-08-14 Tobias Burnus <burnus@net-b.de>
+ * gfortran.texi (caf_register_t): Add CAF_REGTYPE_CRITICAL.
+ (_gfortran_caf_register): Update for locking/critical.
+ (_gfortran_caf_lock, _gfortran_caf_unlock): Add.
+ * resolve.c (resolve_critical): New.
+ (gfc_resolve_code): Call it.
+ * trans-decl.c (gfor_fndecl_caf_critical,
+ gfor_fndecl_caf_end_critical): Remove.
+ (gfor_fndecl_caf_lock, gfor_fndecl_caf_unlock): Add.
+ (gfc_build_builtin_function_decls): Remove critical,
+ assign locking declarations.
+ (generate_coarray_sym_init): Handle locking and
+ critical variables.
+ * trans-stmt.c (gfc_trans_critical): Add calls to
+ lock/unlock libcaf functions.
+ * trans.h (gfc_coarray_type): Update locking, add
+ critical enum values.
+ (gfor_fndecl_caf_critical, gfor_fndecl_caf_end_critical): Remove.
+ (gfor_fndecl_caf_lock, gfor_fndecl_caf_unlock): Add.
+
+2014-08-14 Tobias Burnus <burnus@net-b.de>
+
* gfortran.texi (Coarray Programming): Add first ABI
documentation.
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 5f6bf5d..0ce7226 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -157,7 +157,7 @@ Boston, MA 02110-1301, USA@*
@top Introduction
@cindex Introduction
-This manual documents the use of @command{gfortran},
+This manual documents the use of @command{gfortran},
the GNU Fortran compiler. You can find in this manual how to invoke
@command{gfortran}, as well as its features and incompatibilities.
@@ -290,13 +290,13 @@ It also helps developers to find bugs in the compiler itself.
@item
Provide information in the generated machine code that can
make it easier to find bugs in the program (using a debugging tool,
-called a @dfn{debugger}, such as the GNU Debugger @command{gdb}).
+called a @dfn{debugger}, such as the GNU Debugger @command{gdb}).
@item
Locate and gather machine code already generated to
perform actions requested by statements in the user's program.
This machine code is organized into @dfn{modules} and is located
-and @dfn{linked} to the user program.
+and @dfn{linked} to the user program.
@end itemize
The GNU Fortran compiler consists of several components:
@@ -2714,7 +2714,8 @@ are in a shared library. The following attributes are available:
@itemize
@item @code{DLLEXPORT} -- provide a global pointer to a pointer in the DLL
-@item @code{DLLIMPORT} -- reference the function or variable using a global pointer
+@item @code{DLLIMPORT} -- reference the function or variable using a
+global pointer
@end itemize
For dummy arguments, the @code{NO_ARG_CHECK} attribute can be used; in
@@ -2864,7 +2865,7 @@ if e.g. an input-output edit descriptor is invalid in a given standard.
Possible values are (bitwise or-ed) @code{GFC_STD_F77} (1),
@code{GFC_STD_F95_OBS} (2), @code{GFC_STD_F95_DEL} (4), @code{GFC_STD_F95}
(8), @code{GFC_STD_F2003} (16), @code{GFC_STD_GNU} (32),
-@code{GFC_STD_LEGACY} (64), @code{GFC_STD_F2008} (128),
+@code{GFC_STD_LEGACY} (64), @code{GFC_STD_F2008} (128),
@code{GFC_STD_F2008_OBS} (256) and GFC_STD_F2008_TS (512). Default:
@code{GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_F95 | GFC_STD_F2003
| GFC_STD_F2008 | GFC_STD_F2008_TS | GFC_STD_F2008_OBS | GFC_STD_F77
@@ -3103,7 +3104,7 @@ by-reference argument. Note that with the @option{-ff2c} option,
the argument passing is modified and no longer completely matches
the platform ABI. Some other Fortran compilers use @code{f2c}
semantic by default; this might cause problems with
-interoperablility.
+interoperablility.
GNU Fortran passes most arguments by reference, i.e. by passing a
pointer to the data. Note that the compiler might use a temporary
@@ -3215,7 +3216,8 @@ typedef enum caf_register_t {
CAF_REGTYPE_COARRAY_STATIC,
CAF_REGTYPE_COARRAY_ALLOC,
CAF_REGTYPE_LOCK_STATIC,
- CAF_REGTYPE_LOCK_ALLOC
+ CAF_REGTYPE_LOCK_ALLOC,
+ CAF_REGTYPE_CRITICAL
}
caf_register_t;
@end verbatim
@@ -3234,6 +3236,8 @@ caf_register_t;
* _gfortran_caf_send:: Sending data from a local image to a remote image
* _gfortran_caf_get:: Getting data from a remote image
* _gfortran_caf_sendget:: Sending data between remote images
+* _gfortran_caf_lock:: Locking a lock variable
+* _gfortran_caf_unlock:: Unlocking a lock variable
@end menu
@@ -3360,17 +3364,26 @@ value and, if not-@code{NULL}, @var{ERRMSG} shall be set to a string describing
the failure. The function shall return a pointer to the requested memory
for the local image as a call to @code{malloc} would do.
+For @code{CAF_REGTYPE_COARRAY_STATIC} and @code{CAF_REGTYPE_COARRAY_ALLOC},
+the passed size is the byte size requested. For @code{CAF_REGTYPE_LOCK_STATIC},
+@code{CAF_REGTYPE_LOCK_ALLOC} and @code{CAF_REGTYPE_CRITICAL} it is the array
+size or one for a scalar.
+
+
@item @emph{Syntax}:
@code{void *caf_register (size_t size, caf_register_t type, caf_token_t *token,
int *stat, char *errmsg, int errmsg_len)}
@item @emph{Arguments}:
@multitable @columnfractions .15 .70
-@item @var{size} @tab byte size of the coarray to be allocated
+@item @var{size} @tab For normal coarrays, the byte size of the coarray to be
+allocated; for lock types, the number of elements.
@item @var{type} @tab one of the caf_register_t types.
@item @var{token} @tab intent(out) An opaque pointer identifying the coarray.
-@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=; may be NULL
-@item @var{errmsg} @tab intent(out) When an error occurs, this will be set to an error message; may be NULL
+@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=;
+may be NULL
+@item @var{errmsg} @tab intent(out) When an error occurs, this will be set to
+an error message; may be NULL
@item @var{errmsg_len} @tab the buffer size of errmsg.
@end multitable
@@ -3383,6 +3396,13 @@ static memory is used. The token permits to identify the coarray; to the
processor, the token is a nonaliasing pointer. The library can, for instance,
store the base address of the coarray in the token, some handle or a more
complicated struct.
+
+For normal coarrays, the returned pointer is used for accesses on the local
+image. For lock types, the value shall only used for checking the allocation
+status. Note that for critical blocks, the locking is only required on one
+image; in the locking statement, the processor shall always pass always an
+image index of one for critical-block lock variables
+(@code{CAF_REGTYPE_CRITICAL}).
@end table
@@ -3402,8 +3422,10 @@ int errmsg_len)}
@item @emph{Arguments}:
@multitable @columnfractions .15 .70
-@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=; may be NULL
-@item @var{errmsg} @tab intent(out) When an error occurs, this will be set to an error message; may be NULL
+@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=;
+may be NULL
+@item @var{errmsg} @tab intent(out) When an error occurs, this will be set
+to an error message; may be NULL
@item @var{errmsg_len} @tab the buffer size of errmsg.
@end multitable
@@ -3549,6 +3571,79 @@ character kinds.
@end table
+@node _gfortran_caf_lock
+@subsection @code{_gfortran_caf_lock} --- Locking a lock variable
+@cindex Coarray, _gfortran_caf_lock
+
+@table @asis
+@item @emph{Description}:
+Acquire a lock on the given image on a scalar locking variable or for the
+given array element for an array-valued variable. If the @var{aquired_lock}
+is @code{NULL}, the function return after having obtained the lock. If it is
+nonnull, the result is is assigned the value true (one) when the lock could be
+obtained and false (zero) otherwise. Locking a lock variable which has already
+been locked by the same image is an error.
+
+@item @emph{Syntax}:
+@code{void _gfortran_caf_lock (caf_token_t token, size_t index, int image_index,
+int *aquired_lock, int *stat, char *errmsg, int errmsg_len)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .70
+@item @var{token} @tab intent(in) An opaque pointer identifying the coarray.
+@item @var{index} @tab Array index; first array index is 0. For scalars, it is
+always 0.
+@item @var{image_index} @tab The ID of the remote image; must be a positive
+number.
+@item @var{aquired_lock} @tab intent(out) If not NULL, it returns whether lock
+could be obtained
+@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=;
+may be NULL
+@item @var{errmsg} @tab intent(out) When an error occurs, this will be set to
+an error message; may be NULL
+@item @var{errmsg_len} @tab the buffer size of errmsg.
+@end multitable
+
+@item @emph{NOTES}
+This function is also called for critical blocks; for those, the array index
+is always zero and the image index is one. Libraries are permitted to use other
+images for critical-block locking variables.
+@end table
+
+
+@node _gfortran_caf_unlock
+@subsection @code{_gfortran_caf_lock} --- Unlocking a lock variable
+@cindex Coarray, _gfortran_caf_unlock
+
+@table @asis
+@item @emph{Description}:
+Release a lock on the given image on a scalar locking variable or for the
+given array element for an array-valued variable. Unlocking a lock variable
+which is unlocked or has been locked by a different image is an error.
+
+@item @emph{Syntax}:
+@code{void _gfortran_caf_unlock (caf_token_t token, size_t index, int image_index,
+int *stat, char *errmsg, int errmsg_len)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .70
+@item @var{token} @tab intent(in) An opaque pointer identifying the coarray.
+@item @var{index} @tab Array index; first array index is 0. For scalars, it is
+always 0.
+@item @var{image_index} @tab The ID of the remote image; must be a positive
+number.
+@item @var{stat} @tab intent(out) For allocatable coarrays, stores the STAT=;
+may be NULL
+@item @var{errmsg} @tab intent(out) When an error occurs, this will be set to
+an error message; may be NULL
+@item @var{errmsg_len} @tab the buffer size of errmsg.
+@end multitable
+
+@item @emph{NOTES}
+This function is also called for critical block; for those, the array index
+is always zero and the image index is one. Libraries are permitted to use other
+images for critical-block locking variables.
+@end table
@@ -3693,7 +3788,7 @@ order. Most of these are necessary to be fully compatible with
existing Fortran compilers, but they are not part of the official
J3 Fortran 95 standard.
-@subsection Compiler extensions:
+@subsection Compiler extensions:
@itemize @bullet
@item
User-specified alignment rules for structures.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 15d8dab..b6ce022 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8475,6 +8475,52 @@ resolve_lock_unlock (gfc_code *code)
static void
+resolve_critical (gfc_code *code)
+{
+ gfc_symtree *symtree;
+ gfc_symbol *lock_type;
+ char name[GFC_MAX_SYMBOL_LEN];
+ static int serial = 0;
+
+ if (gfc_option.coarray != GFC_FCOARRAY_LIB)
+ return;
+
+ symtree = gfc_find_symtree (gfc_current_ns->sym_root, "__lock_type@0");
+ if (symtree)
+ lock_type = symtree->n.sym;
+ else
+ {
+ if (gfc_get_sym_tree ("__lock_type@0", gfc_current_ns, &symtree,
+ false) != 0)
+ gcc_unreachable ();
+ lock_type = symtree->n.sym;
+ lock_type->attr.flavor = FL_DERIVED;
+ lock_type->attr.zero_comp = 1;
+ lock_type->from_intmod = INTMOD_ISO_FORTRAN_ENV;
+ lock_type->intmod_sym_id = ISOFORTRAN_LOCK_TYPE;
+ }
+
+ sprintf(name, "__lock_var@%d",serial++);
+ if (gfc_get_sym_tree (name, gfc_current_ns, &symtree, false) != 0)
+ gcc_unreachable ();
+
+ code->resolved_sym = symtree->n.sym;
+ symtree->n.sym->attr.flavor = FL_VARIABLE;
+ symtree->n.sym->attr.referenced = 1;
+ symtree->n.sym->attr.artificial = 1;
+ symtree->n.sym->attr.codimension = 1;
+ symtree->n.sym->ts.type = BT_DERIVED;
+ symtree->n.sym->ts.u.derived = lock_type;
+ symtree->n.sym->as = gfc_get_array_spec ();
+ symtree->n.sym->as->corank = 1;
+ symtree->n.sym->as->type = AS_EXPLICIT;
+ symtree->n.sym->as->cotype = AS_EXPLICIT;
+ symtree->n.sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind,
+ NULL, 1);
+}
+
+
+static void
resolve_sync (gfc_code *code)
{
/* Check imageset. The * case matches expr1 == NULL. */
@@ -9913,7 +9959,10 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
case EXEC_CONTINUE:
case EXEC_DT_END:
case EXEC_ASSIGN_CALL:
+ break;
+
case EXEC_CRITICAL:
+ resolve_critical (code);
break;
case EXEC_SYNC_ALL:
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index babe48f..bf91413 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -135,8 +135,6 @@ tree gfor_fndecl_caf_deregister;
tree gfor_fndecl_caf_get;
tree gfor_fndecl_caf_send;
tree gfor_fndecl_caf_sendget;
-tree gfor_fndecl_caf_critical;
-tree gfor_fndecl_caf_end_critical;
tree gfor_fndecl_caf_sync_all;
tree gfor_fndecl_caf_sync_images;
tree gfor_fndecl_caf_error_stop;
@@ -145,6 +143,8 @@ tree gfor_fndecl_caf_atomic_def;
tree gfor_fndecl_caf_atomic_ref;
tree gfor_fndecl_caf_atomic_cas;
tree gfor_fndecl_caf_atomic_op;
+tree gfor_fndecl_caf_lock;
+tree gfor_fndecl_caf_unlock;
tree gfor_fndecl_co_max;
tree gfor_fndecl_co_min;
tree gfor_fndecl_co_sum;
@@ -3368,12 +3368,6 @@ gfc_build_builtin_function_decls (void)
pvoid_type_node, pvoid_type_node, size_type_node, integer_type_node,
pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node);
- gfor_fndecl_caf_critical = gfc_build_library_function_decl (
- get_identifier (PREFIX("caf_critical")), void_type_node, 0);
-
- gfor_fndecl_caf_end_critical = gfc_build_library_function_decl (
- get_identifier (PREFIX("caf_end_critical")), void_type_node, 0);
-
gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node,
3, pint_type, pchar_type_node, integer_type_node);
@@ -3417,6 +3411,16 @@ gfc_build_builtin_function_decls (void)
integer_type_node, pvoid_type_node, pvoid_type_node, pint_type,
integer_type_node, integer_type_node);
+ gfor_fndecl_caf_lock = gfc_build_library_function_decl_with_spec (
+ get_identifier (PREFIX("caf_lock")), "R..WWW",
+ void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node,
+ pint_type, pint_type, pchar_type_node, integer_type_node);
+
+ gfor_fndecl_caf_unlock = gfc_build_library_function_decl_with_spec (
+ get_identifier (PREFIX("caf_unlock")), "R..WW",
+ void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node,
+ pint_type, pchar_type_node, integer_type_node);
+
gfor_fndecl_co_max = gfc_build_library_function_decl_with_spec (
get_identifier (PREFIX("caf_co_max")), "W.WW",
void_type_node, 6, pvoid_type_node, integer_type_node,
@@ -4694,6 +4698,8 @@ static void
generate_coarray_sym_init (gfc_symbol *sym)
{
tree tmp, size, decl, token;
+ bool is_lock_type;
+ int reg_type;
if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
|| sym->attr.use_assoc || !sym->attr.referenced
@@ -4704,11 +4710,20 @@ generate_coarray_sym_init (gfc_symbol *sym)
TREE_USED(decl) = 1;
gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
+ is_lock_type = sym->ts.type == BT_DERIVED
+ && sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
+ && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE;
+
/* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
to make sure the variable is not optimized away. */
DECL_PRESERVE_P (DECL_CONTEXT (decl)) = 1;
- size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
+ /* For lock types, we pass the array size as only the library knows the
+ size of the variable. */
+ if (is_lock_type)
+ size = gfc_index_one_node;
+ else
+ size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
/* Ensure that we do not have size=0 for zero-sized arrays. */
size = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
@@ -4725,17 +4740,17 @@ generate_coarray_sym_init (gfc_symbol *sym)
gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl)) != NULL_TREE);
token = gfc_build_addr_expr (ppvoid_type_node,
GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
-
+ if (is_lock_type)
+ reg_type = sym->attr.artificial ? GFC_CAF_CRITICAL : GFC_CAF_LOCK_STATIC;
+ else
+ reg_type = GFC_CAF_COARRAY_STATIC;
tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
- build_int_cst (integer_type_node,
- GFC_CAF_COARRAY_STATIC), /* type. */
+ build_int_cst (integer_type_node, reg_type),
token, null_pointer_node, /* token, stat. */
null_pointer_node, /* errgmsg, errmsg_len. */
build_int_cst (integer_type_node, 0));
-
gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl), tmp));
-
/* Handle "static" initializer. */
if (sym->value)
{
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 547e9c1..abd80e7 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -1111,13 +1111,18 @@ tree
gfc_trans_critical (gfc_code *code)
{
stmtblock_t block;
- tree tmp;
+ tree tmp, token = NULL_TREE;
gfc_start_block (&block);
if (gfc_option.coarray == GFC_FCOARRAY_LIB)
{
- tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_critical, 0);
+ token = gfc_get_symbol_decl (code->resolved_sym);
+ token = GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (token));
+ tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_lock, 7,
+ token, integer_zero_node, integer_one_node,
+ boolean_true_node, null_pointer_node,
+ null_pointer_node, integer_zero_node);
gfc_add_expr_to_block (&block, tmp);
}
@@ -1126,8 +1131,10 @@ gfc_trans_critical (gfc_code *code)
if (gfc_option.coarray == GFC_FCOARRAY_LIB)
{
- tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_end_critical,
- 0);
+ tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_unlock, 6,
+ token, integer_zero_node, integer_one_node,
+ null_pointer_node, null_pointer_node,
+ integer_zero_node);
gfc_add_expr_to_block (&block, tmp);
}
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index bae51bf..4703704 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -107,8 +107,9 @@ typedef enum
{
GFC_CAF_COARRAY_STATIC,
GFC_CAF_COARRAY_ALLOC,
- GFC_CAF_LOCK,
- GFC_CAF_LOCK_COMP
+ GFC_CAF_LOCK_STATIC,
+ GFC_CAF_LOCK_ALLOC,
+ GFC_CAF_CRITICAL
}
gfc_coarray_type;
@@ -714,8 +715,6 @@ extern GTY(()) tree gfor_fndecl_caf_deregister;
extern GTY(()) tree gfor_fndecl_caf_get;
extern GTY(()) tree gfor_fndecl_caf_send;
extern GTY(()) tree gfor_fndecl_caf_sendget;
-extern GTY(()) tree gfor_fndecl_caf_critical;
-extern GTY(()) tree gfor_fndecl_caf_end_critical;
extern GTY(()) tree gfor_fndecl_caf_sync_all;
extern GTY(()) tree gfor_fndecl_caf_sync_images;
extern GTY(()) tree gfor_fndecl_caf_error_stop;
@@ -724,6 +723,8 @@ extern GTY(()) tree gfor_fndecl_caf_atomic_def;
extern GTY(()) tree gfor_fndecl_caf_atomic_ref;
extern GTY(()) tree gfor_fndecl_caf_atomic_cas;
extern GTY(()) tree gfor_fndecl_caf_atomic_op;
+extern GTY(()) tree gfor_fndecl_caf_lock;
+extern GTY(()) tree gfor_fndecl_caf_unlock;
extern GTY(()) tree gfor_fndecl_co_max;
extern GTY(()) tree gfor_fndecl_co_min;
extern GTY(()) tree gfor_fndecl_co_sum;