1/* Copyright (C) 2005-2015 Free Software Foundation, Inc.
2   Contributed by Jakub Jelinek <jakub@redhat.com>.
3
4   This file is part of the GNU Offloading and Multi Processing Library
5   (libgomp).
6
7   Libgomp is free software; you can redistribute it and/or modify it
8   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.
11
12   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
13   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15   more details.
16
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.
20
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/>.  */
25
26/* This file contains Fortran wrapper routines.  */
27
28#include "libgomp.h"
29#include "libgomp_f.h"
30#include <stdlib.h>
31#include <limits.h>
32
33#ifdef HAVE_ATTRIBUTE_ALIAS
34/* Use internal aliases if possible.  */
35# ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
36ialias_redirect (omp_init_lock)
37ialias_redirect (omp_init_nest_lock)
38ialias_redirect (omp_destroy_lock)
39ialias_redirect (omp_destroy_nest_lock)
40ialias_redirect (omp_set_lock)
41ialias_redirect (omp_set_nest_lock)
42ialias_redirect (omp_unset_lock)
43ialias_redirect (omp_unset_nest_lock)
44ialias_redirect (omp_test_lock)
45ialias_redirect (omp_test_nest_lock)
46# endif
47ialias_redirect (omp_set_dynamic)
48ialias_redirect (omp_set_nested)
49ialias_redirect (omp_set_num_threads)
50ialias_redirect (omp_get_dynamic)
51ialias_redirect (omp_get_nested)
52ialias_redirect (omp_in_parallel)
53ialias_redirect (omp_get_max_threads)
54ialias_redirect (omp_get_num_procs)
55ialias_redirect (omp_get_num_threads)
56ialias_redirect (omp_get_thread_num)
57ialias_redirect (omp_get_wtick)
58ialias_redirect (omp_get_wtime)
59ialias_redirect (omp_set_schedule)
60ialias_redirect (omp_get_schedule)
61ialias_redirect (omp_get_thread_limit)
62ialias_redirect (omp_set_max_active_levels)
63ialias_redirect (omp_get_max_active_levels)
64ialias_redirect (omp_get_level)
65ialias_redirect (omp_get_ancestor_thread_num)
66ialias_redirect (omp_get_team_size)
67ialias_redirect (omp_get_active_level)
68ialias_redirect (omp_in_final)
69ialias_redirect (omp_get_cancellation)
70ialias_redirect (omp_get_proc_bind)
71ialias_redirect (omp_set_default_device)
72ialias_redirect (omp_get_default_device)
73ialias_redirect (omp_get_num_devices)
74ialias_redirect (omp_get_num_teams)
75ialias_redirect (omp_get_team_num)
76ialias_redirect (omp_is_initial_device)
77#endif
78
79#ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
80# define gomp_init_lock__30 omp_init_lock_
81# define gomp_destroy_lock__30 omp_destroy_lock_
82# define gomp_set_lock__30 omp_set_lock_
83# define gomp_unset_lock__30 omp_unset_lock_
84# define gomp_test_lock__30 omp_test_lock_
85# define gomp_init_nest_lock__30 omp_init_nest_lock_
86# define gomp_destroy_nest_lock__30 omp_destroy_nest_lock_
87# define gomp_set_nest_lock__30 omp_set_nest_lock_
88# define gomp_unset_nest_lock__30 omp_unset_nest_lock_
89# define gomp_test_nest_lock__30 omp_test_nest_lock_
90#endif
91
92void
93gomp_init_lock__30 (omp_lock_arg_t lock)
94{
95#ifndef OMP_LOCK_DIRECT
96  omp_lock_arg (lock) = malloc (sizeof (omp_lock_t));
97#endif
98  gomp_init_lock_30 (omp_lock_arg (lock));
99}
100
101void
102gomp_init_nest_lock__30 (omp_nest_lock_arg_t lock)
103{
104#ifndef OMP_NEST_LOCK_DIRECT
105  omp_nest_lock_arg (lock) = malloc (sizeof (omp_nest_lock_t));
106#endif
107  gomp_init_nest_lock_30 (omp_nest_lock_arg (lock));
108}
109
110void
111gomp_destroy_lock__30 (omp_lock_arg_t lock)
112{
113  gomp_destroy_lock_30 (omp_lock_arg (lock));
114#ifndef OMP_LOCK_DIRECT
115  free (omp_lock_arg (lock));
116  omp_lock_arg (lock) = NULL;
117#endif
118}
119
120void
121gomp_destroy_nest_lock__30 (omp_nest_lock_arg_t lock)
122{
123  gomp_destroy_nest_lock_30 (omp_nest_lock_arg (lock));
124#ifndef OMP_NEST_LOCK_DIRECT
125  free (omp_nest_lock_arg (lock));
126  omp_nest_lock_arg (lock) = NULL;
127#endif
128}
129
130void
131gomp_set_lock__30 (omp_lock_arg_t lock)
132{
133  gomp_set_lock_30 (omp_lock_arg (lock));
134}
135
136void
137gomp_set_nest_lock__30 (omp_nest_lock_arg_t lock)
138{
139  gomp_set_nest_lock_30 (omp_nest_lock_arg (lock));
140}
141
142void
143gomp_unset_lock__30 (omp_lock_arg_t lock)
144{
145  gomp_unset_lock_30 (omp_lock_arg (lock));
146}
147
148void
149gomp_unset_nest_lock__30 (omp_nest_lock_arg_t lock)
150{
151  gomp_unset_nest_lock_30 (omp_nest_lock_arg (lock));
152}
153
154int32_t
155gomp_test_lock__30 (omp_lock_arg_t lock)
156{
157  return gomp_test_lock_30 (omp_lock_arg (lock));
158}
159
160int32_t
161gomp_test_nest_lock__30 (omp_nest_lock_arg_t lock)
162{
163  return gomp_test_nest_lock_30 (omp_nest_lock_arg (lock));
164}
165
166#ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
167void
168gomp_init_lock__25 (omp_lock_25_arg_t lock)
169{
170#ifndef OMP_LOCK_25_DIRECT
171  omp_lock_25_arg (lock) = malloc (sizeof (omp_lock_25_t));
172#endif
173  gomp_init_lock_25 (omp_lock_25_arg (lock));
174}
175
176void
177gomp_init_nest_lock__25 (omp_nest_lock_25_arg_t lock)
178{
179#ifndef OMP_NEST_LOCK_25_DIRECT
180  omp_nest_lock_25_arg (lock) = malloc (sizeof (omp_nest_lock_25_t));
181#endif
182  gomp_init_nest_lock_25 (omp_nest_lock_25_arg (lock));
183}
184
185void
186gomp_destroy_lock__25 (omp_lock_25_arg_t lock)
187{
188  gomp_destroy_lock_25 (omp_lock_25_arg (lock));
189#ifndef OMP_LOCK_25_DIRECT
190  free (omp_lock_25_arg (lock));
191  omp_lock_25_arg (lock) = NULL;
192#endif
193}
194
195void
196gomp_destroy_nest_lock__25 (omp_nest_lock_25_arg_t lock)
197{
198  gomp_destroy_nest_lock_25 (omp_nest_lock_25_arg (lock));
199#ifndef OMP_NEST_LOCK_25_DIRECT
200  free (omp_nest_lock_25_arg (lock));
201  omp_nest_lock_25_arg (lock) = NULL;
202#endif
203}
204
205void
206gomp_set_lock__25 (omp_lock_25_arg_t lock)
207{
208  gomp_set_lock_25 (omp_lock_25_arg (lock));
209}
210
211void
212gomp_set_nest_lock__25 (omp_nest_lock_25_arg_t lock)
213{
214  gomp_set_nest_lock_25 (omp_nest_lock_25_arg (lock));
215}
216
217void
218gomp_unset_lock__25 (omp_lock_25_arg_t lock)
219{
220  gomp_unset_lock_25 (omp_lock_25_arg (lock));
221}
222
223void
224gomp_unset_nest_lock__25 (omp_nest_lock_25_arg_t lock)
225{
226  gomp_unset_nest_lock_25 (omp_nest_lock_25_arg (lock));
227}
228
229int32_t
230gomp_test_lock__25 (omp_lock_25_arg_t lock)
231{
232  return gomp_test_lock_25 (omp_lock_25_arg (lock));
233}
234
235int32_t
236gomp_test_nest_lock__25 (omp_nest_lock_25_arg_t lock)
237{
238  return gomp_test_nest_lock_25 (omp_nest_lock_25_arg (lock));
239}
240
241omp_lock_symver (omp_init_lock_)
242omp_lock_symver (omp_destroy_lock_)
243omp_lock_symver (omp_set_lock_)
244omp_lock_symver (omp_unset_lock_)
245omp_lock_symver (omp_test_lock_)
246omp_lock_symver (omp_init_nest_lock_)
247omp_lock_symver (omp_destroy_nest_lock_)
248omp_lock_symver (omp_set_nest_lock_)
249omp_lock_symver (omp_unset_nest_lock_)
250omp_lock_symver (omp_test_nest_lock_)
251#endif
252
253#define TO_INT(x) ((x) > INT_MIN ? (x) < INT_MAX ? (x) : INT_MAX : INT_MIN)
254
255void
256omp_set_dynamic_ (const int32_t *set)
257{
258  omp_set_dynamic (*set);
259}
260
261void
262omp_set_dynamic_8_ (const int64_t *set)
263{
264  omp_set_dynamic (!!*set);
265}
266
267void
268omp_set_nested_ (const int32_t *set)
269{
270  omp_set_nested (*set);
271}
272
273void
274omp_set_nested_8_ (const int64_t *set)
275{
276  omp_set_nested (!!*set);
277}
278
279void
280omp_set_num_threads_ (const int32_t *set)
281{
282  omp_set_num_threads (*set);
283}
284
285void
286omp_set_num_threads_8_ (const int64_t *set)
287{
288  omp_set_num_threads (TO_INT (*set));
289}
290
291int32_t
292omp_get_dynamic_ (void)
293{
294  return omp_get_dynamic ();
295}
296
297int32_t
298omp_get_nested_ (void)
299{
300  return omp_get_nested ();
301}
302
303int32_t
304omp_in_parallel_ (void)
305{
306  return omp_in_parallel ();
307}
308
309int32_t
310omp_get_max_threads_ (void)
311{
312  return omp_get_max_threads ();
313}
314
315int32_t
316omp_get_num_procs_ (void)
317{
318  return omp_get_num_procs ();
319}
320
321int32_t
322omp_get_num_threads_ (void)
323{
324  return omp_get_num_threads ();
325}
326
327int32_t
328omp_get_thread_num_ (void)
329{
330  return omp_get_thread_num ();
331}
332
333double
334omp_get_wtick_ (void)
335{
336  return omp_get_wtick ();
337}
338
339double
340omp_get_wtime_ (void)
341{
342  return omp_get_wtime ();
343}
344
345void
346omp_set_schedule_ (const int32_t *kind, const int32_t *modifier)
347{
348  omp_set_schedule (*kind, *modifier);
349}
350
351void
352omp_set_schedule_8_ (const int32_t *kind, const int64_t *modifier)
353{
354  omp_set_schedule (*kind, TO_INT (*modifier));
355}
356
357void
358omp_get_schedule_ (int32_t *kind, int32_t *modifier)
359{
360  omp_sched_t k;
361  int m;
362  omp_get_schedule (&k, &m);
363  *kind = k;
364  *modifier = m;
365}
366
367void
368omp_get_schedule_8_ (int32_t *kind, int64_t *modifier)
369{
370  omp_sched_t k;
371  int m;
372  omp_get_schedule (&k, &m);
373  *kind = k;
374  *modifier = m;
375}
376
377int32_t
378omp_get_thread_limit_ (void)
379{
380  return omp_get_thread_limit ();
381}
382
383void
384omp_set_max_active_levels_ (const int32_t *levels)
385{
386  omp_set_max_active_levels (*levels);
387}
388
389void
390omp_set_max_active_levels_8_ (const int64_t *levels)
391{
392  omp_set_max_active_levels (TO_INT (*levels));
393}
394
395int32_t
396omp_get_max_active_levels_ (void)
397{
398  return omp_get_max_active_levels ();
399}
400
401int32_t
402omp_get_level_ (void)
403{
404  return omp_get_level ();
405}
406
407int32_t
408omp_get_ancestor_thread_num_ (const int32_t *level)
409{
410  return omp_get_ancestor_thread_num (*level);
411}
412
413int32_t
414omp_get_ancestor_thread_num_8_ (const int64_t *level)
415{
416  return omp_get_ancestor_thread_num (TO_INT (*level));
417}
418
419int32_t
420omp_get_team_size_ (const int32_t *level)
421{
422  return omp_get_team_size (*level);
423}
424
425int32_t
426omp_get_team_size_8_ (const int64_t *level)
427{
428  return omp_get_team_size (TO_INT (*level));
429}
430
431int32_t
432omp_get_active_level_ (void)
433{
434  return omp_get_active_level ();
435}
436
437int32_t
438omp_in_final_ (void)
439{
440  return omp_in_final ();
441}
442
443int32_t
444omp_get_cancellation_ (void)
445{
446  return omp_get_cancellation ();
447}
448
449int32_t
450omp_get_proc_bind_ (void)
451{
452  return omp_get_proc_bind ();
453}
454
455void
456omp_set_default_device_ (const int32_t *device_num)
457{
458  return omp_set_default_device (*device_num);
459}
460
461void
462omp_set_default_device_8_ (const int64_t *device_num)
463{
464  return omp_set_default_device (TO_INT (*device_num));
465}
466
467int32_t
468omp_get_default_device_ (void)
469{
470  return omp_get_default_device ();
471}
472
473int32_t
474omp_get_num_devices_ (void)
475{
476  return omp_get_num_devices ();
477}
478
479int32_t
480omp_get_num_teams_ (void)
481{
482  return omp_get_num_teams ();
483}
484
485int32_t
486omp_get_team_num_ (void)
487{
488  return omp_get_team_num ();
489}
490
491int32_t
492omp_is_initial_device_ (void)
493{
494  return omp_is_initial_device ();
495}
496