10b57cec5SDimitry Andric /*
20b57cec5SDimitry Andric * kmp_stub.cpp -- stub versions of user-callable OpenMP RT functions.
30b57cec5SDimitry Andric */
40b57cec5SDimitry Andric
50b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric #include <errno.h>
140b57cec5SDimitry Andric #include <limits.h>
150b57cec5SDimitry Andric #include <stdlib.h>
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric #define __KMP_IMP
180b57cec5SDimitry Andric #include "omp.h" // omp_* declarations, must be included before "kmp.h"
190b57cec5SDimitry Andric #include "kmp.h" // KMP_DEFAULT_STKSIZE
200b57cec5SDimitry Andric #include "kmp_stub.h"
210b57cec5SDimitry Andric
220b57cec5SDimitry Andric #if KMP_OS_WINDOWS
230b57cec5SDimitry Andric #include <windows.h>
240b57cec5SDimitry Andric #else
250b57cec5SDimitry Andric #include <sys/time.h>
260b57cec5SDimitry Andric #endif
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric // Moved from omp.h
290b57cec5SDimitry Andric #define omp_set_max_active_levels ompc_set_max_active_levels
300b57cec5SDimitry Andric #define omp_set_schedule ompc_set_schedule
310b57cec5SDimitry Andric #define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
320b57cec5SDimitry Andric #define omp_get_team_size ompc_get_team_size
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric #define omp_set_num_threads ompc_set_num_threads
350b57cec5SDimitry Andric #define omp_set_dynamic ompc_set_dynamic
360b57cec5SDimitry Andric #define omp_set_nested ompc_set_nested
370b57cec5SDimitry Andric #define omp_set_affinity_format ompc_set_affinity_format
380b57cec5SDimitry Andric #define omp_get_affinity_format ompc_get_affinity_format
390b57cec5SDimitry Andric #define omp_display_affinity ompc_display_affinity
400b57cec5SDimitry Andric #define omp_capture_affinity ompc_capture_affinity
410b57cec5SDimitry Andric #define kmp_set_stacksize kmpc_set_stacksize
420b57cec5SDimitry Andric #define kmp_set_stacksize_s kmpc_set_stacksize_s
430b57cec5SDimitry Andric #define kmp_set_blocktime kmpc_set_blocktime
440b57cec5SDimitry Andric #define kmp_set_library kmpc_set_library
450b57cec5SDimitry Andric #define kmp_set_defaults kmpc_set_defaults
460b57cec5SDimitry Andric #define kmp_set_disp_num_buffers kmpc_set_disp_num_buffers
470b57cec5SDimitry Andric #define kmp_malloc kmpc_malloc
480b57cec5SDimitry Andric #define kmp_aligned_malloc kmpc_aligned_malloc
490b57cec5SDimitry Andric #define kmp_calloc kmpc_calloc
500b57cec5SDimitry Andric #define kmp_realloc kmpc_realloc
510b57cec5SDimitry Andric #define kmp_free kmpc_free
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric #if KMP_OS_WINDOWS
540b57cec5SDimitry Andric static double frequency = 0.0;
550b57cec5SDimitry Andric #endif
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric // Helper functions.
__kmps_init()580b57cec5SDimitry Andric static size_t __kmps_init() {
590b57cec5SDimitry Andric static int initialized = 0;
600b57cec5SDimitry Andric static size_t dummy = 0;
610b57cec5SDimitry Andric if (!initialized) {
620b57cec5SDimitry Andric // TODO: Analyze KMP_VERSION environment variable, print
630b57cec5SDimitry Andric // __kmp_version_copyright and __kmp_version_build_time.
640b57cec5SDimitry Andric // WARNING: Do not use "fprintf(stderr, ...)" because it will cause
650b57cec5SDimitry Andric // unresolved "__iob" symbol (see C70080). We need to extract __kmp_printf()
660b57cec5SDimitry Andric // stuff from kmp_runtime.cpp and use it.
670b57cec5SDimitry Andric
680b57cec5SDimitry Andric // Trick with dummy variable forces linker to keep __kmp_version_copyright
690b57cec5SDimitry Andric // and __kmp_version_build_time strings in executable file (in case of
700b57cec5SDimitry Andric // static linkage). When KMP_VERSION analysis is implemented, dummy
710b57cec5SDimitry Andric // variable should be deleted, function should return void.
720b57cec5SDimitry Andric dummy = __kmp_version_copyright - __kmp_version_build_time;
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric #if KMP_OS_WINDOWS
750b57cec5SDimitry Andric LARGE_INTEGER freq;
760b57cec5SDimitry Andric BOOL status = QueryPerformanceFrequency(&freq);
770b57cec5SDimitry Andric if (status) {
780b57cec5SDimitry Andric frequency = double(freq.QuadPart);
790b57cec5SDimitry Andric }
800b57cec5SDimitry Andric #endif
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric initialized = 1;
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric return dummy;
850b57cec5SDimitry Andric } // __kmps_init
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric #define i __kmps_init();
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric /* set API functions */
omp_set_num_threads(omp_int_t num_threads)900b57cec5SDimitry Andric void omp_set_num_threads(omp_int_t num_threads) { i; }
omp_set_dynamic(omp_int_t dynamic)910b57cec5SDimitry Andric void omp_set_dynamic(omp_int_t dynamic) {
920b57cec5SDimitry Andric i;
930b57cec5SDimitry Andric __kmps_set_dynamic(dynamic);
940b57cec5SDimitry Andric }
omp_set_nested(omp_int_t nested)950b57cec5SDimitry Andric void omp_set_nested(omp_int_t nested) {
960b57cec5SDimitry Andric i;
970b57cec5SDimitry Andric __kmps_set_nested(nested);
980b57cec5SDimitry Andric }
omp_set_max_active_levels(omp_int_t max_active_levels)990b57cec5SDimitry Andric void omp_set_max_active_levels(omp_int_t max_active_levels) { i; }
omp_set_schedule(omp_sched_t kind,omp_int_t modifier)1000b57cec5SDimitry Andric void omp_set_schedule(omp_sched_t kind, omp_int_t modifier) {
1010b57cec5SDimitry Andric i;
1020b57cec5SDimitry Andric __kmps_set_schedule((kmp_sched_t)kind, modifier);
1030b57cec5SDimitry Andric }
omp_get_ancestor_thread_num(omp_int_t level)1040b57cec5SDimitry Andric int omp_get_ancestor_thread_num(omp_int_t level) {
1050b57cec5SDimitry Andric i;
1060b57cec5SDimitry Andric return (level) ? (-1) : (0);
1070b57cec5SDimitry Andric }
omp_get_team_size(omp_int_t level)1080b57cec5SDimitry Andric int omp_get_team_size(omp_int_t level) {
1090b57cec5SDimitry Andric i;
1100b57cec5SDimitry Andric return (level) ? (-1) : (1);
1110b57cec5SDimitry Andric }
kmpc_set_affinity_mask_proc(int proc,void ** mask)1120b57cec5SDimitry Andric int kmpc_set_affinity_mask_proc(int proc, void **mask) {
1130b57cec5SDimitry Andric i;
1140b57cec5SDimitry Andric return -1;
1150b57cec5SDimitry Andric }
kmpc_unset_affinity_mask_proc(int proc,void ** mask)1160b57cec5SDimitry Andric int kmpc_unset_affinity_mask_proc(int proc, void **mask) {
1170b57cec5SDimitry Andric i;
1180b57cec5SDimitry Andric return -1;
1190b57cec5SDimitry Andric }
kmpc_get_affinity_mask_proc(int proc,void ** mask)1200b57cec5SDimitry Andric int kmpc_get_affinity_mask_proc(int proc, void **mask) {
1210b57cec5SDimitry Andric i;
1220b57cec5SDimitry Andric return -1;
1230b57cec5SDimitry Andric }
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric /* kmp API functions */
kmp_set_stacksize(omp_int_t arg)1260b57cec5SDimitry Andric void kmp_set_stacksize(omp_int_t arg) {
1270b57cec5SDimitry Andric i;
128e8d8bef9SDimitry Andric __kmps_set_stacksize((size_t)arg);
1290b57cec5SDimitry Andric }
kmp_set_stacksize_s(size_t arg)1300b57cec5SDimitry Andric void kmp_set_stacksize_s(size_t arg) {
1310b57cec5SDimitry Andric i;
1320b57cec5SDimitry Andric __kmps_set_stacksize(arg);
1330b57cec5SDimitry Andric }
kmp_set_blocktime(omp_int_t arg)1340b57cec5SDimitry Andric void kmp_set_blocktime(omp_int_t arg) {
1350b57cec5SDimitry Andric i;
1360b57cec5SDimitry Andric __kmps_set_blocktime(arg);
1370b57cec5SDimitry Andric }
kmp_set_library(omp_int_t arg)1380b57cec5SDimitry Andric void kmp_set_library(omp_int_t arg) {
1390b57cec5SDimitry Andric i;
1400b57cec5SDimitry Andric __kmps_set_library(arg);
1410b57cec5SDimitry Andric }
kmp_set_defaults(char const * str)1420b57cec5SDimitry Andric void kmp_set_defaults(char const *str) { i; }
kmp_set_disp_num_buffers(omp_int_t arg)1430b57cec5SDimitry Andric void kmp_set_disp_num_buffers(omp_int_t arg) { i; }
1440b57cec5SDimitry Andric
1450b57cec5SDimitry Andric /* KMP memory management functions. */
kmp_malloc(size_t size)1460b57cec5SDimitry Andric void *kmp_malloc(size_t size) {
1470b57cec5SDimitry Andric i;
1480b57cec5SDimitry Andric void *res;
1490b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1505ffd83dbSDimitry Andric // If successful returns a pointer to the memory block, otherwise returns
1510b57cec5SDimitry Andric // NULL.
1520b57cec5SDimitry Andric // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
1530b57cec5SDimitry Andric // validation failed.
1540b57cec5SDimitry Andric res = _aligned_malloc(size, 1);
1550b57cec5SDimitry Andric #else
1560b57cec5SDimitry Andric res = malloc(size);
1570b57cec5SDimitry Andric #endif
1580b57cec5SDimitry Andric return res;
1590b57cec5SDimitry Andric }
kmp_aligned_malloc(size_t sz,size_t a)1600b57cec5SDimitry Andric void *kmp_aligned_malloc(size_t sz, size_t a) {
1610b57cec5SDimitry Andric i;
1620b57cec5SDimitry Andric void *res;
1630b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1640b57cec5SDimitry Andric res = _aligned_malloc(sz, a);
1650b57cec5SDimitry Andric #else
166*81ad6265SDimitry Andric int err;
167489b1cf2SDimitry Andric if ((err = posix_memalign(&res, a, sz))) {
1680b57cec5SDimitry Andric errno = err; // can be EINVAL or ENOMEM
1690b57cec5SDimitry Andric res = NULL;
1700b57cec5SDimitry Andric }
1710b57cec5SDimitry Andric #endif
1720b57cec5SDimitry Andric return res;
1730b57cec5SDimitry Andric }
kmp_calloc(size_t nelem,size_t elsize)1740b57cec5SDimitry Andric void *kmp_calloc(size_t nelem, size_t elsize) {
1750b57cec5SDimitry Andric i;
1760b57cec5SDimitry Andric void *res;
1770b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1780b57cec5SDimitry Andric res = _aligned_recalloc(NULL, nelem, elsize, 1);
1790b57cec5SDimitry Andric #else
1800b57cec5SDimitry Andric res = calloc(nelem, elsize);
1810b57cec5SDimitry Andric #endif
1820b57cec5SDimitry Andric return res;
1830b57cec5SDimitry Andric }
kmp_realloc(void * ptr,size_t size)1840b57cec5SDimitry Andric void *kmp_realloc(void *ptr, size_t size) {
1850b57cec5SDimitry Andric i;
1860b57cec5SDimitry Andric void *res;
1870b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1880b57cec5SDimitry Andric res = _aligned_realloc(ptr, size, 1);
1890b57cec5SDimitry Andric #else
1900b57cec5SDimitry Andric res = realloc(ptr, size);
1910b57cec5SDimitry Andric #endif
1920b57cec5SDimitry Andric return res;
1930b57cec5SDimitry Andric }
kmp_free(void * ptr)1940b57cec5SDimitry Andric void kmp_free(void *ptr) {
1950b57cec5SDimitry Andric i;
1960b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1970b57cec5SDimitry Andric _aligned_free(ptr);
1980b57cec5SDimitry Andric #else
1990b57cec5SDimitry Andric free(ptr);
2000b57cec5SDimitry Andric #endif
2010b57cec5SDimitry Andric }
2020b57cec5SDimitry Andric
2030b57cec5SDimitry Andric static int __kmps_blocktime = INT_MAX;
2040b57cec5SDimitry Andric
__kmps_set_blocktime(int arg)2050b57cec5SDimitry Andric void __kmps_set_blocktime(int arg) {
2060b57cec5SDimitry Andric i;
2070b57cec5SDimitry Andric __kmps_blocktime = arg;
2080b57cec5SDimitry Andric } // __kmps_set_blocktime
2090b57cec5SDimitry Andric
__kmps_get_blocktime(void)2100b57cec5SDimitry Andric int __kmps_get_blocktime(void) {
2110b57cec5SDimitry Andric i;
2120b57cec5SDimitry Andric return __kmps_blocktime;
2130b57cec5SDimitry Andric } // __kmps_get_blocktime
2140b57cec5SDimitry Andric
2150b57cec5SDimitry Andric static int __kmps_dynamic = 0;
2160b57cec5SDimitry Andric
__kmps_set_dynamic(int arg)2170b57cec5SDimitry Andric void __kmps_set_dynamic(int arg) {
2180b57cec5SDimitry Andric i;
2190b57cec5SDimitry Andric __kmps_dynamic = arg;
2200b57cec5SDimitry Andric } // __kmps_set_dynamic
2210b57cec5SDimitry Andric
__kmps_get_dynamic(void)2220b57cec5SDimitry Andric int __kmps_get_dynamic(void) {
2230b57cec5SDimitry Andric i;
2240b57cec5SDimitry Andric return __kmps_dynamic;
2250b57cec5SDimitry Andric } // __kmps_get_dynamic
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric static int __kmps_library = 1000;
2280b57cec5SDimitry Andric
__kmps_set_library(int arg)2290b57cec5SDimitry Andric void __kmps_set_library(int arg) {
2300b57cec5SDimitry Andric i;
2310b57cec5SDimitry Andric __kmps_library = arg;
2320b57cec5SDimitry Andric } // __kmps_set_library
2330b57cec5SDimitry Andric
__kmps_get_library(void)2340b57cec5SDimitry Andric int __kmps_get_library(void) {
2350b57cec5SDimitry Andric i;
2360b57cec5SDimitry Andric return __kmps_library;
2370b57cec5SDimitry Andric } // __kmps_get_library
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andric static int __kmps_nested = 0;
2400b57cec5SDimitry Andric
__kmps_set_nested(int arg)2410b57cec5SDimitry Andric void __kmps_set_nested(int arg) {
2420b57cec5SDimitry Andric i;
2430b57cec5SDimitry Andric __kmps_nested = arg;
2440b57cec5SDimitry Andric } // __kmps_set_nested
2450b57cec5SDimitry Andric
__kmps_get_nested(void)2460b57cec5SDimitry Andric int __kmps_get_nested(void) {
2470b57cec5SDimitry Andric i;
2480b57cec5SDimitry Andric return __kmps_nested;
2490b57cec5SDimitry Andric } // __kmps_get_nested
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andric static size_t __kmps_stacksize = KMP_DEFAULT_STKSIZE;
2520b57cec5SDimitry Andric
__kmps_set_stacksize(size_t arg)253e8d8bef9SDimitry Andric void __kmps_set_stacksize(size_t arg) {
2540b57cec5SDimitry Andric i;
2550b57cec5SDimitry Andric __kmps_stacksize = arg;
2560b57cec5SDimitry Andric } // __kmps_set_stacksize
2570b57cec5SDimitry Andric
__kmps_get_stacksize(void)258e8d8bef9SDimitry Andric size_t __kmps_get_stacksize(void) {
2590b57cec5SDimitry Andric i;
2600b57cec5SDimitry Andric return __kmps_stacksize;
2610b57cec5SDimitry Andric } // __kmps_get_stacksize
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric static kmp_sched_t __kmps_sched_kind = kmp_sched_default;
2640b57cec5SDimitry Andric static int __kmps_sched_modifier = 0;
2650b57cec5SDimitry Andric
__kmps_set_schedule(kmp_sched_t kind,int modifier)2660b57cec5SDimitry Andric void __kmps_set_schedule(kmp_sched_t kind, int modifier) {
2670b57cec5SDimitry Andric i;
2680b57cec5SDimitry Andric __kmps_sched_kind = kind;
2690b57cec5SDimitry Andric __kmps_sched_modifier = modifier;
2700b57cec5SDimitry Andric } // __kmps_set_schedule
2710b57cec5SDimitry Andric
__kmps_get_schedule(kmp_sched_t * kind,int * modifier)2720b57cec5SDimitry Andric void __kmps_get_schedule(kmp_sched_t *kind, int *modifier) {
2730b57cec5SDimitry Andric i;
2740b57cec5SDimitry Andric *kind = __kmps_sched_kind;
2750b57cec5SDimitry Andric *modifier = __kmps_sched_modifier;
2760b57cec5SDimitry Andric } // __kmps_get_schedule
2770b57cec5SDimitry Andric
__kmps_get_proc_bind(void)2780b57cec5SDimitry Andric kmp_proc_bind_t __kmps_get_proc_bind(void) {
2790b57cec5SDimitry Andric i;
280489b1cf2SDimitry Andric return proc_bind_false;
2810b57cec5SDimitry Andric } // __kmps_get_proc_bind
2820b57cec5SDimitry Andric
__kmps_get_wtime(void)2830b57cec5SDimitry Andric double __kmps_get_wtime(void) {
2840b57cec5SDimitry Andric // Elapsed wall clock time (in second) from "sometime in the past".
2850b57cec5SDimitry Andric double wtime = 0.0;
2860b57cec5SDimitry Andric i;
2870b57cec5SDimitry Andric #if KMP_OS_WINDOWS
2880b57cec5SDimitry Andric if (frequency > 0.0) {
2890b57cec5SDimitry Andric LARGE_INTEGER now;
2900b57cec5SDimitry Andric BOOL status = QueryPerformanceCounter(&now);
2910b57cec5SDimitry Andric if (status) {
2920b57cec5SDimitry Andric wtime = double(now.QuadPart) / frequency;
2930b57cec5SDimitry Andric }
2940b57cec5SDimitry Andric }
2950b57cec5SDimitry Andric #else
2960b57cec5SDimitry Andric // gettimeofday() returns seconds and microseconds since the Epoch.
2970b57cec5SDimitry Andric struct timeval tval;
2980b57cec5SDimitry Andric int rc;
2990b57cec5SDimitry Andric rc = gettimeofday(&tval, NULL);
3000b57cec5SDimitry Andric if (rc == 0) {
3010b57cec5SDimitry Andric wtime = (double)(tval.tv_sec) + 1.0E-06 * (double)(tval.tv_usec);
3020b57cec5SDimitry Andric } else {
3030b57cec5SDimitry Andric // TODO: Assert or abort here.
3040b57cec5SDimitry Andric }
3050b57cec5SDimitry Andric #endif
3060b57cec5SDimitry Andric return wtime;
3070b57cec5SDimitry Andric } // __kmps_get_wtime
3080b57cec5SDimitry Andric
__kmps_get_wtick(void)3090b57cec5SDimitry Andric double __kmps_get_wtick(void) {
3100b57cec5SDimitry Andric // Number of seconds between successive clock ticks.
3110b57cec5SDimitry Andric double wtick = 0.0;
3120b57cec5SDimitry Andric i;
3130b57cec5SDimitry Andric #if KMP_OS_WINDOWS
3140b57cec5SDimitry Andric {
3150b57cec5SDimitry Andric DWORD increment;
3160b57cec5SDimitry Andric DWORD adjustment;
3170b57cec5SDimitry Andric BOOL disabled;
3180b57cec5SDimitry Andric BOOL rc;
3190b57cec5SDimitry Andric rc = GetSystemTimeAdjustment(&adjustment, &increment, &disabled);
3200b57cec5SDimitry Andric if (rc) {
3210b57cec5SDimitry Andric wtick = 1.0E-07 * (double)(disabled ? increment : adjustment);
3220b57cec5SDimitry Andric } else {
3230b57cec5SDimitry Andric // TODO: Assert or abort here.
3240b57cec5SDimitry Andric wtick = 1.0E-03;
3250b57cec5SDimitry Andric }
3260b57cec5SDimitry Andric }
3270b57cec5SDimitry Andric #else
3280b57cec5SDimitry Andric // TODO: gettimeofday() returns in microseconds, but what the precision?
3290b57cec5SDimitry Andric wtick = 1.0E-06;
3300b57cec5SDimitry Andric #endif
3310b57cec5SDimitry Andric return wtick;
3320b57cec5SDimitry Andric } // __kmps_get_wtick
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andric /* OpenMP 5.0 Memory Management */
3350b57cec5SDimitry Andric #if KMP_OS_WINDOWS
3360b57cec5SDimitry Andric omp_allocator_handle_t const omp_null_allocator = 0;
3370b57cec5SDimitry Andric omp_allocator_handle_t const omp_default_mem_alloc =
3380b57cec5SDimitry Andric (omp_allocator_handle_t const)1;
3390b57cec5SDimitry Andric omp_allocator_handle_t const omp_large_cap_mem_alloc =
3400b57cec5SDimitry Andric (omp_allocator_handle_t const)2;
3410b57cec5SDimitry Andric omp_allocator_handle_t const omp_const_mem_alloc =
3420b57cec5SDimitry Andric (omp_allocator_handle_t const)3;
3430b57cec5SDimitry Andric omp_allocator_handle_t const omp_high_bw_mem_alloc =
3440b57cec5SDimitry Andric (omp_allocator_handle_t const)4;
3450b57cec5SDimitry Andric omp_allocator_handle_t const omp_low_lat_mem_alloc =
3460b57cec5SDimitry Andric (omp_allocator_handle_t const)5;
3470b57cec5SDimitry Andric omp_allocator_handle_t const omp_cgroup_mem_alloc =
3480b57cec5SDimitry Andric (omp_allocator_handle_t const)6;
3490b57cec5SDimitry Andric omp_allocator_handle_t const omp_pteam_mem_alloc =
3500b57cec5SDimitry Andric (omp_allocator_handle_t const)7;
3510b57cec5SDimitry Andric omp_allocator_handle_t const omp_thread_mem_alloc =
3520b57cec5SDimitry Andric (omp_allocator_handle_t const)8;
353fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_host_mem_alloc =
354fe6060f1SDimitry Andric (omp_allocator_handle_t const)100;
355fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_shared_mem_alloc =
356fe6060f1SDimitry Andric (omp_allocator_handle_t const)101;
357fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_device_mem_alloc =
358fe6060f1SDimitry Andric (omp_allocator_handle_t const)102;
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andric omp_memspace_handle_t const omp_default_mem_space =
3610b57cec5SDimitry Andric (omp_memspace_handle_t const)0;
3620b57cec5SDimitry Andric omp_memspace_handle_t const omp_large_cap_mem_space =
3630b57cec5SDimitry Andric (omp_memspace_handle_t const)1;
3640b57cec5SDimitry Andric omp_memspace_handle_t const omp_const_mem_space =
3650b57cec5SDimitry Andric (omp_memspace_handle_t const)2;
3660b57cec5SDimitry Andric omp_memspace_handle_t const omp_high_bw_mem_space =
3670b57cec5SDimitry Andric (omp_memspace_handle_t const)3;
3680b57cec5SDimitry Andric omp_memspace_handle_t const omp_low_lat_mem_space =
3690b57cec5SDimitry Andric (omp_memspace_handle_t const)4;
370fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_host_mem_space =
371fe6060f1SDimitry Andric (omp_memspace_handle_t const)100;
372fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_shared_mem_space =
373fe6060f1SDimitry Andric (omp_memspace_handle_t const)101;
374fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_device_mem_space =
375fe6060f1SDimitry Andric (omp_memspace_handle_t const)102;
3760b57cec5SDimitry Andric #endif /* KMP_OS_WINDOWS */
377349cc55cSDimitry Andric
omp_alloc(size_t size,omp_allocator_handle_t allocator)378349cc55cSDimitry Andric void *omp_alloc(size_t size, omp_allocator_handle_t allocator) {
3790b57cec5SDimitry Andric i;
380349cc55cSDimitry Andric void *res;
381349cc55cSDimitry Andric #if KMP_OS_WINDOWS
382349cc55cSDimitry Andric // Returns a pointer to the memory block, or NULL if failed.
383349cc55cSDimitry Andric // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
384349cc55cSDimitry Andric // validation failed.
385349cc55cSDimitry Andric res = _aligned_malloc(size, 1);
386349cc55cSDimitry Andric #else
387349cc55cSDimitry Andric res = malloc(size);
388349cc55cSDimitry Andric #endif
389349cc55cSDimitry Andric return res;
3900b57cec5SDimitry Andric }
391349cc55cSDimitry Andric
omp_aligned_alloc(size_t a,size_t size,omp_allocator_handle_t al)392349cc55cSDimitry Andric void *omp_aligned_alloc(size_t a, size_t size, omp_allocator_handle_t al) {
393e8d8bef9SDimitry Andric i;
394349cc55cSDimitry Andric void *res;
395349cc55cSDimitry Andric #if KMP_OS_WINDOWS
396349cc55cSDimitry Andric res = _aligned_malloc(size, a);
397349cc55cSDimitry Andric #else
398*81ad6265SDimitry Andric int err;
399*81ad6265SDimitry Andric if ((err = posix_memalign(&res, a, size))) {
400349cc55cSDimitry Andric errno = err; // can be EINVAL or ENOMEM
401349cc55cSDimitry Andric res = NULL;
402e8d8bef9SDimitry Andric }
403349cc55cSDimitry Andric #endif
404349cc55cSDimitry Andric return res;
405e8d8bef9SDimitry Andric }
406349cc55cSDimitry Andric
omp_calloc(size_t nmemb,size_t size,omp_allocator_handle_t al)407349cc55cSDimitry Andric void *omp_calloc(size_t nmemb, size_t size, omp_allocator_handle_t al) {
4080b57cec5SDimitry Andric i;
409349cc55cSDimitry Andric void *res;
410349cc55cSDimitry Andric #if KMP_OS_WINDOWS
411349cc55cSDimitry Andric res = _aligned_recalloc(NULL, nmemb, size, 1);
412349cc55cSDimitry Andric #else
413349cc55cSDimitry Andric res = calloc(nmemb, size);
414349cc55cSDimitry Andric #endif
415349cc55cSDimitry Andric return res;
416349cc55cSDimitry Andric }
417349cc55cSDimitry Andric
omp_aligned_calloc(size_t a,size_t nmemb,size_t size,omp_allocator_handle_t al)418349cc55cSDimitry Andric void *omp_aligned_calloc(size_t a, size_t nmemb, size_t size,
419349cc55cSDimitry Andric omp_allocator_handle_t al) {
420349cc55cSDimitry Andric i;
421349cc55cSDimitry Andric void *res;
422349cc55cSDimitry Andric #if KMP_OS_WINDOWS
423349cc55cSDimitry Andric res = _aligned_recalloc(NULL, nmemb, size, a);
424349cc55cSDimitry Andric #else
425*81ad6265SDimitry Andric int err;
426*81ad6265SDimitry Andric if ((err = posix_memalign(&res, a, nmemb * size))) {
427349cc55cSDimitry Andric errno = err; // can be EINVAL or ENOMEM
428349cc55cSDimitry Andric res = NULL;
429349cc55cSDimitry Andric }
430349cc55cSDimitry Andric memset(res, 0x00, size);
431349cc55cSDimitry Andric #endif
432349cc55cSDimitry Andric return res;
433349cc55cSDimitry Andric }
434349cc55cSDimitry Andric
omp_realloc(void * ptr,size_t size,omp_allocator_handle_t al,omp_allocator_handle_t free_al)435349cc55cSDimitry Andric void *omp_realloc(void *ptr, size_t size, omp_allocator_handle_t al,
436349cc55cSDimitry Andric omp_allocator_handle_t free_al) {
437349cc55cSDimitry Andric i;
438349cc55cSDimitry Andric void *res;
439349cc55cSDimitry Andric #if KMP_OS_WINDOWS
440349cc55cSDimitry Andric res = _aligned_realloc(ptr, size, 1);
441349cc55cSDimitry Andric #else
442349cc55cSDimitry Andric res = realloc(ptr, size);
443349cc55cSDimitry Andric #endif
444349cc55cSDimitry Andric return res;
445349cc55cSDimitry Andric }
446349cc55cSDimitry Andric
omp_free(void * ptr,omp_allocator_handle_t allocator)447349cc55cSDimitry Andric void omp_free(void *ptr, omp_allocator_handle_t allocator) {
448349cc55cSDimitry Andric i;
449349cc55cSDimitry Andric #if KMP_OS_WINDOWS
450349cc55cSDimitry Andric _aligned_free(ptr);
451349cc55cSDimitry Andric #else
4520b57cec5SDimitry Andric free(ptr);
453349cc55cSDimitry Andric #endif
4540b57cec5SDimitry Andric }
455349cc55cSDimitry Andric
4560b57cec5SDimitry Andric /* OpenMP 5.0 Affinity Format */
omp_set_affinity_format(char const * format)4570b57cec5SDimitry Andric void omp_set_affinity_format(char const *format) { i; }
omp_get_affinity_format(char * buffer,size_t size)4580b57cec5SDimitry Andric size_t omp_get_affinity_format(char *buffer, size_t size) {
4590b57cec5SDimitry Andric i;
4600b57cec5SDimitry Andric return 0;
4610b57cec5SDimitry Andric }
omp_display_affinity(char const * format)4620b57cec5SDimitry Andric void omp_display_affinity(char const *format) { i; }
omp_capture_affinity(char * buffer,size_t buf_size,char const * format)4630b57cec5SDimitry Andric size_t omp_capture_affinity(char *buffer, size_t buf_size, char const *format) {
4640b57cec5SDimitry Andric i;
4650b57cec5SDimitry Andric return 0;
4660b57cec5SDimitry Andric }
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andric // end of file //
469