1 /* Common declarations for all of GNU Fortran libcaf implementations.
2 Copyright (C) 2011-2016 Free Software Foundation, Inc.
3 Contributed by Tobias Burnus <burnus@net-b.de>
5 This file is part of the GNU Fortran Coarray Runtime Library (libcaf).
7 Libcaf is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 Libcaf is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
30 #include <stddef.h> /* For size_t. */
31 #include <stdint.h> /* For int32_t. */
33 #include "libgfortran.h"
37 #define __attribute__(x)
39 #define unlikely(x) (x)
41 #define likely(x) __builtin_expect(!!(x), 1)
42 #define unlikely(x) __builtin_expect(!!(x), 0)
45 /* Definitions of the Fortran 2008 standard; need to kept in sync with
46 ISO_FORTRAN_ENV, cf. libgfortran.h. */
47 #define STAT_UNLOCKED 0
49 #define STAT_LOCKED_OTHER_IMAGE 2
50 #define STAT_STOPPED_IMAGE 6000
53 /* Describes what type of array we are registerring. Keep in sync with
54 gcc/fortran/trans.h. */
55 typedef enum caf_register_t
{
56 CAF_REGTYPE_COARRAY_STATIC
,
57 CAF_REGTYPE_COARRAY_ALLOC
,
58 CAF_REGTYPE_LOCK_STATIC
,
59 CAF_REGTYPE_LOCK_ALLOC
,
61 CAF_REGTYPE_EVENT_STATIC
,
62 CAF_REGTYPE_EVENT_ALLOC
66 typedef void* caf_token_t
;
67 typedef gfc_array_void gfc_descriptor_t
;
69 /* Linked list of static coarrays registered. */
70 typedef struct caf_static_t
{
72 struct caf_static_t
*prev
;
76 /* When there is a vector subscript in this dimension, nvec == 0, otherwise,
77 lower_bound, upper_bound, stride contains the bounds relative to the declared
78 bounds; kind denotes the integer kind of the elements of vector[]. */
79 typedef struct caf_vector_t
{
87 ptrdiff_t lower_bound
, upper_bound
, stride
;
93 typedef enum caf_ref_type_t
{
94 /* Reference a component of a derived type, either regular one or an
95 allocatable or pointer type. For regular ones idx in caf_reference_t is
98 /* Reference an allocatable array. */
100 /* Reference a non-allocatable/non-pointer array. */
104 typedef enum caf_array_ref_t
{
105 /* No array ref. This terminates the array ref. */
106 CAF_ARR_REF_NONE
= 0,
107 /* Reference array elements given by a vector. Only for this mode
108 caf_reference_t.u.a.dim[i].v is valid. */
110 /* A full array ref (:). */
112 /* Reference a range on elements given by start, end and stride. */
114 /* Only a single item is referenced given in the start member. */
116 /* An array ref of the kind (i:), where i is an arbitrary valid index in the
117 array. The index i is given in the start member. */
118 CAF_ARR_REF_OPEN_END
,
119 /* An array ref of the kind (:i), where the lower bound of the array ref
120 is given by the remote side. The index i is given in the end member. */
121 CAF_ARR_REF_OPEN_START
124 /* References to remote components of a derived type. */
125 typedef struct caf_reference_t
{
126 /* A pointer to the next ref or NULL. */
127 struct caf_reference_t
*next
;
128 /* The type of the reference. */
129 /* caf_ref_type_t, replaced by int to allow specification in fortran FE. */
131 /* The size of an item referenced in bytes. I.e. in an array ref this is
132 the factor to advance the array pointer with to get to the next item.
133 For component refs this gives just the size of the element referenced. */
137 /* The offset (in bytes) of the component in the derived type. */
139 /* The offset (in bytes) to the caf_token associated with this
140 component. NULL, when not allocatable/pointer ref. */
141 ptrdiff_t caf_token_offset
;
144 /* The mode of the array ref. See CAF_ARR_REF_*. */
145 /* caf_array_ref_t, replaced by unsigend char to allow specification in
147 unsigned char mode
[GFC_MAX_DIMENSIONS
];
148 /* The type of a static array. Unset for array's with descriptors. */
149 int static_array_type
;
150 /* Subscript refs (s) or vector refs (v). */
153 /* The start and end boundary of the ref and the stride. */
154 index_type start
, end
, stride
;
157 /* nvec entries of kind giving the elements to reference. */
159 /* The number of entries in vector. */
161 /* The integer kind used for the elements in vector. */
164 } dim
[GFC_MAX_DIMENSIONS
];
169 void _gfortran_caf_init (int *, char ***);
170 void _gfortran_caf_finalize (void);
172 int _gfortran_caf_this_image (int);
173 int _gfortran_caf_num_images (int, int);
175 void _gfortran_caf_register (size_t, caf_register_t
, caf_token_t
*,
176 gfc_descriptor_t
*, int *, char *, int);
177 void _gfortran_caf_deregister (caf_token_t
*, int *, char *, int);
179 void _gfortran_caf_sync_all (int *, char *, int);
180 void _gfortran_caf_sync_memory (int *, char *, int);
181 void _gfortran_caf_sync_images (int, int[], int *, char *, int);
183 void _gfortran_caf_stop_numeric (int32_t)
184 __attribute__ ((noreturn
));
185 void _gfortran_caf_stop_str (const char *, int32_t)
186 __attribute__ ((noreturn
));
187 void _gfortran_caf_error_stop_str (const char *, int32_t)
188 __attribute__ ((noreturn
));
189 void _gfortran_caf_error_stop (int32_t) __attribute__ ((noreturn
));
191 void _gfortran_caf_co_broadcast (gfc_descriptor_t
*, int, int *, char *, int);
192 void _gfortran_caf_co_sum (gfc_descriptor_t
*, int, int *, char *, int);
193 void _gfortran_caf_co_min (gfc_descriptor_t
*, int, int *, char *, int, int);
194 void _gfortran_caf_co_max (gfc_descriptor_t
*, int, int *, char *, int, int);
195 void _gfortran_caf_co_reduce (gfc_descriptor_t
*, void* (*) (void *, void*),
196 int, int, int *, char *, int, int);
198 void _gfortran_caf_get (caf_token_t
, size_t, int, gfc_descriptor_t
*,
199 caf_vector_t
*, gfc_descriptor_t
*, int, int, bool,
201 void _gfortran_caf_send (caf_token_t
, size_t, int, gfc_descriptor_t
*,
202 caf_vector_t
*, gfc_descriptor_t
*, int, int, bool,
204 void _gfortran_caf_sendget (caf_token_t
, size_t, int, gfc_descriptor_t
*,
205 caf_vector_t
*, caf_token_t
, size_t, int,
206 gfc_descriptor_t
*, caf_vector_t
*, int, int, bool);
208 void _gfortran_caf_get_by_ref (caf_token_t token
, int image_idx
,
209 gfc_descriptor_t
*dst
, caf_reference_t
*refs
, int dst_kind
,
210 int src_kind
, bool may_require_tmp
, bool dst_reallocatable
, int *stat
);
211 void _gfortran_caf_send_by_ref (caf_token_t token
, int image_index
,
212 gfc_descriptor_t
*src
, caf_reference_t
*refs
, int dst_kind
,
213 int src_kind
, bool may_require_tmp
, bool dst_reallocatable
, int *stat
);
214 void _gfortran_caf_sendget_by_ref (
215 caf_token_t dst_token
, int dst_image_index
, caf_reference_t
*dst_refs
,
216 caf_token_t src_token
, int src_image_index
, caf_reference_t
*src_refs
,
217 int dst_kind
, int src_kind
, bool may_require_tmp
, int *dst_stat
,
220 void _gfortran_caf_atomic_define (caf_token_t
, size_t, int, void *, int *,
222 void _gfortran_caf_atomic_ref (caf_token_t
, size_t, int, void *, int *,
224 void _gfortran_caf_atomic_cas (caf_token_t
, size_t, int, void *, void *,
225 void *, int *, int, int);
226 void _gfortran_caf_atomic_op (int, caf_token_t
, size_t, int, void *, void *,
229 void _gfortran_caf_lock (caf_token_t
, size_t, int, int *, int *, char *, int);
230 void _gfortran_caf_unlock (caf_token_t
, size_t, int, int *, char *, int);
231 void _gfortran_caf_event_post (caf_token_t
, size_t, int, int *, char *, int);
232 void _gfortran_caf_event_wait (caf_token_t
, size_t, int, int *, char *, int);
233 void _gfortran_caf_event_query (caf_token_t
, size_t, int, int *, int *);
235 #endif /* LIBCAF_H */