blob: 8263a657877b78d8467248a5e6c09689b07ce7df [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP.
Jim Cownie4cc4bb42014-10-07 16:25:50 +00003 * $Revision: 43435 $
4 * $Date: 2014-09-04 15:16:08 -0500 (Thu, 04 Sep 2014) $
Jim Cownie5e8470a2013-09-27 10:38:44 +00005 */
6
7
8//===----------------------------------------------------------------------===//
9//
10// The LLVM Compiler Infrastructure
11//
12// This file is dual licensed under the MIT and the University of Illinois Open
13// Source Licenses. See LICENSE.txt for details.
14//
15//===----------------------------------------------------------------------===//
16
17
18#ifndef FTN_STDCALL
19# error The support file kmp_ftn_entry.h should not be compiled by itself.
20#endif
21
22#ifdef KMP_STUB
23 #include "kmp_stub.h"
24#endif
25
26#include "kmp_i18n.h"
27
28#ifdef __cplusplus
29 extern "C" {
30#endif // __cplusplus
31
32/*
Alp Toker8f2d3f02014-02-24 10:40:15 +000033 * For compatibility with the Gnu/MS Open MP codegen, omp_set_num_threads(),
Jim Cownie5e8470a2013-09-27 10:38:44 +000034 * omp_set_nested(), and omp_set_dynamic() [in lowercase on MS, and w/o
35 * a trailing underscore on Linux* OS] take call by value integer arguments.
36 * + omp_set_max_active_levels()
37 * + omp_set_schedule()
38 *
Alp Toker8f2d3f02014-02-24 10:40:15 +000039 * For backward compatibility with 9.1 and previous Intel compiler, these
Jim Cownie5e8470a2013-09-27 10:38:44 +000040 * entry points take call by reference integer arguments.
41 */
42#ifdef KMP_GOMP_COMPAT
43# if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
44# define PASS_ARGS_BY_VALUE 1
45# endif
46#endif
47#if KMP_OS_WINDOWS
48# if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
49# define PASS_ARGS_BY_VALUE 1
50# endif
51#endif
52
53// This macro helps to reduce code duplication.
54#ifdef PASS_ARGS_BY_VALUE
55 #define KMP_DEREF
56#else
57 #define KMP_DEREF *
58#endif
59
60void FTN_STDCALL
61FTN_SET_STACKSIZE( int KMP_DEREF arg )
62{
63 #ifdef KMP_STUB
64 __kmps_set_stacksize( KMP_DEREF arg );
65 #else
66 // __kmp_aux_set_stacksize initializes the library if needed
67 __kmp_aux_set_stacksize( (size_t) KMP_DEREF arg );
68 #endif
69}
70
71void FTN_STDCALL
72FTN_SET_STACKSIZE_S( size_t KMP_DEREF arg )
73{
74 #ifdef KMP_STUB
75 __kmps_set_stacksize( KMP_DEREF arg );
76 #else
77 // __kmp_aux_set_stacksize initializes the library if needed
78 __kmp_aux_set_stacksize( KMP_DEREF arg );
79 #endif
80}
81
82int FTN_STDCALL
83FTN_GET_STACKSIZE( void )
84{
85 #ifdef KMP_STUB
86 return __kmps_get_stacksize();
87 #else
88 if ( ! __kmp_init_serial ) {
89 __kmp_serial_initialize();
90 };
91 return (int)__kmp_stksize;
92 #endif
93}
94
95size_t FTN_STDCALL
96FTN_GET_STACKSIZE_S( void )
97{
98 #ifdef KMP_STUB
99 return __kmps_get_stacksize();
100 #else
101 if ( ! __kmp_init_serial ) {
102 __kmp_serial_initialize();
103 };
104 return __kmp_stksize;
105 #endif
106}
107
108void FTN_STDCALL
109FTN_SET_BLOCKTIME( int KMP_DEREF arg )
110{
111 #ifdef KMP_STUB
112 __kmps_set_blocktime( KMP_DEREF arg );
113 #else
114 int gtid, tid;
115 kmp_info_t *thread;
116
117 gtid = __kmp_entry_gtid();
118 tid = __kmp_tid_from_gtid(gtid);
119 thread = __kmp_thread_from_gtid(gtid);
120
121 __kmp_aux_set_blocktime( KMP_DEREF arg, thread, tid );
122 #endif
123}
124
125int FTN_STDCALL
126FTN_GET_BLOCKTIME( void )
127{
128 #ifdef KMP_STUB
129 return __kmps_get_blocktime();
130 #else
131 int gtid, tid;
132 kmp_info_t *thread;
133 kmp_team_p *team;
134
135 gtid = __kmp_entry_gtid();
136 tid = __kmp_tid_from_gtid(gtid);
137 thread = __kmp_thread_from_gtid(gtid);
138 team = __kmp_threads[ gtid ] -> th.th_team;
139
140 /* These must match the settings used in __kmp_wait_sleep() */
141 if ( __kmp_dflt_blocktime == KMP_MAX_BLOCKTIME ) {
142 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
143 gtid, team->t.t_id, tid, KMP_MAX_BLOCKTIME) );
144 return KMP_MAX_BLOCKTIME;
145 }
146#ifdef KMP_ADJUST_BLOCKTIME
147 else if ( __kmp_zero_bt && !get__bt_set( team, tid ) ) {
148 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
149 gtid, team->t.t_id, tid, 0) );
150 return 0;
151 }
152#endif /* KMP_ADJUST_BLOCKTIME */
153 else {
154 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
155 gtid, team->t.t_id, tid, get__blocktime( team, tid ) ) );
156 return get__blocktime( team, tid );
157 };
158 #endif
159}
160
161void FTN_STDCALL
162FTN_SET_LIBRARY_SERIAL( void )
163{
164 #ifdef KMP_STUB
165 __kmps_set_library( library_serial );
166 #else
167 // __kmp_user_set_library initializes the library if needed
168 __kmp_user_set_library( library_serial );
169 #endif
170}
171
172void FTN_STDCALL
173FTN_SET_LIBRARY_TURNAROUND( void )
174{
175 #ifdef KMP_STUB
176 __kmps_set_library( library_turnaround );
177 #else
178 // __kmp_user_set_library initializes the library if needed
179 __kmp_user_set_library( library_turnaround );
180 #endif
181}
182
183void FTN_STDCALL
184FTN_SET_LIBRARY_THROUGHPUT( void )
185{
186 #ifdef KMP_STUB
187 __kmps_set_library( library_throughput );
188 #else
189 // __kmp_user_set_library initializes the library if needed
190 __kmp_user_set_library( library_throughput );
191 #endif
192}
193
194void FTN_STDCALL
195FTN_SET_LIBRARY( int KMP_DEREF arg )
196{
197 #ifdef KMP_STUB
198 __kmps_set_library( KMP_DEREF arg );
199 #else
200 enum library_type lib;
201 lib = (enum library_type) KMP_DEREF arg;
202 // __kmp_user_set_library initializes the library if needed
203 __kmp_user_set_library( lib );
204 #endif
205}
206
207int FTN_STDCALL
208FTN_GET_LIBRARY (void)
209{
210 #ifdef KMP_STUB
211 return __kmps_get_library();
212 #else
213 if ( ! __kmp_init_serial ) {
214 __kmp_serial_initialize();
215 }
216 return ((int) __kmp_library);
217 #endif
218}
219
Jim Cownie5e8470a2013-09-27 10:38:44 +0000220int FTN_STDCALL
221FTN_SET_AFFINITY( void **mask )
222{
Alp Toker763b9392014-02-28 09:42:41 +0000223 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000224 return -1;
225 #else
226 if ( ! TCR_4(__kmp_init_middle) ) {
227 __kmp_middle_initialize();
228 }
229 return __kmp_aux_set_affinity( mask );
230 #endif
231}
232
233int FTN_STDCALL
234FTN_GET_AFFINITY( void **mask )
235{
Alp Toker763b9392014-02-28 09:42:41 +0000236 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000237 return -1;
238 #else
239 if ( ! TCR_4(__kmp_init_middle) ) {
240 __kmp_middle_initialize();
241 }
242 return __kmp_aux_get_affinity( mask );
243 #endif
244}
245
246int FTN_STDCALL
247FTN_GET_AFFINITY_MAX_PROC( void )
248{
Alp Toker763b9392014-02-28 09:42:41 +0000249 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000250 return 0;
251 #else
252 //
253 // We really only NEED serial initialization here.
254 //
255 if ( ! TCR_4(__kmp_init_middle) ) {
256 __kmp_middle_initialize();
257 }
258 if ( ! ( KMP_AFFINITY_CAPABLE() ) ) {
259 return 0;
260 }
261
262 #if KMP_OS_WINDOWS && KMP_ARCH_X86_64
263 if ( __kmp_num_proc_groups <= 1 ) {
Jim Cownie3b81ce62014-08-05 09:32:28 +0000264 return (int)KMP_CPU_SETSIZE;
Jim Cownie5e8470a2013-09-27 10:38:44 +0000265 }
266 #endif /* KMP_OS_WINDOWS && KMP_ARCH_X86_64 */
267 return __kmp_xproc;
268 #endif
269}
270
271void FTN_STDCALL
272FTN_CREATE_AFFINITY_MASK( void **mask )
273{
Alp Toker763b9392014-02-28 09:42:41 +0000274 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000275 *mask = NULL;
276 #else
277 //
278 // We really only NEED serial initialization here.
279 //
280 if ( ! TCR_4(__kmp_init_middle) ) {
281 __kmp_middle_initialize();
282 }
283 *mask = kmpc_malloc( __kmp_affin_mask_size );
284 KMP_CPU_ZERO( (kmp_affin_mask_t *)(*mask) );
285 #endif
286}
287
288void FTN_STDCALL
289FTN_DESTROY_AFFINITY_MASK( void **mask )
290{
Alp Toker763b9392014-02-28 09:42:41 +0000291 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000292 // Nothing
293 #else
294 //
295 // We really only NEED serial initialization here.
296 //
297 if ( ! TCR_4(__kmp_init_middle) ) {
298 __kmp_middle_initialize();
299 }
300 if ( __kmp_env_consistency_check ) {
301 if ( *mask == NULL ) {
302 KMP_FATAL( AffinityInvalidMask, "kmp_destroy_affinity_mask" );
303 }
304 }
305 kmpc_free( *mask );
306 *mask = NULL;
307 #endif
308}
309
310int FTN_STDCALL
311FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
312{
Alp Toker763b9392014-02-28 09:42:41 +0000313 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000314 return -1;
315 #else
316 if ( ! TCR_4(__kmp_init_middle) ) {
317 __kmp_middle_initialize();
318 }
319 return __kmp_aux_set_affinity_mask_proc( KMP_DEREF proc, mask );
320 #endif
321}
322
323int FTN_STDCALL
324FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
325{
Alp Toker763b9392014-02-28 09:42:41 +0000326 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000327 return -1;
328 #else
329 if ( ! TCR_4(__kmp_init_middle) ) {
330 __kmp_middle_initialize();
331 }
332 return __kmp_aux_unset_affinity_mask_proc( KMP_DEREF proc, mask );
333 #endif
334}
335
336int FTN_STDCALL
337FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
338{
Alp Toker763b9392014-02-28 09:42:41 +0000339 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000340 return -1;
341 #else
342 if ( ! TCR_4(__kmp_init_middle) ) {
343 __kmp_middle_initialize();
344 }
345 return __kmp_aux_get_affinity_mask_proc( KMP_DEREF proc, mask );
346 #endif
347}
348
Jim Cownie5e8470a2013-09-27 10:38:44 +0000349
350/* ------------------------------------------------------------------------ */
351
352/* sets the requested number of threads for the next parallel region */
353
354void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000355xexpand(FTN_SET_NUM_THREADS)( int KMP_DEREF arg )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000356{
357 #ifdef KMP_STUB
358 // Nothing.
359 #else
360 __kmp_set_num_threads( KMP_DEREF arg, __kmp_entry_gtid() );
361 #endif
362}
363
364
365/* returns the number of threads in current team */
366int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000367xexpand(FTN_GET_NUM_THREADS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000368{
369 #ifdef KMP_STUB
370 return 1;
371 #else
372 // __kmpc_bound_num_threads initializes the library if needed
373 return __kmpc_bound_num_threads(NULL);
374 #endif
375}
376
377int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000378xexpand(FTN_GET_MAX_THREADS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000379{
380 #ifdef KMP_STUB
381 return 1;
382 #else
383 int gtid;
384 kmp_info_t *thread;
385 if ( ! TCR_4(__kmp_init_middle) ) {
386 __kmp_middle_initialize();
387 }
388 gtid = __kmp_entry_gtid();
389 thread = __kmp_threads[ gtid ];
Jim Cownie5e8470a2013-09-27 10:38:44 +0000390 //return thread -> th.th_team -> t.t_current_task[ thread->th.th_info.ds.ds_tid ] -> icvs.nproc;
391 return thread -> th.th_current_task -> td_icvs.nproc;
Jim Cownie5e8470a2013-09-27 10:38:44 +0000392 #endif
393}
394
395int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000396xexpand(FTN_GET_THREAD_NUM)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000397{
398 #ifdef KMP_STUB
399 return 0;
400 #else
401 int gtid;
402
Alp Toker763b9392014-02-28 09:42:41 +0000403 #if KMP_OS_DARWIN || KMP_OS_FREEBSD
Jim Cownie5e8470a2013-09-27 10:38:44 +0000404 gtid = __kmp_entry_gtid();
405 #elif KMP_OS_WINDOWS
406 if (!__kmp_init_parallel ||
Jim Cownie3b81ce62014-08-05 09:32:28 +0000407 (gtid = (int)((kmp_intptr_t)TlsGetValue( __kmp_gtid_threadprivate_key ))) == 0) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000408 // Either library isn't initialized or thread is not registered
409 // 0 is the correct TID in this case
410 return 0;
411 }
412 --gtid; // We keep (gtid+1) in TLS
413 #elif KMP_OS_LINUX
414 #ifdef KMP_TDATA_GTID
415 if ( __kmp_gtid_mode >= 3 ) {
416 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
417 return 0;
418 }
419 } else {
420 #endif
421 if (!__kmp_init_parallel ||
422 (gtid = (kmp_intptr_t)(pthread_getspecific( __kmp_gtid_threadprivate_key ))) == 0) {
423 return 0;
424 }
425 --gtid;
426 #ifdef KMP_TDATA_GTID
427 }
428 #endif
429 #else
430 #error Unknown or unsupported OS
431 #endif
432
433 return __kmp_tid_from_gtid( gtid );
434 #endif
435}
436
437int FTN_STDCALL
438FTN_GET_NUM_KNOWN_THREADS( void )
439{
440 #ifdef KMP_STUB
441 return 1;
442 #else
443 if ( ! __kmp_init_serial ) {
444 __kmp_serial_initialize();
445 }
446 /* NOTE: this is not syncronized, so it can change at any moment */
447 /* NOTE: this number also includes threads preallocated in hot-teams */
448 return TCR_4(__kmp_nth);
449 #endif
450}
451
452int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000453xexpand(FTN_GET_NUM_PROCS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000454{
455 #ifdef KMP_STUB
456 return 1;
457 #else
Jim Cownie5e8470a2013-09-27 10:38:44 +0000458 if ( ! TCR_4(__kmp_init_middle) ) {
459 __kmp_middle_initialize();
460 }
461 return __kmp_avail_proc;
462 #endif
463}
464
465void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000466xexpand(FTN_SET_NESTED)( int KMP_DEREF flag )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000467{
468 #ifdef KMP_STUB
469 __kmps_set_nested( KMP_DEREF flag );
470 #else
471 kmp_info_t *thread;
472 /* For the thread-private internal controls implementation */
473 thread = __kmp_entry_thread();
474 __kmp_save_internal_controls( thread );
475 set__nested( thread, ( (KMP_DEREF flag) ? TRUE : FALSE ) );
476 #endif
477}
478
479
480int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000481xexpand(FTN_GET_NESTED)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000482{
483 #ifdef KMP_STUB
484 return __kmps_get_nested();
485 #else
486 kmp_info_t *thread;
487 thread = __kmp_entry_thread();
488 return get__nested( thread );
489 #endif
490}
491
492void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000493xexpand(FTN_SET_DYNAMIC)( int KMP_DEREF flag )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000494{
495 #ifdef KMP_STUB
496 __kmps_set_dynamic( KMP_DEREF flag ? TRUE : FALSE );
497 #else
498 kmp_info_t *thread;
499 /* For the thread-private implementation of the internal controls */
500 thread = __kmp_entry_thread();
501 // !!! What if foreign thread calls it?
502 __kmp_save_internal_controls( thread );
503 set__dynamic( thread, KMP_DEREF flag ? TRUE : FALSE );
504 #endif
505}
506
507
508int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000509xexpand(FTN_GET_DYNAMIC)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000510{
511 #ifdef KMP_STUB
512 return __kmps_get_dynamic();
513 #else
514 kmp_info_t *thread;
515 thread = __kmp_entry_thread();
516 return get__dynamic( thread );
517 #endif
518}
519
520int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000521xexpand(FTN_IN_PARALLEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000522{
523 #ifdef KMP_STUB
524 return 0;
525 #else
526 kmp_info_t *th = __kmp_entry_thread();
527#if OMP_40_ENABLED
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000528 if ( th->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000529 // AC: r_in_parallel does not work inside teams construct
530 // where real parallel is inactive, but all threads have same root,
531 // so setting it in one team affects other teams.
532 // The solution is to use per-team nesting level
533 return ( th->th.th_team->t.t_active_level ? 1 : 0 );
534 }
535 else
536#endif /* OMP_40_ENABLED */
537 return ( th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE );
538 #endif
539}
540
Jim Cownie5e8470a2013-09-27 10:38:44 +0000541void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000542xexpand(FTN_SET_SCHEDULE)( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000543{
544 #ifdef KMP_STUB
545 __kmps_set_schedule( KMP_DEREF kind, KMP_DEREF modifier );
546 #else
547 /* TO DO */
548 /* For the per-task implementation of the internal controls */
549 __kmp_set_schedule( __kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier );
550 #endif
551}
552
553void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000554xexpand(FTN_GET_SCHEDULE)( kmp_sched_t * kind, int * modifier )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000555{
556 #ifdef KMP_STUB
557 __kmps_get_schedule( kind, modifier );
558 #else
559 /* TO DO */
560 /* For the per-task implementation of the internal controls */
561 __kmp_get_schedule( __kmp_entry_gtid(), kind, modifier );
562 #endif
563}
564
565void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000566xexpand(FTN_SET_MAX_ACTIVE_LEVELS)( int KMP_DEREF arg )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000567{
568 #ifdef KMP_STUB
569 // Nothing.
570 #else
571 /* TO DO */
572 /* We want per-task implementation of this internal control */
573 __kmp_set_max_active_levels( __kmp_entry_gtid(), KMP_DEREF arg );
574 #endif
575}
576
577int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000578xexpand(FTN_GET_MAX_ACTIVE_LEVELS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000579{
580 #ifdef KMP_STUB
581 return 0;
582 #else
583 /* TO DO */
584 /* We want per-task implementation of this internal control */
585 return __kmp_get_max_active_levels( __kmp_entry_gtid() );
586 #endif
587}
588
589int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000590xexpand(FTN_GET_ACTIVE_LEVEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000591{
592 #ifdef KMP_STUB
593 return 0; // returns 0 if it is called from the sequential part of the program
594 #else
595 /* TO DO */
596 /* For the per-task implementation of the internal controls */
597 return __kmp_entry_thread() -> th.th_team -> t.t_active_level;
598 #endif
599}
600
601int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000602xexpand(FTN_GET_LEVEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000603{
604 #ifdef KMP_STUB
605 return 0; // returns 0 if it is called from the sequential part of the program
606 #else
607 /* TO DO */
608 /* For the per-task implementation of the internal controls */
609 return __kmp_entry_thread() -> th.th_team -> t.t_level;
610 #endif
611}
612
613int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000614xexpand(FTN_GET_ANCESTOR_THREAD_NUM)( int KMP_DEREF level )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000615{
616 #ifdef KMP_STUB
617 return ( KMP_DEREF level ) ? ( -1 ) : ( 0 );
618 #else
619 return __kmp_get_ancestor_thread_num( __kmp_entry_gtid(), KMP_DEREF level );
620 #endif
621}
622
623int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000624xexpand(FTN_GET_TEAM_SIZE)( int KMP_DEREF level )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000625{
626 #ifdef KMP_STUB
627 return ( KMP_DEREF level ) ? ( -1 ) : ( 1 );
628 #else
629 return __kmp_get_team_size( __kmp_entry_gtid(), KMP_DEREF level );
630 #endif
631}
632
633int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000634xexpand(FTN_GET_THREAD_LIMIT)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000635{
636 #ifdef KMP_STUB
637 return 1; // TO DO: clarify whether it returns 1 or 0?
638 #else
639 if ( ! __kmp_init_serial ) {
640 __kmp_serial_initialize();
641 };
642 /* global ICV */
643 return __kmp_max_nth;
644 #endif
645}
646
647int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000648xexpand(FTN_IN_FINAL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000649{
650 #ifdef KMP_STUB
651 return 0; // TO DO: clarify whether it returns 1 or 0?
652 #else
653 if ( ! TCR_4(__kmp_init_parallel) ) {
654 return 0;
655 }
656 return __kmp_entry_thread() -> th.th_current_task -> td_flags.final;
657 #endif
658}
659
Jim Cownie5e8470a2013-09-27 10:38:44 +0000660#if OMP_40_ENABLED
661
662
663kmp_proc_bind_t FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000664xexpand(FTN_GET_PROC_BIND)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000665{
666 #ifdef KMP_STUB
667 return __kmps_get_proc_bind();
668 #else
669 return get__proc_bind( __kmp_entry_thread() );
670 #endif
671}
672
673int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000674xexpand(FTN_GET_NUM_TEAMS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000675{
676 #ifdef KMP_STUB
677 return 1;
678 #else
679 kmp_info_t *thr = __kmp_entry_thread();
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000680 if ( thr->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000681 kmp_team_t *team = thr->th.th_team;
682 int tlevel = thr->th.th_teams_level;
683 int ii = team->t.t_level; // the level of the teams construct
684 int dd = team -> t.t_serialized;
685 int level = tlevel + 1;
686 KMP_DEBUG_ASSERT( ii >= tlevel );
687 while( ii > level )
688 {
689 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
690 {
691 }
692 if( team -> t.t_serialized && ( !dd ) ) {
693 team = team->t.t_parent;
694 continue;
695 }
696 if( ii > level ) {
697 team = team->t.t_parent;
698 ii--;
699 }
700 }
701 if ( dd > 1 ) {
702 return 1; // teams region is serialized ( 1 team of 1 thread ).
703 } else {
704 return team->t.t_parent->t.t_nproc;
705 }
706 } else {
707 return 1;
708 }
709 #endif
710}
711
712int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000713xexpand(FTN_GET_TEAM_NUM)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000714{
715 #ifdef KMP_STUB
716 return 0;
717 #else
718 kmp_info_t *thr = __kmp_entry_thread();
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000719 if ( thr->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000720 kmp_team_t *team = thr->th.th_team;
721 int tlevel = thr->th.th_teams_level; // the level of the teams construct
722 int ii = team->t.t_level;
723 int dd = team -> t.t_serialized;
724 int level = tlevel + 1;
725 KMP_DEBUG_ASSERT( ii >= tlevel );
726 while( ii > level )
727 {
728 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
729 {
730 }
731 if( team -> t.t_serialized && ( !dd ) ) {
732 team = team->t.t_parent;
733 continue;
734 }
735 if( ii > level ) {
736 team = team->t.t_parent;
737 ii--;
738 }
739 }
740 if ( dd > 1 ) {
741 return 0; // teams region is serialized ( 1 team of 1 thread ).
742 } else {
743 return team->t.t_master_tid;
744 }
745 } else {
746 return 0;
747 }
748 #endif
749}
750
751#if KMP_MIC || KMP_OS_DARWIN
752
753static int __kmp_default_device = 0;
754
755int FTN_STDCALL
756FTN_GET_DEFAULT_DEVICE( void )
757{
758 return __kmp_default_device;
759}
760
761void FTN_STDCALL
762FTN_SET_DEFAULT_DEVICE( int KMP_DEREF arg )
763{
764 __kmp_default_device = KMP_DEREF arg;
765}
766
767int FTN_STDCALL
768FTN_GET_NUM_DEVICES( void )
769{
770 return 0;
771}
772
773#endif // KMP_MIC || KMP_OS_DARWIN
774
775#endif // OMP_40_ENABLED
776
777#ifdef KMP_STUB
778typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
779#endif /* KMP_STUB */
780
781/* initialize the lock */
782void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000783xexpand(FTN_INIT_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000784{
785 #ifdef KMP_STUB
786 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
787 #else
788 __kmpc_init_lock( NULL, __kmp_entry_gtid(), user_lock );
789 #endif
790}
791
792/* initialize the lock */
793void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000794xexpand(FTN_INIT_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000795{
796 #ifdef KMP_STUB
797 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
798 #else
799 __kmpc_init_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
800 #endif
801}
802
803void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000804xexpand(FTN_DESTROY_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000805{
806 #ifdef KMP_STUB
807 *((kmp_stub_lock_t *)user_lock) = UNINIT;
808 #else
809 __kmpc_destroy_lock( NULL, __kmp_entry_gtid(), user_lock );
810 #endif
811}
812
813void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000814xexpand(FTN_DESTROY_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000815{
816 #ifdef KMP_STUB
817 *((kmp_stub_lock_t *)user_lock) = UNINIT;
818 #else
819 __kmpc_destroy_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
820 #endif
821}
822
823void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000824xexpand(FTN_SET_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000825{
826 #ifdef KMP_STUB
827 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
828 // TODO: Issue an error.
829 }; // if
830 if ( *((kmp_stub_lock_t *)user_lock) != UNLOCKED ) {
831 // TODO: Issue an error.
832 }; // if
833 *((kmp_stub_lock_t *)user_lock) = LOCKED;
834 #else
835 __kmpc_set_lock( NULL, __kmp_entry_gtid(), user_lock );
836 #endif
837}
838
839void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000840xexpand(FTN_SET_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000841{
842 #ifdef KMP_STUB
843 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
844 // TODO: Issue an error.
845 }; // if
846 (*((int *)user_lock))++;
847 #else
848 __kmpc_set_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
849 #endif
850}
851
852void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000853xexpand(FTN_UNSET_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000854{
855 #ifdef KMP_STUB
856 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
857 // TODO: Issue an error.
858 }; // if
859 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
860 // TODO: Issue an error.
861 }; // if
862 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
863 #else
864 __kmpc_unset_lock( NULL, __kmp_entry_gtid(), user_lock );
865 #endif
866}
867
868void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000869xexpand(FTN_UNSET_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000870{
871 #ifdef KMP_STUB
872 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
873 // TODO: Issue an error.
874 }; // if
875 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
876 // TODO: Issue an error.
877 }; // if
878 (*((int *)user_lock))--;
879 #else
880 __kmpc_unset_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
881 #endif
882}
883
884int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000885xexpand(FTN_TEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000886{
887 #ifdef KMP_STUB
888 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
889 // TODO: Issue an error.
890 }; // if
891 if ( *((kmp_stub_lock_t *)user_lock) == LOCKED ) {
892 return 0;
893 }; // if
894 *((kmp_stub_lock_t *)user_lock) = LOCKED;
895 return 1;
896 #else
897 return __kmpc_test_lock( NULL, __kmp_entry_gtid(), user_lock );
898 #endif
899}
900
901int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000902xexpand(FTN_TEST_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000903{
904 #ifdef KMP_STUB
905 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
906 // TODO: Issue an error.
907 }; // if
908 return ++(*((int *)user_lock));
909 #else
910 return __kmpc_test_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
911 #endif
912}
913
914double FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000915xexpand(FTN_GET_WTIME)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000916{
917 #ifdef KMP_STUB
918 return __kmps_get_wtime();
919 #else
920 double data;
921 #if ! KMP_OS_LINUX
922 // We don't need library initialization to get the time on Linux* OS.
923 // The routine can be used to measure library initialization time on Linux* OS now.
924 if ( ! __kmp_init_serial ) {
925 __kmp_serial_initialize();
926 };
927 #endif
928 __kmp_elapsed( & data );
929 return data;
930 #endif
931}
932
933double FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000934xexpand(FTN_GET_WTICK)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000935{
936 #ifdef KMP_STUB
937 return __kmps_get_wtick();
938 #else
939 double data;
940 if ( ! __kmp_init_serial ) {
941 __kmp_serial_initialize();
942 };
943 __kmp_elapsed_tick( & data );
944 return data;
945 #endif
946}
947
948/* ------------------------------------------------------------------------ */
949
950void * FTN_STDCALL
951FTN_MALLOC( size_t KMP_DEREF size )
952{
953 // kmpc_malloc initializes the library if needed
954 return kmpc_malloc( KMP_DEREF size );
955}
956
957void * FTN_STDCALL
958FTN_CALLOC( size_t KMP_DEREF nelem, size_t KMP_DEREF elsize )
959{
960 // kmpc_calloc initializes the library if needed
961 return kmpc_calloc( KMP_DEREF nelem, KMP_DEREF elsize );
962}
963
964void * FTN_STDCALL
965FTN_REALLOC( void * KMP_DEREF ptr, size_t KMP_DEREF size )
966{
967 // kmpc_realloc initializes the library if needed
968 return kmpc_realloc( KMP_DEREF ptr, KMP_DEREF size );
969}
970
971void FTN_STDCALL
972FTN_FREE( void * KMP_DEREF ptr )
973{
974 // does nothing if the library is not initialized
975 kmpc_free( KMP_DEREF ptr );
976}
977
978void FTN_STDCALL
979FTN_SET_WARNINGS_ON( void )
980{
981 #ifndef KMP_STUB
982 __kmp_generate_warnings = kmp_warnings_explicit;
983 #endif
984}
985
986void FTN_STDCALL
987FTN_SET_WARNINGS_OFF( void )
988{
989 #ifndef KMP_STUB
990 __kmp_generate_warnings = FALSE;
991 #endif
992}
993
994void FTN_STDCALL
995FTN_SET_DEFAULTS( char const * str
996 #ifndef PASS_ARGS_BY_VALUE
997 , int len
998 #endif
999)
1000{
1001 #ifndef KMP_STUB
1002 #ifdef PASS_ARGS_BY_VALUE
Jim Cownie3b81ce62014-08-05 09:32:28 +00001003 int len = (int)strlen( str );
Jim Cownie5e8470a2013-09-27 10:38:44 +00001004 #endif
1005 __kmp_aux_set_defaults( str, len );
1006 #endif
1007}
1008
1009/* ------------------------------------------------------------------------ */
1010
1011
Jim Cownie181b4bb2013-12-23 17:28:57 +00001012#if OMP_40_ENABLED
1013/* returns the status of cancellation */
1014int FTN_STDCALL
1015xexpand(FTN_GET_CANCELLATION)(void) {
1016#ifdef KMP_STUB
1017 return 0 /* false */;
1018#else
1019 // initialize the library if needed
1020 if ( ! __kmp_init_serial ) {
1021 __kmp_serial_initialize();
1022 }
1023 return __kmp_omp_cancellation;
1024#endif
1025}
1026
1027int FTN_STDCALL
1028FTN_GET_CANCELLATION_STATUS(int cancel_kind) {
1029#ifdef KMP_STUB
1030 return 0 /* false */;
1031#else
1032 return __kmp_get_cancellation_status(cancel_kind);
1033#endif
1034}
1035
1036#endif // OMP_40_ENABLED
1037
1038// GCC compatibility (versioned symbols)
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001039#ifdef KMP_USE_VERSION_SYMBOLS
Jim Cownie181b4bb2013-12-23 17:28:57 +00001040
1041/*
1042 These following sections create function aliases (dummy symbols) for the omp_* routines.
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001043 These aliases will then be versioned according to how libgomp ``versions'' its
1044 symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the
Jim Cownie181b4bb2013-12-23 17:28:57 +00001045 default version which libiomp5 uses: VERSION (defined in exports_so.txt)
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001046 If you want to see the versioned symbols for libgomp.so.1 then just type:
Jim Cownie181b4bb2013-12-23 17:28:57 +00001047
1048 objdump -T /path/to/libgomp.so.1 | grep omp_
1049
1050 Example:
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001051 Step 1) Create __kmp_api_omp_set_num_threads_10_alias
Jim Cownie181b4bb2013-12-23 17:28:57 +00001052 which is alias of __kmp_api_omp_set_num_threads
1053 Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version: omp_set_num_threads@OMP_1.0
1054 Step 2B) Set __kmp_api_omp_set_num_threads to default version : omp_set_num_threads@@VERSION
1055*/
1056
1057// OMP_1.0 aliases
1058xaliasify(FTN_SET_NUM_THREADS, 10);
1059xaliasify(FTN_GET_NUM_THREADS, 10);
1060xaliasify(FTN_GET_MAX_THREADS, 10);
1061xaliasify(FTN_GET_THREAD_NUM, 10);
1062xaliasify(FTN_GET_NUM_PROCS, 10);
1063xaliasify(FTN_IN_PARALLEL, 10);
1064xaliasify(FTN_SET_DYNAMIC, 10);
1065xaliasify(FTN_GET_DYNAMIC, 10);
1066xaliasify(FTN_SET_NESTED, 10);
1067xaliasify(FTN_GET_NESTED, 10);
1068xaliasify(FTN_INIT_LOCK, 10);
1069xaliasify(FTN_INIT_NEST_LOCK, 10);
1070xaliasify(FTN_DESTROY_LOCK, 10);
1071xaliasify(FTN_DESTROY_NEST_LOCK, 10);
1072xaliasify(FTN_SET_LOCK, 10);
1073xaliasify(FTN_SET_NEST_LOCK, 10);
1074xaliasify(FTN_UNSET_LOCK, 10);
1075xaliasify(FTN_UNSET_NEST_LOCK, 10);
1076xaliasify(FTN_TEST_LOCK, 10);
1077xaliasify(FTN_TEST_NEST_LOCK, 10);
1078
1079// OMP_2.0 aliases
1080xaliasify(FTN_GET_WTICK, 20);
1081xaliasify(FTN_GET_WTIME, 20);
1082
Jim Cownie181b4bb2013-12-23 17:28:57 +00001083// OMP_3.0 aliases
1084xaliasify(FTN_SET_SCHEDULE, 30);
1085xaliasify(FTN_GET_SCHEDULE, 30);
1086xaliasify(FTN_GET_THREAD_LIMIT, 30);
1087xaliasify(FTN_SET_MAX_ACTIVE_LEVELS, 30);
1088xaliasify(FTN_GET_MAX_ACTIVE_LEVELS, 30);
1089xaliasify(FTN_GET_LEVEL, 30);
1090xaliasify(FTN_GET_ANCESTOR_THREAD_NUM, 30);
1091xaliasify(FTN_GET_TEAM_SIZE, 30);
1092xaliasify(FTN_GET_ACTIVE_LEVEL, 30);
1093xaliasify(FTN_INIT_LOCK, 30);
1094xaliasify(FTN_INIT_NEST_LOCK, 30);
1095xaliasify(FTN_DESTROY_LOCK, 30);
1096xaliasify(FTN_DESTROY_NEST_LOCK, 30);
1097xaliasify(FTN_SET_LOCK, 30);
1098xaliasify(FTN_SET_NEST_LOCK, 30);
1099xaliasify(FTN_UNSET_LOCK, 30);
1100xaliasify(FTN_UNSET_NEST_LOCK, 30);
1101xaliasify(FTN_TEST_LOCK, 30);
1102xaliasify(FTN_TEST_NEST_LOCK, 30);
1103
1104// OMP_3.1 aliases
1105xaliasify(FTN_IN_FINAL, 31);
Jim Cownie181b4bb2013-12-23 17:28:57 +00001106
1107#if OMP_40_ENABLED
1108// OMP_4.0 aliases
1109xaliasify(FTN_GET_PROC_BIND, 40);
1110xaliasify(FTN_GET_NUM_TEAMS, 40);
1111xaliasify(FTN_GET_TEAM_NUM, 40);
1112xaliasify(FTN_GET_CANCELLATION, 40);
1113#endif /* OMP_40_ENABLED */
1114
1115#if OMP_41_ENABLED
1116// OMP_4.1 aliases
1117#endif
1118
1119#if OMP_50_ENABLED
1120// OMP_5.0 aliases
1121#endif
1122
1123// OMP_1.0 versioned symbols
1124xversionify(FTN_SET_NUM_THREADS, 10, "OMP_1.0");
1125xversionify(FTN_GET_NUM_THREADS, 10, "OMP_1.0");
1126xversionify(FTN_GET_MAX_THREADS, 10, "OMP_1.0");
1127xversionify(FTN_GET_THREAD_NUM, 10, "OMP_1.0");
1128xversionify(FTN_GET_NUM_PROCS, 10, "OMP_1.0");
1129xversionify(FTN_IN_PARALLEL, 10, "OMP_1.0");
1130xversionify(FTN_SET_DYNAMIC, 10, "OMP_1.0");
1131xversionify(FTN_GET_DYNAMIC, 10, "OMP_1.0");
1132xversionify(FTN_SET_NESTED, 10, "OMP_1.0");
1133xversionify(FTN_GET_NESTED, 10, "OMP_1.0");
1134xversionify(FTN_INIT_LOCK, 10, "OMP_1.0");
1135xversionify(FTN_INIT_NEST_LOCK, 10, "OMP_1.0");
1136xversionify(FTN_DESTROY_LOCK, 10, "OMP_1.0");
1137xversionify(FTN_DESTROY_NEST_LOCK, 10, "OMP_1.0");
1138xversionify(FTN_SET_LOCK, 10, "OMP_1.0");
1139xversionify(FTN_SET_NEST_LOCK, 10, "OMP_1.0");
1140xversionify(FTN_UNSET_LOCK, 10, "OMP_1.0");
1141xversionify(FTN_UNSET_NEST_LOCK, 10, "OMP_1.0");
1142xversionify(FTN_TEST_LOCK, 10, "OMP_1.0");
1143xversionify(FTN_TEST_NEST_LOCK, 10, "OMP_1.0");
1144
1145// OMP_2.0 versioned symbols
1146xversionify(FTN_GET_WTICK, 20, "OMP_2.0");
1147xversionify(FTN_GET_WTIME, 20, "OMP_2.0");
1148
Jim Cownie181b4bb2013-12-23 17:28:57 +00001149// OMP_3.0 versioned symbols
1150xversionify(FTN_SET_SCHEDULE, 30, "OMP_3.0");
1151xversionify(FTN_GET_SCHEDULE, 30, "OMP_3.0");
1152xversionify(FTN_GET_THREAD_LIMIT, 30, "OMP_3.0");
1153xversionify(FTN_SET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
1154xversionify(FTN_GET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
1155xversionify(FTN_GET_ANCESTOR_THREAD_NUM, 30, "OMP_3.0");
1156xversionify(FTN_GET_LEVEL, 30, "OMP_3.0");
1157xversionify(FTN_GET_TEAM_SIZE, 30, "OMP_3.0");
1158xversionify(FTN_GET_ACTIVE_LEVEL, 30, "OMP_3.0");
1159
1160// the lock routines have a 1.0 and 3.0 version
1161xversionify(FTN_INIT_LOCK, 30, "OMP_3.0");
1162xversionify(FTN_INIT_NEST_LOCK, 30, "OMP_3.0");
1163xversionify(FTN_DESTROY_LOCK, 30, "OMP_3.0");
1164xversionify(FTN_DESTROY_NEST_LOCK, 30, "OMP_3.0");
1165xversionify(FTN_SET_LOCK, 30, "OMP_3.0");
1166xversionify(FTN_SET_NEST_LOCK, 30, "OMP_3.0");
1167xversionify(FTN_UNSET_LOCK, 30, "OMP_3.0");
1168xversionify(FTN_UNSET_NEST_LOCK, 30, "OMP_3.0");
1169xversionify(FTN_TEST_LOCK, 30, "OMP_3.0");
1170xversionify(FTN_TEST_NEST_LOCK, 30, "OMP_3.0");
1171
1172// OMP_3.1 versioned symbol
1173xversionify(FTN_IN_FINAL, 31, "OMP_3.1");
Jim Cownie181b4bb2013-12-23 17:28:57 +00001174
1175#if OMP_40_ENABLED
1176// OMP_4.0 versioned symbols
1177xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0");
1178xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0");
1179xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0");
1180xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0");
1181#endif /* OMP_40_ENABLED */
1182
1183#if OMP_41_ENABLED
1184// OMP_4.1 versioned symbols
1185#endif
1186
1187#if OMP_50_ENABLED
1188// OMP_5.0 versioned symbols
1189#endif
1190
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001191#endif // KMP_USE_VERSION_SYMBOLS
Jim Cownie181b4bb2013-12-23 17:28:57 +00001192
Jim Cownie5e8470a2013-09-27 10:38:44 +00001193#ifdef __cplusplus
1194 } //extern "C"
1195#endif // __cplusplus
1196
1197// end of file //