]> git.ipfire.org Git - thirdparty/gcc.git/blame - liboffloadmic/runtime/offload_util.h
backport: Makefile.am (myo_inc_dir): Remove.
[thirdparty/gcc.git] / liboffloadmic / runtime / offload_util.h
CommitLineData
5f520819 1/*
df26a50d 2 Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved.
5f520819
KY
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30
31#ifndef OFFLOAD_UTIL_H_INCLUDED
32#define OFFLOAD_UTIL_H_INCLUDED
33
5f520819 34#include <stdlib.h>
5f520819
KY
35
36#ifdef TARGET_WINNT
2eab9666
IV
37 #define DLL_LOCAL
38#else
39 #define DLL_LOCAL __attribute__((visibility("hidden")))
40#endif
41
42#ifdef TARGET_WINNT
43// Don't use <stdint.h> as compiling with VS2010 makes ofldbegin.obj
44// incompatible with STL library of versions older than VS2010.
45typedef unsigned long long int uint64_t;
46typedef signed long long int int64_t;
5f520819
KY
47#include <windows.h>
48#include <process.h>
49#else // TARGET_WINNT
2eab9666 50#include <stdint.h>
5f520819
KY
51#include <dlfcn.h>
52#include <pthread.h>
53#endif // TARGET_WINNT
54
55#ifdef TARGET_WINNT
56typedef unsigned pthread_key_t;
57typedef int pid_t;
58
59#define __func__ __FUNCTION__
60#define strtok_r(s,d,p) strtok_s(s,d,p)
61#define strcasecmp(a,b) stricmp(a,b)
62
63#define thread_key_create(key, destructor) \
64 (((*key = TlsAlloc()) > 0) ? 0 : GetLastError())
65#define thread_key_delete(key) TlsFree(key)
66
67#ifndef S_ISREG
68#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
69#endif
70
71void* thread_getspecific(pthread_key_t key);
72int thread_setspecific(pthread_key_t key, const void *value);
73#else
74#define thread_key_create(key, destructor) \
75 pthread_key_create((key), (destructor))
76#define thread_key_delete(key) pthread_key_delete(key)
77#define thread_getspecific(key) pthread_getspecific(key)
78#define thread_setspecific(key, value) pthread_setspecific(key, value)
79#endif // TARGET_WINNT
80
81// Mutex implementation
82struct mutex_t {
83 mutex_t() {
84#ifdef TARGET_WINNT
85 InitializeCriticalSection(&m_lock);
86#else // TARGET_WINNT
87 pthread_mutex_init(&m_lock, 0);
88#endif // TARGET_WINNT
89 }
90
91 ~mutex_t() {
92#ifdef TARGET_WINNT
93 DeleteCriticalSection(&m_lock);
94#else // TARGET_WINNT
95 pthread_mutex_destroy(&m_lock);
96#endif // TARGET_WINNT
97 }
98
99 void lock() {
100#ifdef TARGET_WINNT
101 EnterCriticalSection(&m_lock);
102#else // TARGET_WINNT
103 pthread_mutex_lock(&m_lock);
104#endif // TARGET_WINNT
105 }
106
107 void unlock() {
108#ifdef TARGET_WINNT
109 LeaveCriticalSection(&m_lock);
110#else // TARGET_WINNT
111 pthread_mutex_unlock(&m_lock);
112#endif // TARGET_WINNT
113 }
114
115private:
116#ifdef TARGET_WINNT
117 CRITICAL_SECTION m_lock;
118#else
119 pthread_mutex_t m_lock;
120#endif
121};
122
123struct mutex_locker_t {
124 mutex_locker_t(mutex_t &mutex) : m_mutex(mutex) {
125 m_mutex.lock();
126 }
127
128 ~mutex_locker_t() {
129 m_mutex.unlock();
130 }
131
132private:
133 mutex_t &m_mutex;
134};
135
136// Dynamic loader interface
137#ifdef TARGET_WINNT
138struct Dl_info
139{
140 char dli_fname[MAX_PATH];
141 void *dli_fbase;
142 char dli_sname[MAX_PATH];
143 const void *dli_saddr;
144};
145
146void* DL_open(const char *path);
147#define DL_close(handle) FreeLibrary((HMODULE) (handle))
148int DL_addr(const void *addr, Dl_info *info);
149#else
150#define DL_open(path) dlopen((path), RTLD_NOW)
151#define DL_close(handle) dlclose(handle)
152#define DL_addr(addr, info) dladdr((addr), (info))
153#endif // TARGET_WINNT
154
2eab9666 155DLL_LOCAL extern void* DL_sym(void *handle, const char *name, const char *version);
5f520819
KY
156
157// One-time initialization API
158#ifdef TARGET_WINNT
159typedef INIT_ONCE OffloadOnceControl;
160#define OFFLOAD_ONCE_CONTROL_INIT INIT_ONCE_STATIC_INIT
161
162extern void __offload_run_once(OffloadOnceControl *ctrl, void (*func)(void));
163#else
164typedef pthread_once_t OffloadOnceControl;
165#define OFFLOAD_ONCE_CONTROL_INIT PTHREAD_ONCE_INIT
166
167#define __offload_run_once(ctrl, func) pthread_once(ctrl, func)
168#endif // TARGET_WINNT
169
170// Parses size specification string.
2eab9666 171DLL_LOCAL extern bool __offload_parse_size_string(const char *str, uint64_t &new_size);
5f520819
KY
172
173// Parses string with integer value
2eab9666 174DLL_LOCAL extern bool __offload_parse_int_string(const char *str, int64_t &value);
5f520819
KY
175
176// get value by its base, offset and size
2eab9666 177DLL_LOCAL int64_t get_el_value(
5f520819
KY
178 char *base,
179 int64_t offset,
180 int64_t size
181);
182#endif // OFFLOAD_UTIL_H_INCLUDED