annotate liboffloadmic/runtime/offload_table.cpp @ 136:4627f235cf2a

fix c-next example
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:11:56 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /*
kono
parents:
diff changeset
2 Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Redistribution and use in source and binary forms, with or without
kono
parents:
diff changeset
5 modification, are permitted provided that the following conditions
kono
parents:
diff changeset
6 are met:
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 * Redistributions of source code must retain the above copyright
kono
parents:
diff changeset
9 notice, this list of conditions and the following disclaimer.
kono
parents:
diff changeset
10 * Redistributions in binary form must reproduce the above copyright
kono
parents:
diff changeset
11 notice, this list of conditions and the following disclaimer in the
kono
parents:
diff changeset
12 documentation and/or other materials provided with the distribution.
kono
parents:
diff changeset
13 * Neither the name of Intel Corporation nor the names of its
kono
parents:
diff changeset
14 contributors may be used to endorse or promote products derived
kono
parents:
diff changeset
15 from this software without specific prior written permission.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
kono
parents:
diff changeset
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
kono
parents:
diff changeset
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
kono
parents:
diff changeset
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
kono
parents:
diff changeset
21 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
kono
parents:
diff changeset
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
kono
parents:
diff changeset
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
kono
parents:
diff changeset
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
kono
parents:
diff changeset
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
kono
parents:
diff changeset
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
kono
parents:
diff changeset
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kono
parents:
diff changeset
28 */
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 #include "offload_table.h"
kono
parents:
diff changeset
32 #include "offload_common.h"
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 // Offload Library versioning
kono
parents:
diff changeset
35 // We initialize version to OFFLOAD_VERSION_16
kono
parents:
diff changeset
36 // 15.0 application downgrades this to 1500 for MYO to use the older version.
kono
parents:
diff changeset
37 // 15.0 pragma works without needing version-specific code.
kono
parents:
diff changeset
38 // 16.0-U2 added a call from ofldbegin.cpp to set the version explicitly.
kono
parents:
diff changeset
39 // Pre-16.0-U2 application will find pre-initialized version number as 1600.
kono
parents:
diff changeset
40 // Post 16.0-U2 application will set its own version explicitly.
kono
parents:
diff changeset
41 int offload_version = OFFLOAD_VERSION_16;
kono
parents:
diff changeset
42 int offload_version_count = 0;
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 #if !HOST_LIBRARY
kono
parents:
diff changeset
45 // Predefined offload entries
kono
parents:
diff changeset
46 extern void omp_set_num_threads_lrb(void*);
kono
parents:
diff changeset
47 extern void omp_get_max_threads_lrb(void*);
kono
parents:
diff changeset
48 extern void omp_get_num_procs_lrb(void*);
kono
parents:
diff changeset
49 extern void omp_set_dynamic_lrb(void*);
kono
parents:
diff changeset
50 extern void omp_get_dynamic_lrb(void*);
kono
parents:
diff changeset
51 extern void omp_set_nested_lrb(void*);
kono
parents:
diff changeset
52 extern void omp_get_nested_lrb(void*);
kono
parents:
diff changeset
53 extern void omp_set_schedule_lrb(void*);
kono
parents:
diff changeset
54 extern void omp_get_schedule_lrb(void*);
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 extern void omp_init_lock_lrb(void*);
kono
parents:
diff changeset
57 extern void omp_destroy_lock_lrb(void*);
kono
parents:
diff changeset
58 extern void omp_set_lock_lrb(void*);
kono
parents:
diff changeset
59 extern void omp_unset_lock_lrb(void*);
kono
parents:
diff changeset
60 extern void omp_test_lock_lrb(void*);
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 extern void omp_init_nest_lock_lrb(void*);
kono
parents:
diff changeset
63 extern void omp_destroy_nest_lock_lrb(void*);
kono
parents:
diff changeset
64 extern void omp_set_nest_lock_lrb(void*);
kono
parents:
diff changeset
65 extern void omp_unset_nest_lock_lrb(void*);
kono
parents:
diff changeset
66 extern void omp_test_nest_lock_lrb(void*);
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 // OpenMP 4.5 APIs
kono
parents:
diff changeset
69 extern void omp_target_alloc_target(void*);
kono
parents:
diff changeset
70 extern void omp_target_free_target(void*);
kono
parents:
diff changeset
71 extern void omp_target_memcpy_target(void*);
kono
parents:
diff changeset
72 extern void omp_target_memcpy_rect_target(void*);
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 // Predefined entries on the target side
kono
parents:
diff changeset
75 static FuncTable::Entry predefined_entries[] = {
kono
parents:
diff changeset
76 "omp_set_num_threads_target",
kono
parents:
diff changeset
77 (void*) &omp_set_num_threads_lrb,
kono
parents:
diff changeset
78 "omp_get_max_threads_target",
kono
parents:
diff changeset
79 (void*) &omp_get_max_threads_lrb,
kono
parents:
diff changeset
80 "omp_get_num_procs_target",
kono
parents:
diff changeset
81 (void*) &omp_get_num_procs_lrb,
kono
parents:
diff changeset
82 "omp_set_dynamic_target",
kono
parents:
diff changeset
83 (void*) &omp_set_dynamic_lrb,
kono
parents:
diff changeset
84 "omp_get_dynamic_target",
kono
parents:
diff changeset
85 (void*) &omp_get_dynamic_lrb,
kono
parents:
diff changeset
86 "omp_set_nested_target",
kono
parents:
diff changeset
87 (void*) &omp_set_nested_lrb,
kono
parents:
diff changeset
88 "omp_get_nested_target",
kono
parents:
diff changeset
89 (void*) &omp_get_nested_lrb,
kono
parents:
diff changeset
90 "omp_set_schedule_target",
kono
parents:
diff changeset
91 (void*) &omp_set_schedule_lrb,
kono
parents:
diff changeset
92 "omp_get_schedule_target",
kono
parents:
diff changeset
93 (void*) &omp_get_schedule_lrb,
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 "omp_init_lock_target",
kono
parents:
diff changeset
96 (void*) &omp_init_lock_lrb,
kono
parents:
diff changeset
97 "omp_destroy_lock_target",
kono
parents:
diff changeset
98 (void*) &omp_destroy_lock_lrb,
kono
parents:
diff changeset
99 "omp_set_lock_target",
kono
parents:
diff changeset
100 (void*) &omp_set_lock_lrb,
kono
parents:
diff changeset
101 "omp_unset_lock_target",
kono
parents:
diff changeset
102 (void*) &omp_unset_lock_lrb,
kono
parents:
diff changeset
103 "omp_test_lock_target",
kono
parents:
diff changeset
104 (void*) &omp_test_lock_lrb,
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 "omp_init_nest_lock_target",
kono
parents:
diff changeset
107 (void*) &omp_init_nest_lock_lrb,
kono
parents:
diff changeset
108 "omp_destroy_nest_lock_target",
kono
parents:
diff changeset
109 (void*) &omp_destroy_nest_lock_lrb,
kono
parents:
diff changeset
110 "omp_set_nest_lock_target",
kono
parents:
diff changeset
111 (void*) &omp_set_nest_lock_lrb,
kono
parents:
diff changeset
112 "omp_unset_nest_lock_target",
kono
parents:
diff changeset
113 (void*) &omp_unset_nest_lock_lrb,
kono
parents:
diff changeset
114 "omp_test_nest_lock_target",
kono
parents:
diff changeset
115 (void*) &omp_test_nest_lock_lrb,
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 "omp_target_alloc_target",
kono
parents:
diff changeset
118 (void*) &omp_target_alloc_target,
kono
parents:
diff changeset
119 "omp_target_free_target",
kono
parents:
diff changeset
120 (void*) &omp_target_free_target,
kono
parents:
diff changeset
121 "omp_target_memcpy_target",
kono
parents:
diff changeset
122 (void*) &omp_target_memcpy_target,
kono
parents:
diff changeset
123 "omp_target_memcpy_rect_target",
kono
parents:
diff changeset
124 (void*) &omp_target_memcpy_rect_target,
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 (const char*) -1,
kono
parents:
diff changeset
127 (void*) -1
kono
parents:
diff changeset
128 };
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 static FuncList::Node predefined_table = {
kono
parents:
diff changeset
131 { predefined_entries, -1 },
kono
parents:
diff changeset
132 0, 0
kono
parents:
diff changeset
133 };
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 // Entry table
kono
parents:
diff changeset
136 FuncList __offload_entries(&predefined_table);
kono
parents:
diff changeset
137 #else
kono
parents:
diff changeset
138 FuncList __offload_entries;
kono
parents:
diff changeset
139 #endif // !HOST_LIBRARY
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 extern "C" {
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 // Set library version
kono
parents:
diff changeset
144 void __offload_set_version(int v)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 offload_version_count++;
kono
parents:
diff changeset
147 if (offload_version_count == 1)
kono
parents:
diff changeset
148 {
kono
parents:
diff changeset
149 offload_version = v;
kono
parents:
diff changeset
150 }
kono
parents:
diff changeset
151 else
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 // Mix of versions is not supported
kono
parents:
diff changeset
154 if (v != offload_version)
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 LIBOFFLOAD_ERROR(c_mixed_versions);
kono
parents:
diff changeset
157 exit(1);
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159 }
kono
parents:
diff changeset
160 }
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 } // extern "C"
kono
parents:
diff changeset
163 // Function table. No predefined entries.
kono
parents:
diff changeset
164 FuncList __offload_funcs;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 // Var table
kono
parents:
diff changeset
167 VarList __offload_vars;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 // Given the function name returns the associtated function pointer
kono
parents:
diff changeset
170 const void* FuncList::find_addr(const char *name)
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 const void* func = 0;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 m_lock.lock();
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
177 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
178 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
179 if (e->name != 0 && strcmp(e->name, name) == 0) {
kono
parents:
diff changeset
180 func = e->func;
kono
parents:
diff changeset
181 break;
kono
parents:
diff changeset
182 }
kono
parents:
diff changeset
183 }
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 m_lock.unlock();
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 return func;
kono
parents:
diff changeset
189 }
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 // Given the function pointer returns the associtated function name
kono
parents:
diff changeset
192 const char* FuncList::find_name(const void *func)
kono
parents:
diff changeset
193 {
kono
parents:
diff changeset
194 const char* name = 0;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 m_lock.lock();
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
199 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
200 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
201 if (e->func == func) {
kono
parents:
diff changeset
202 name = e->name;
kono
parents:
diff changeset
203 break;
kono
parents:
diff changeset
204 }
kono
parents:
diff changeset
205 }
kono
parents:
diff changeset
206 }
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 m_lock.unlock();
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 return name;
kono
parents:
diff changeset
211 }
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 // Returns max name length from all tables
kono
parents:
diff changeset
214 int64_t FuncList::max_name_length(void)
kono
parents:
diff changeset
215 {
kono
parents:
diff changeset
216 if (m_max_name_len < 0) {
kono
parents:
diff changeset
217 m_lock.lock();
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 m_max_name_len = 0;
kono
parents:
diff changeset
220 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
221 if (n->table.max_name_len < 0) {
kono
parents:
diff changeset
222 n->table.max_name_len = 0;
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 // calculate max name length in a single table
kono
parents:
diff changeset
225 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
226 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
227 if (e->name != 0) {
kono
parents:
diff changeset
228 size_t len = strlen(e->name) + 1;
kono
parents:
diff changeset
229 if (n->table.max_name_len < len) {
kono
parents:
diff changeset
230 n->table.max_name_len = len;
kono
parents:
diff changeset
231 }
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233 }
kono
parents:
diff changeset
234 }
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 // select max from all tables
kono
parents:
diff changeset
237 if (m_max_name_len < n->table.max_name_len) {
kono
parents:
diff changeset
238 m_max_name_len = n->table.max_name_len;
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 m_lock.unlock();
kono
parents:
diff changeset
243 }
kono
parents:
diff changeset
244 return m_max_name_len;
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 // Debugging dump
kono
parents:
diff changeset
248 void FuncList::dump(void)
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 OFFLOAD_DEBUG_TRACE(2, "Function table:\n");
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 m_lock.lock();
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
255 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
256 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
257 if (e->name != 0) {
kono
parents:
diff changeset
258 OFFLOAD_DEBUG_TRACE(2, "%p %s\n", e->func, e->name);
kono
parents:
diff changeset
259 }
kono
parents:
diff changeset
260 }
kono
parents:
diff changeset
261 }
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 m_lock.unlock();
kono
parents:
diff changeset
264 }
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 // Debugging dump
kono
parents:
diff changeset
267 void VarList::dump(void)
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 OFFLOAD_DEBUG_TRACE(2, "Var table:\n");
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 m_lock.lock();
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
274 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
275 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
276 if (e->name != 0) {
kono
parents:
diff changeset
277 #if HOST_LIBRARY
kono
parents:
diff changeset
278 OFFLOAD_DEBUG_TRACE(2, "%s %p %ld\n", e->name, e->addr,
kono
parents:
diff changeset
279 e->size);
kono
parents:
diff changeset
280 #else // HOST_LIBRARY
kono
parents:
diff changeset
281 OFFLOAD_DEBUG_TRACE(2, "%s %p\n", e->name, e->addr);
kono
parents:
diff changeset
282 #endif // HOST_LIBRARY
kono
parents:
diff changeset
283 }
kono
parents:
diff changeset
284 }
kono
parents:
diff changeset
285 }
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 m_lock.unlock();
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 //
kono
parents:
diff changeset
291 int64_t VarList::table_size(int64_t &nelems)
kono
parents:
diff changeset
292 {
kono
parents:
diff changeset
293 int64_t length = 0;
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 nelems = 0;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 // calculate string table size and number of elements
kono
parents:
diff changeset
298 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
299 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
300 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
301 if (e->name != 0) {
kono
parents:
diff changeset
302 length += strlen(e->name) + 1;
kono
parents:
diff changeset
303 nelems++;
kono
parents:
diff changeset
304 }
kono
parents:
diff changeset
305 }
kono
parents:
diff changeset
306 }
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 return nelems * sizeof(BufEntry) + length;
kono
parents:
diff changeset
309 }
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 // copy table to the gven buffer
kono
parents:
diff changeset
312 void VarList::table_copy(void *buf, int64_t nelems)
kono
parents:
diff changeset
313 {
kono
parents:
diff changeset
314 BufEntry* elems = static_cast<BufEntry*>(buf);
kono
parents:
diff changeset
315 char* names = reinterpret_cast<char*>(elems + nelems);
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 // copy entries to buffer
kono
parents:
diff changeset
318 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
319 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
320 e->name != (const char*) -1; e++) {
kono
parents:
diff changeset
321 if (e->name != 0) {
kono
parents:
diff changeset
322 // name field contains offset to the name from the beginning
kono
parents:
diff changeset
323 // of the buffer
kono
parents:
diff changeset
324 elems->name = names - static_cast<char*>(buf);
kono
parents:
diff changeset
325 elems->addr = reinterpret_cast<intptr_t>(e->addr);
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 // copy name to string table
kono
parents:
diff changeset
328 const char *name = e->name;
kono
parents:
diff changeset
329 while ((*names++ = *name++) != '\0');
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 elems++;
kono
parents:
diff changeset
332 }
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334 }
kono
parents:
diff changeset
335 }
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 // patch name offsets in a buffer
kono
parents:
diff changeset
338 void VarList::table_patch_names(void *buf, int64_t nelems)
kono
parents:
diff changeset
339 {
kono
parents:
diff changeset
340 BufEntry* elems = static_cast<BufEntry*>(buf);
kono
parents:
diff changeset
341 for (int i = 0; i < nelems; i++) {
kono
parents:
diff changeset
342 elems[i].name += reinterpret_cast<intptr_t>(buf);
kono
parents:
diff changeset
343 }
kono
parents:
diff changeset
344 }
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 #if HOST_LIBRARY
kono
parents:
diff changeset
347 // 16.0 and earlier compilers used the following VarTable
kono
parents:
diff changeset
348 struct OldVarTable {
kono
parents:
diff changeset
349 const char* name;
kono
parents:
diff changeset
350 void* addr;
kono
parents:
diff changeset
351 // uint64_t var_alloc_type missing in 16.0 and earlier
kono
parents:
diff changeset
352 uint64_t size;
kono
parents:
diff changeset
353 };
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 static void convert_OldVarTable_to_NewVarTable(VarList::Node *vt_start)
kono
parents:
diff changeset
356 {
kono
parents:
diff changeset
357 int table_size = 0;
kono
parents:
diff changeset
358 char * new_var_table;
kono
parents:
diff changeset
359 OldVarTable *old_var_table;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 OFFLOAD_DEBUG_TRACE(2,
kono
parents:
diff changeset
362 "Converting old var table to new var table to support backward compatiblity\n");
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 // Calculate size of memory to be malloced
kono
parents:
diff changeset
365 old_var_table = (OldVarTable *) vt_start->table.entries;
kono
parents:
diff changeset
366 while (old_var_table->name != (const char*) -1) {
kono
parents:
diff changeset
367 table_size++;
kono
parents:
diff changeset
368 old_var_table++;
kono
parents:
diff changeset
369 }
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 if (table_size != 0) {
kono
parents:
diff changeset
372 // Add 1 to table_size for end of table signature
kono
parents:
diff changeset
373 VarTable::Entry *new_var_table =
kono
parents:
diff changeset
374 new VarTable::Entry[table_size+1];
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 if (new_var_table == NULL)
kono
parents:
diff changeset
377 LIBOFFLOAD_ERROR(c_malloc);
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 old_var_table = (OldVarTable *) vt_start->table.entries;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 // Update VarList with new table
kono
parents:
diff changeset
382 vt_start->table.entries = new_var_table;
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 // Fix up the new table value from old table
kono
parents:
diff changeset
385 for (int i=0; i< table_size; i++) {
kono
parents:
diff changeset
386 new_var_table->name = old_var_table->name;
kono
parents:
diff changeset
387 new_var_table->addr = old_var_table->addr;
kono
parents:
diff changeset
388 new_var_table->size = old_var_table->size;
kono
parents:
diff changeset
389 // Assign value of 0 for the missing field.
kono
parents:
diff changeset
390 // Implying it is neither IMPLICIT or LINK variable as
kono
parents:
diff changeset
391 // they were not supported in earlier compilers
kono
parents:
diff changeset
392 new_var_table->var_alloc_type = 0;
kono
parents:
diff changeset
393 old_var_table++;
kono
parents:
diff changeset
394 new_var_table++;
kono
parents:
diff changeset
395 }
kono
parents:
diff changeset
396 new_var_table->name = (const char *)-1;
kono
parents:
diff changeset
397 }
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 }
kono
parents:
diff changeset
400 #endif //HOST_LIBRARY
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 // Adds given list element to the global lookup table list
kono
parents:
diff changeset
403 extern "C" void __offload_register_tables(
kono
parents:
diff changeset
404 FuncList::Node *entry_table,
kono
parents:
diff changeset
405 FuncList::Node *func_table,
kono
parents:
diff changeset
406 VarList::Node *var_table
kono
parents:
diff changeset
407 )
kono
parents:
diff changeset
408 {
kono
parents:
diff changeset
409 OFFLOAD_DEBUG_TRACE(2, "Registering offload function entry table %p\n",
kono
parents:
diff changeset
410 entry_table);
kono
parents:
diff changeset
411 __offload_entries.add_table(entry_table);
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 OFFLOAD_DEBUG_TRACE(2, "Registering function table %p\n", func_table);
kono
parents:
diff changeset
414 __offload_funcs.add_table(func_table);
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 OFFLOAD_DEBUG_TRACE(2, "Registering var table %p\n", var_table);
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 // Compiler earlier than 17.0 used a different var_table.
kono
parents:
diff changeset
419 // Convert the old table to new var_table format.
kono
parents:
diff changeset
420 // Only the host table for LINUX has changed.
kono
parents:
diff changeset
421 #ifndef TARGET_WINNT
kono
parents:
diff changeset
422 #if HOST_LIBRARY
kono
parents:
diff changeset
423 if (offload_version < OFFLOAD_VERSION_17) {
kono
parents:
diff changeset
424 convert_OldVarTable_to_NewVarTable(var_table);
kono
parents:
diff changeset
425 }
kono
parents:
diff changeset
426 #endif
kono
parents:
diff changeset
427 #endif
kono
parents:
diff changeset
428 __offload_vars.add_table(var_table);
kono
parents:
diff changeset
429 }
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 // Removes given list element from the global lookup table list
kono
parents:
diff changeset
432 extern "C" void __offload_unregister_tables(
kono
parents:
diff changeset
433 FuncList::Node *entry_table,
kono
parents:
diff changeset
434 FuncList::Node *func_table,
kono
parents:
diff changeset
435 VarList::Node *var_table
kono
parents:
diff changeset
436 )
kono
parents:
diff changeset
437 {
kono
parents:
diff changeset
438 OFFLOAD_DEBUG_TRACE(2, "Unregistering offload function entry table %p\n",
kono
parents:
diff changeset
439 entry_table);
kono
parents:
diff changeset
440 __offload_entries.remove_table(entry_table);
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 OFFLOAD_DEBUG_TRACE(2, "Unregistering function table %p\n", func_table);
kono
parents:
diff changeset
443 __offload_funcs.remove_table(func_table);
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 OFFLOAD_DEBUG_TRACE(2, "Unregistering var table %p\n", var_table);
kono
parents:
diff changeset
446 #ifndef TARGET_WINNT
kono
parents:
diff changeset
447 #if HOST_LIBRARY
kono
parents:
diff changeset
448 if (offload_version < OFFLOAD_VERSION_17) {
kono
parents:
diff changeset
449 // Free the malloced var_table created for backward compatiblity
kono
parents:
diff changeset
450 delete var_table->table.entries;
kono
parents:
diff changeset
451 }
kono
parents:
diff changeset
452 #endif
kono
parents:
diff changeset
453 #endif
kono
parents:
diff changeset
454 __offload_vars.remove_table(var_table);
kono
parents:
diff changeset
455 }
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 MYOVarTableList __offload_myo_var_tables;
kono
parents:
diff changeset
460 MYOVarTableList __offload_myo_vtable_tables;
kono
parents:
diff changeset
461 MYOFuncTableList __offload_myo_func_tables;
kono
parents:
diff changeset
462 MYOInitTableList __offload_myo_init_tables;
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 // Debugging dump
kono
parents:
diff changeset
465 void MYOVarTableList::dump(void)
kono
parents:
diff changeset
466 {
kono
parents:
diff changeset
467 OFFLOAD_DEBUG_TRACE(2, "MYO Var tables:\n");
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 m_lock.lock();
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
472 OFFLOAD_DEBUG_TRACE(2, " MYO Var table:\n");
kono
parents:
diff changeset
473 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
474 e->varName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
475 #ifdef TARGET_WINNT
kono
parents:
diff changeset
476 if (e->varName == 0) {
kono
parents:
diff changeset
477 continue;
kono
parents:
diff changeset
478 }
kono
parents:
diff changeset
479 #endif // TARGET_WINNT
kono
parents:
diff changeset
480 OFFLOAD_DEBUG_TRACE(2, " %s %p\n",
kono
parents:
diff changeset
481 e->varName, e->sharedAddr);
kono
parents:
diff changeset
482 }
kono
parents:
diff changeset
483 }
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 m_lock.unlock();
kono
parents:
diff changeset
486 }
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 // check if any shared variables
kono
parents:
diff changeset
489 bool MYOVarTableList::is_empty()
kono
parents:
diff changeset
490 {
kono
parents:
diff changeset
491 OFFLOAD_DEBUG_TRACE(3, "Are MYO Var tables empty?\n");
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 m_lock.lock();
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
496 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
497 e->varName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
498 #ifdef TARGET_WINNT
kono
parents:
diff changeset
499 if (e->varName == 0) {
kono
parents:
diff changeset
500 continue;
kono
parents:
diff changeset
501 }
kono
parents:
diff changeset
502 #endif // TARGET_WINNT
kono
parents:
diff changeset
503 m_lock.unlock();
kono
parents:
diff changeset
504 OFFLOAD_DEBUG_TRACE(3, "No\n");
kono
parents:
diff changeset
505 return false;
kono
parents:
diff changeset
506 }
kono
parents:
diff changeset
507 }
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 m_lock.unlock();
kono
parents:
diff changeset
510 OFFLOAD_DEBUG_TRACE(3, "Yes\n");
kono
parents:
diff changeset
511 return true;
kono
parents:
diff changeset
512 }
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 void MYOFuncTableList::dump(void)
kono
parents:
diff changeset
515 {
kono
parents:
diff changeset
516 OFFLOAD_DEBUG_TRACE(2, "MYO Func tables:\n");
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 m_lock.lock();
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
521 OFFLOAD_DEBUG_TRACE(2, " MYO Func table:\n");
kono
parents:
diff changeset
522 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
523 e->funcName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
524 #ifdef TARGET_WINNT
kono
parents:
diff changeset
525 if (e->funcName == 0) {
kono
parents:
diff changeset
526 continue;
kono
parents:
diff changeset
527 }
kono
parents:
diff changeset
528 #endif // TARGET_WINNT
kono
parents:
diff changeset
529 #if HOST_LIBRARY
kono
parents:
diff changeset
530 OFFLOAD_DEBUG_TRACE(2, " %s %p %p\n",
kono
parents:
diff changeset
531 e->funcName, e->funcAddr, e->localThunkAddr);
kono
parents:
diff changeset
532 #else // HOST_LIBRARY
kono
parents:
diff changeset
533 OFFLOAD_DEBUG_TRACE(2, " %s %p %p %p\n",
kono
parents:
diff changeset
534 e->funcName, e->funcAddr, e->wrapFuncAddr, e->localThunkAddr);
kono
parents:
diff changeset
535 #endif // HOST_LIBRARY
kono
parents:
diff changeset
536 }
kono
parents:
diff changeset
537 }
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 m_lock.unlock();
kono
parents:
diff changeset
540 }
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 // check if any shared functions
kono
parents:
diff changeset
543 bool MYOFuncTableList::is_empty()
kono
parents:
diff changeset
544 {
kono
parents:
diff changeset
545 OFFLOAD_DEBUG_TRACE(3, "Are MYO Func tables empty?\n");
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 m_lock.lock();
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
550 int count = 0;
kono
parents:
diff changeset
551 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
552 e->funcName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
553 #ifdef TARGET_WINNT
kono
parents:
diff changeset
554 if (e->funcName == 0) {
kono
parents:
diff changeset
555 continue;
kono
parents:
diff changeset
556 }
kono
parents:
diff changeset
557 #endif // TARGET_WINNT
kono
parents:
diff changeset
558 count++;
kono
parents:
diff changeset
559 if (count > 1) {
kono
parents:
diff changeset
560 m_lock.unlock();
kono
parents:
diff changeset
561 OFFLOAD_DEBUG_TRACE(3, "No\n");
kono
parents:
diff changeset
562 return false;
kono
parents:
diff changeset
563 }
kono
parents:
diff changeset
564 }
kono
parents:
diff changeset
565 }
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 m_lock.unlock();
kono
parents:
diff changeset
568 OFFLOAD_DEBUG_TRACE(3, "Yes\n");
kono
parents:
diff changeset
569 return true;
kono
parents:
diff changeset
570 }
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 void MYOInitTableList::dump(void)
kono
parents:
diff changeset
573 {
kono
parents:
diff changeset
574 OFFLOAD_DEBUG_TRACE(2, "MYO Init tables:\n");
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 m_lock.lock();
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
579 OFFLOAD_DEBUG_TRACE(2, " MYO Init table:\n");
kono
parents:
diff changeset
580 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
581 #ifdef TARGET_WINNT
kono
parents:
diff changeset
582 e->funcName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
583 if (e->funcName == 0) {
kono
parents:
diff changeset
584 continue;
kono
parents:
diff changeset
585 }
kono
parents:
diff changeset
586 OFFLOAD_DEBUG_TRACE(2, " %s %p\n", e->funcName, e->func);
kono
parents:
diff changeset
587 #else // TARGET_WINNT
kono
parents:
diff changeset
588 e->func != 0; e++) {
kono
parents:
diff changeset
589 OFFLOAD_DEBUG_TRACE(2, " %p\n", e->func);
kono
parents:
diff changeset
590 #endif // TARGET_WINNT
kono
parents:
diff changeset
591 }
kono
parents:
diff changeset
592 }
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 m_lock.unlock();
kono
parents:
diff changeset
595 }
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 // check if any shared functions
kono
parents:
diff changeset
598 bool MYOInitTableList::is_empty()
kono
parents:
diff changeset
599 {
kono
parents:
diff changeset
600 OFFLOAD_DEBUG_TRACE(3, "Are MYO Init tables empty?\n");
kono
parents:
diff changeset
601
kono
parents:
diff changeset
602 m_lock.lock();
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 for (Node *n = m_head; n != 0; n = n->next) {
kono
parents:
diff changeset
605 for (const Table::Entry *e = n->table.entries;
kono
parents:
diff changeset
606 #ifdef TARGET_WINNT
kono
parents:
diff changeset
607 e->funcName != MYO_TABLE_END_MARKER(); e++) {
kono
parents:
diff changeset
608 if (e->funcName == 0) {
kono
parents:
diff changeset
609 continue;
kono
parents:
diff changeset
610 }
kono
parents:
diff changeset
611 m_lock.unlock();
kono
parents:
diff changeset
612 OFFLOAD_DEBUG_TRACE(3, "No\n");
kono
parents:
diff changeset
613 return false;
kono
parents:
diff changeset
614 #else // TARGET_WINNT
kono
parents:
diff changeset
615 e->func != 0; e++) {
kono
parents:
diff changeset
616 #endif // TARGET_WINNT
kono
parents:
diff changeset
617 }
kono
parents:
diff changeset
618 }
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 m_lock.unlock();
kono
parents:
diff changeset
621 OFFLOAD_DEBUG_TRACE(3, "Yes\n");
kono
parents:
diff changeset
622 return true;
kono
parents:
diff changeset
623 }
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 extern "C" void __offload_myoRegisterTables1(
kono
parents:
diff changeset
626 MYOInitTableList::Node *init_table,
kono
parents:
diff changeset
627 MYOVarTableList::Node *shared_table,
kono
parents:
diff changeset
628 MYOVarTableList::Node *shared_vtable,
kono
parents:
diff changeset
629 MYOFuncTableList::Node *fptr_table
kono
parents:
diff changeset
630 )
kono
parents:
diff changeset
631 {
kono
parents:
diff changeset
632 OFFLOAD_DEBUG_TRACE(2, "Registering MYO shared var table %p\n",
kono
parents:
diff changeset
633 shared_table);
kono
parents:
diff changeset
634 __offload_myo_var_tables.add_table(shared_table);
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 OFFLOAD_DEBUG_TRACE(2, "Registering MYO shared vtable table %p\n",
kono
parents:
diff changeset
637 shared_vtable);
kono
parents:
diff changeset
638 __offload_myo_vtable_tables.add_table(shared_vtable);
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 OFFLOAD_DEBUG_TRACE(2, "Registering MYO function table %p\n", fptr_table);
kono
parents:
diff changeset
641 __offload_myo_func_tables.add_table(fptr_table);
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 OFFLOAD_DEBUG_TRACE(2, "Registering MYO init table %p\n", init_table);
kono
parents:
diff changeset
644 __offload_myo_init_tables.add_table(init_table);
kono
parents:
diff changeset
645 }
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 extern "C" void __offload_myoRemoveTables(
kono
parents:
diff changeset
648 MYOInitTableList::Node *init_table,
kono
parents:
diff changeset
649 MYOVarTableList::Node *shared_table,
kono
parents:
diff changeset
650 MYOVarTableList::Node *shared_vtable,
kono
parents:
diff changeset
651 MYOFuncTableList::Node *fptr_table
kono
parents:
diff changeset
652 )
kono
parents:
diff changeset
653 {
kono
parents:
diff changeset
654 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 OFFLOAD_DEBUG_TRACE(2, "Removing MYO shared var table %p\n",
kono
parents:
diff changeset
657 shared_table);
kono
parents:
diff changeset
658 __offload_myo_var_tables.remove_table(shared_table);
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 OFFLOAD_DEBUG_TRACE(2, "Removing MYO shared vtable table %p\n",
kono
parents:
diff changeset
661 shared_vtable);
kono
parents:
diff changeset
662 __offload_myo_vtable_tables.remove_table(shared_vtable);
kono
parents:
diff changeset
663
kono
parents:
diff changeset
664 OFFLOAD_DEBUG_TRACE(2, "Removing MYO function table %p\n", fptr_table);
kono
parents:
diff changeset
665 __offload_myo_func_tables.remove_table(fptr_table);
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 OFFLOAD_DEBUG_TRACE(2, "Removing MYO init table %p\n", init_table);
kono
parents:
diff changeset
668 __offload_myo_init_tables.remove_table(init_table);
kono
parents:
diff changeset
669 }
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 #endif // MYO_SUPPORT