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