2016-05-02 Arnaud Charlet <charlet@adacore.com>
[official-gcc.git] / libgfortran / caf / libcaf.h
blob01a33f9d0ee9f88727f52be86f914047a7068502
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)
10 any later version.
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/>. */
26 #ifndef LIBCAF_H
27 #define LIBCAF_H
29 #include <stdbool.h>
30 #include <stddef.h> /* For size_t. */
31 #include <stdint.h> /* For int32_t. */
33 #include "libgfortran.h"
35 #if 0
36 #ifndef __GNUC__
37 #define __attribute__(x)
38 #define likely(x) (x)
39 #define unlikely(x) (x)
40 #else
41 #define likely(x) __builtin_expect(!!(x), 1)
42 #define unlikely(x) __builtin_expect(!!(x), 0)
43 #endif
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
48 #define STAT_LOCKED 1
49 #define STAT_LOCKED_OTHER_IMAGE 2
50 #define STAT_STOPPED_IMAGE 6000
51 #endif
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,
60 CAF_REGTYPE_CRITICAL,
61 CAF_REGTYPE_EVENT_STATIC,
62 CAF_REGTYPE_EVENT_ALLOC
64 caf_register_t;
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 {
71 caf_token_t token;
72 struct caf_static_t *prev;
74 caf_static_t;
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 {
80 size_t nvec;
81 union {
82 struct {
83 void *vector;
84 int kind;
85 } v;
86 struct {
87 ptrdiff_t lower_bound, upper_bound, stride;
88 } triplet;
89 } u;
91 caf_vector_t;
94 void _gfortran_caf_init (int *, char ***);
95 void _gfortran_caf_finalize (void);
97 int _gfortran_caf_this_image (int);
98 int _gfortran_caf_num_images (int, int);
100 void *_gfortran_caf_register (size_t, caf_register_t, caf_token_t *, int *,
101 char *, int);
102 void _gfortran_caf_deregister (caf_token_t *, int *, char *, int);
104 void _gfortran_caf_sync_all (int *, char *, int);
105 void _gfortran_caf_sync_memory (int *, char *, int);
106 void _gfortran_caf_sync_images (int, int[], int *, char *, int);
108 void _gfortran_caf_stop_numeric (int32_t)
109 __attribute__ ((noreturn));
110 void _gfortran_caf_stop_str (const char *, int32_t)
111 __attribute__ ((noreturn));
112 void _gfortran_caf_error_stop_str (const char *, int32_t)
113 __attribute__ ((noreturn));
114 void _gfortran_caf_error_stop (int32_t) __attribute__ ((noreturn));
116 void _gfortran_caf_co_broadcast (gfc_descriptor_t *, int, int *, char *, int);
117 void _gfortran_caf_co_sum (gfc_descriptor_t *, int, int *, char *, int);
118 void _gfortran_caf_co_min (gfc_descriptor_t *, int, int *, char *, int, int);
119 void _gfortran_caf_co_max (gfc_descriptor_t *, int, int *, char *, int, int);
120 void _gfortran_caf_co_reduce (gfc_descriptor_t *, void* (*) (void *, void*),
121 int, int, int *, char *, int, int);
123 void _gfortran_caf_get (caf_token_t, size_t, int, gfc_descriptor_t *,
124 caf_vector_t *, gfc_descriptor_t *, int, int, bool);
125 void _gfortran_caf_send (caf_token_t, size_t, int, gfc_descriptor_t *,
126 caf_vector_t *, gfc_descriptor_t *, int, int, bool);
127 void _gfortran_caf_sendget (caf_token_t, size_t, int, gfc_descriptor_t *,
128 caf_vector_t *, caf_token_t, size_t, int,
129 gfc_descriptor_t *, caf_vector_t *, int, int, bool);
131 void _gfortran_caf_atomic_define (caf_token_t, size_t, int, void *, int *,
132 int, int);
133 void _gfortran_caf_atomic_ref (caf_token_t, size_t, int, void *, int *,
134 int, int);
135 void _gfortran_caf_atomic_cas (caf_token_t, size_t, int, void *, void *,
136 void *, int *, int, int);
137 void _gfortran_caf_atomic_op (int, caf_token_t, size_t, int, void *, void *,
138 int *, int, int);
140 void _gfortran_caf_lock (caf_token_t, size_t, int, int *, int *, char *, int);
141 void _gfortran_caf_unlock (caf_token_t, size_t, int, int *, char *, int);
142 void _gfortran_caf_event_post (caf_token_t, size_t, int, int *, char *, int);
143 void _gfortran_caf_event_wait (caf_token_t, size_t, int, int *, char *, int);
144 void _gfortran_caf_event_query (caf_token_t, size_t, int, int *, int *);
146 #endif /* LIBCAF_H */