annotate liboffloadmic/runtime/ofldbegin.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +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 #if HOST_LIBRARY
kono
parents:
diff changeset
32 #include "offload_table.h"
kono
parents:
diff changeset
33 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
34 #include "offload_myo_host.h"
kono
parents:
diff changeset
35 #endif // MYO_SUPPORT
kono
parents:
diff changeset
36 #else
kono
parents:
diff changeset
37 #include "compiler_if_target.h"
kono
parents:
diff changeset
38 #include "offload_target.h"
kono
parents:
diff changeset
39 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
40 #include "offload_myo_target.h"
kono
parents:
diff changeset
41 #endif // MYO_SUPPORT
kono
parents:
diff changeset
42 #endif // HOST_LIBRARY
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 // Initializes library and registers specified offload image.
kono
parents:
diff changeset
45 // Don't use this declarations from offload_host.h as offload_table.h
kono
parents:
diff changeset
46 // is used instead of it. Using offload_host.h contradicts with
kono
parents:
diff changeset
47 // STL library compiled with VS2010.
kono
parents:
diff changeset
48 extern "C" bool __offload_register_image(const void* image);
kono
parents:
diff changeset
49 extern "C" void __offload_unregister_image(const void* image);
kono
parents:
diff changeset
50 extern "C" bool __offload_target_image_is_executable(const void *image);
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 #ifdef TARGET_WINNT
kono
parents:
diff changeset
53 #define ALLOCATE(name) __declspec(allocate(name))
kono
parents:
diff changeset
54 #define DLL_LOCAL
kono
parents:
diff changeset
55 #else // TARGET_WINNT
kono
parents:
diff changeset
56 #define ALLOCATE(name) __attribute__((section(name)))
kono
parents:
diff changeset
57 #define DLL_LOCAL __attribute__((visibility("hidden")))
kono
parents:
diff changeset
58 #endif // TARGET_WINNT
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 #if HOST_LIBRARY
kono
parents:
diff changeset
61 // the host program/shared library should always have __offload_target_image
kono
parents:
diff changeset
62 // symbol defined. This symbol specifies the beginning of the target program
kono
parents:
diff changeset
63 // image.
kono
parents:
diff changeset
64 extern "C" DLL_LOCAL const void* __offload_target_image;
kono
parents:
diff changeset
65 #else // HOST_LIBRARY
kono
parents:
diff changeset
66 // Define a weak main which would be used on target side in case usere's
kono
parents:
diff changeset
67 // source file containing main does not have offload code.
kono
parents:
diff changeset
68 #pragma weak main
kono
parents:
diff changeset
69 int main(void)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 OFFLOAD_TARGET_MAIN();
kono
parents:
diff changeset
72 return 0;
kono
parents:
diff changeset
73 }
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 #pragma weak MAIN__
kono
parents:
diff changeset
76 extern "C" int MAIN__(void)
kono
parents:
diff changeset
77 {
kono
parents:
diff changeset
78 OFFLOAD_TARGET_MAIN();
kono
parents:
diff changeset
79 return 0;
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81 #endif // HOST_LIBRARY
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 // offload section prolog
kono
parents:
diff changeset
84 ALLOCATE(OFFLOAD_ENTRY_TABLE_SECTION_START)
kono
parents:
diff changeset
85 #ifdef TARGET_WINNT
kono
parents:
diff changeset
86 __declspec(align(sizeof(FuncTable::Entry)))
kono
parents:
diff changeset
87 #endif // TARGET_WINNT
kono
parents:
diff changeset
88 static FuncTable::Entry __offload_entry_table_start = { 0 };
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 // list element for the current module
kono
parents:
diff changeset
91 static FuncList::Node __offload_entry_node = {
kono
parents:
diff changeset
92 { &__offload_entry_table_start + 1, -1 },
kono
parents:
diff changeset
93 0, 0
kono
parents:
diff changeset
94 };
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 // offload fp section prolog
kono
parents:
diff changeset
97 ALLOCATE(OFFLOAD_FUNC_TABLE_SECTION_START)
kono
parents:
diff changeset
98 #ifdef TARGET_WINNT
kono
parents:
diff changeset
99 __declspec(align(sizeof(FuncTable::Entry)))
kono
parents:
diff changeset
100 #endif // TARGET_WINNT
kono
parents:
diff changeset
101 static FuncTable::Entry __offload_func_table_start = { 0 };
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 // list element for the current module
kono
parents:
diff changeset
104 static FuncList::Node __offload_func_node = {
kono
parents:
diff changeset
105 { &__offload_func_table_start + 1, -1 },
kono
parents:
diff changeset
106 0, 0
kono
parents:
diff changeset
107 };
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 // offload fp section prolog
kono
parents:
diff changeset
110 ALLOCATE(OFFLOAD_VAR_TABLE_SECTION_START)
kono
parents:
diff changeset
111 #ifdef TARGET_WINNT
kono
parents:
diff changeset
112 __declspec(align(sizeof(VarTable::Entry)))
kono
parents:
diff changeset
113 #endif // TARGET_WINNT
kono
parents:
diff changeset
114 static VarTable::Entry __offload_var_table_start = { 0 };
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 // list element for the current module
kono
parents:
diff changeset
117 static VarList::Node __offload_var_node = {
kono
parents:
diff changeset
118 { &__offload_var_table_start + 1 },
kono
parents:
diff changeset
119 0, 0
kono
parents:
diff changeset
120 };
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 // offload myo shared var section prolog
kono
parents:
diff changeset
125 // first element is empty
kono
parents:
diff changeset
126 ALLOCATE(OFFLOAD_MYO_SHARED_TABLE_SECTION_START)
kono
parents:
diff changeset
127 #ifdef TARGET_WINNT
kono
parents:
diff changeset
128 __declspec(align(sizeof(SharedTableEntry)))
kono
parents:
diff changeset
129 #endif // TARGET_WINNT
kono
parents:
diff changeset
130 static MYOVarTable::Entry __offload_myo_shared_var_start = { 0 };
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 // list element for the current module
kono
parents:
diff changeset
133 // table entry pointer skips the empty first entry
kono
parents:
diff changeset
134 static MYOVarTableList::Node __offload_myo_shared_var_node = {
kono
parents:
diff changeset
135 { &__offload_myo_shared_var_start + 1 },
kono
parents:
diff changeset
136 0, 0
kono
parents:
diff changeset
137 };
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 // offload myo shared vtable section prolog
kono
parents:
diff changeset
140 // first element is empty
kono
parents:
diff changeset
141 ALLOCATE(OFFLOAD_MYO_SHARED_VTABLE_SECTION_START)
kono
parents:
diff changeset
142 #ifdef TARGET_WINNT
kono
parents:
diff changeset
143 __declspec(align(sizeof(SharedTableEntry)))
kono
parents:
diff changeset
144 #endif // TARGET_WINNT
kono
parents:
diff changeset
145 static MYOVarTable::Entry __offload_myo_shared_vtable_start = { 0 };
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 // list element for the current module
kono
parents:
diff changeset
148 // table entry pointer skips the empty first entry
kono
parents:
diff changeset
149 static MYOVarTableList::Node __offload_myo_shared_vtable_node = {
kono
parents:
diff changeset
150 { &__offload_myo_shared_vtable_start + 1 },
kono
parents:
diff changeset
151 0, 0
kono
parents:
diff changeset
152 };
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 // offload myo shared var init section prolog
kono
parents:
diff changeset
155 // first element is empty
kono
parents:
diff changeset
156 ALLOCATE(OFFLOAD_MYO_SHARED_INIT_TABLE_SECTION_START)
kono
parents:
diff changeset
157 #ifdef TARGET_WINNT
kono
parents:
diff changeset
158 __declspec(align(sizeof(InitTableEntry)))
kono
parents:
diff changeset
159 #endif // TARGET_WINNT
kono
parents:
diff changeset
160 static MYOInitTable::Entry __offload_myo_init_table_start = { 0 };
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 // list element for the current module
kono
parents:
diff changeset
163 // table entry pointer skips the empty first entry
kono
parents:
diff changeset
164 static MYOInitTableList::Node __offload_myo_init_table_node = {
kono
parents:
diff changeset
165 { &__offload_myo_init_table_start + 1 },
kono
parents:
diff changeset
166 0, 0
kono
parents:
diff changeset
167 };
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 // The functions and variables needed for a built-in
kono
parents:
diff changeset
170 // remote function entry for vtable initialization on MIC
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 #if !HOST_LIBRARY
kono
parents:
diff changeset
173 MyoError __offload_init_vtables(void)
kono
parents:
diff changeset
174 {
kono
parents:
diff changeset
175 SharedTableEntry *t_start;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 //OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
kono
parents:
diff changeset
178 t_start = &__offload_myo_shared_vtable_start + 1;
kono
parents:
diff changeset
179 //OFFLOAD_DEBUG_TRACE(3, "%s(%p)\n", __func__, t_start);
kono
parents:
diff changeset
180 while (t_start->varName != 0) {
kono
parents:
diff changeset
181 //OFFLOAD_DEBUG_TRACE(4,
kono
parents:
diff changeset
182 // "myo shared vtable \"%s\" &myo_ptr = %p myo_ptr = %p\n",
kono
parents:
diff changeset
183 // t_start->varName,
kono
parents:
diff changeset
184 // (void *)(t_start->sharedAddr),
kono
parents:
diff changeset
185 // ((void **)(t_start->sharedAddr))[0]);
kono
parents:
diff changeset
186 t_start++;
kono
parents:
diff changeset
187 }
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 __offload_myo_shared_init_table_process(
kono
parents:
diff changeset
190 &__offload_myo_init_table_start + 1);
kono
parents:
diff changeset
191 return MYO_SUCCESS;
kono
parents:
diff changeset
192 }
kono
parents:
diff changeset
193 #endif // !HOST_LIBRARY
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 static void vtable_initializer()
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 }
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 #if !HOST_LIBRARY
kono
parents:
diff changeset
200 static MyoError vtable_initializer_wrapper()
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 __offload_myoAcquire();
kono
parents:
diff changeset
203 __offload_init_vtables();
kono
parents:
diff changeset
204 __offload_myoRelease();
kono
parents:
diff changeset
205 return MYO_SUCCESS;
kono
parents:
diff changeset
206 }
kono
parents:
diff changeset
207 #endif
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 static void* __offload_vtable_initializer_thunk_ptr = 0;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 // offload myo fptr section prolog
kono
parents:
diff changeset
212 // first element is pre-initialized to the MIC vtable initializer
kono
parents:
diff changeset
213 ALLOCATE(OFFLOAD_MYO_FPTR_TABLE_SECTION_START)
kono
parents:
diff changeset
214 #ifdef TARGET_WINNT
kono
parents:
diff changeset
215 __declspec(align(sizeof(FptrTableEntry)))
kono
parents:
diff changeset
216 #endif // TARGET_WINNT
kono
parents:
diff changeset
217 static MYOFuncTable::Entry __offload_myo_fptr_table_start = {
kono
parents:
diff changeset
218 #if HOST_LIBRARY
kono
parents:
diff changeset
219 "--vtable_initializer--",
kono
parents:
diff changeset
220 (void*)&vtable_initializer,
kono
parents:
diff changeset
221 (void*)&__offload_vtable_initializer_thunk_ptr,
kono
parents:
diff changeset
222 #ifdef TARGET_WINNT
kono
parents:
diff changeset
223 // Dummy to pad up to 32 bytes
kono
parents:
diff changeset
224 0
kono
parents:
diff changeset
225 #endif // TARGET_WINNT
kono
parents:
diff changeset
226 #else // HOST_LIBRARY
kono
parents:
diff changeset
227 "--vtable_initializer--",
kono
parents:
diff changeset
228 (void*)&vtable_initializer,
kono
parents:
diff changeset
229 (void*)&vtable_initializer_wrapper,
kono
parents:
diff changeset
230 &__offload_vtable_initializer_thunk_ptr,
kono
parents:
diff changeset
231 #endif // HOST_LIBRARY
kono
parents:
diff changeset
232 };
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 // list element for the current module
kono
parents:
diff changeset
235 static MYOFuncTableList::Node __offload_myo_fptr_table_node = {
kono
parents:
diff changeset
236 { &__offload_myo_fptr_table_start },
kono
parents:
diff changeset
237 0, 0
kono
parents:
diff changeset
238 };
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 #endif // MYO_SUPPORT
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 // init/fini code which adds/removes local lookup data to/from the global list
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 static void offload_fini();
kono
parents:
diff changeset
245 static void offload_fini_so();
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 #ifndef TARGET_WINNT
kono
parents:
diff changeset
248 static void offload_init() __attribute__((constructor(101)));
kono
parents:
diff changeset
249 #else // TARGET_WINNT
kono
parents:
diff changeset
250 static void offload_init();
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 // Place offload initialization before user constructors
kono
parents:
diff changeset
253 ALLOCATE(OFFLOAD_CRTINIT_SECTION_START)
kono
parents:
diff changeset
254 static void (*addressof_offload_init)() = offload_init;
kono
parents:
diff changeset
255 #endif // TARGET_WINNT
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 static void offload_init()
kono
parents:
diff changeset
258 {
kono
parents:
diff changeset
259 bool success;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 // Set offload version
kono
parents:
diff changeset
262 __offload_set_version(OFFLOAD_VERSION_17);
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 // register offload tables
kono
parents:
diff changeset
265 __offload_register_tables(&__offload_entry_node,
kono
parents:
diff changeset
266 &__offload_func_node,
kono
parents:
diff changeset
267 &__offload_var_node);
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 #if HOST_LIBRARY
kono
parents:
diff changeset
270 success = __offload_register_image(&__offload_target_image);
kono
parents:
diff changeset
271 if (!success)
kono
parents:
diff changeset
272 {
kono
parents:
diff changeset
273 return;
kono
parents:
diff changeset
274 }
kono
parents:
diff changeset
275 #endif // HOST_LIBRARY
kono
parents:
diff changeset
276 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
277 #if HOST_LIBRARY
kono
parents:
diff changeset
278 // If this was the main program register main atexit routine
kono
parents:
diff changeset
279 if (__offload_myoProcessTables(
kono
parents:
diff changeset
280 &__offload_target_image,
kono
parents:
diff changeset
281 &__offload_myo_init_table_node,
kono
parents:
diff changeset
282 &__offload_myo_shared_var_node,
kono
parents:
diff changeset
283 &__offload_myo_shared_vtable_node,
kono
parents:
diff changeset
284 &__offload_myo_fptr_table_node))
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 atexit(offload_fini);
kono
parents:
diff changeset
287 #ifdef TARGET_WINNT
kono
parents:
diff changeset
288 } else {
kono
parents:
diff changeset
289 atexit(offload_fini_so);
kono
parents:
diff changeset
290 #endif
kono
parents:
diff changeset
291 }
kono
parents:
diff changeset
292 #else // HOST_LIBRARY
kono
parents:
diff changeset
293 __offload_myoProcessTables(
kono
parents:
diff changeset
294 &__offload_myo_init_table_start + 1,
kono
parents:
diff changeset
295 &__offload_myo_shared_var_start + 1,
kono
parents:
diff changeset
296 &__offload_myo_shared_vtable_start + 1,
kono
parents:
diff changeset
297 &__offload_myo_fptr_table_start
kono
parents:
diff changeset
298 );
kono
parents:
diff changeset
299 #endif // HOST_LIBRARY
kono
parents:
diff changeset
300 #endif // MYO_SUPPORT
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 #ifndef TARGET_WINNT
kono
parents:
diff changeset
304 static void offload_fini_so() __attribute__((destructor(101)));
kono
parents:
diff changeset
305 #endif // TARGET_WINNT
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 static void offload_fini()
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 #if HOST_LIBRARY
kono
parents:
diff changeset
310 __offload_unregister_image(&__offload_target_image);
kono
parents:
diff changeset
311 #endif // HOST_LIBRARY
kono
parents:
diff changeset
312 }
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 static void offload_fini_so()
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 // Offload and MYO tables need to be removed from list
kono
parents:
diff changeset
317 // to prevent invalid accesses after dlclose
kono
parents:
diff changeset
318 // Remove offload tables
kono
parents:
diff changeset
319 __offload_unregister_tables(&__offload_entry_node,
kono
parents:
diff changeset
320 &__offload_func_node,
kono
parents:
diff changeset
321 &__offload_var_node);
kono
parents:
diff changeset
322 #if HOST_LIBRARY
kono
parents:
diff changeset
323 if(!__offload_target_image_is_executable(&__offload_target_image)) {
kono
parents:
diff changeset
324 __offload_unregister_image(&__offload_target_image);
kono
parents:
diff changeset
325 }
kono
parents:
diff changeset
326 #endif
kono
parents:
diff changeset
327 #ifdef MYO_SUPPORT
kono
parents:
diff changeset
328 #if HOST_LIBRARY
kono
parents:
diff changeset
329 // Remove MYO tables
kono
parents:
diff changeset
330 __offload_myoRemoveTables(
kono
parents:
diff changeset
331 &__offload_myo_init_table_node,
kono
parents:
diff changeset
332 &__offload_myo_shared_var_node,
kono
parents:
diff changeset
333 &__offload_myo_shared_vtable_node,
kono
parents:
diff changeset
334 &__offload_myo_fptr_table_node);
kono
parents:
diff changeset
335 #endif // HOST_LIBRARY
kono
parents:
diff changeset
336 #endif // MYO_SUPPORT
kono
parents:
diff changeset
337 }