blob: eeb1c4f272ce75a80586eb480b608fa59952044e [file] [log] [blame]
Jim Cownie33f7b242014-04-09 15:40:23 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.txt for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11#include "offload_myo_target.h"
12#include "offload_target.h"
13
14extern "C" void __cilkrts_cilk_for_32(void*, void*, uint32_t, int32_t);
15extern "C" void __cilkrts_cilk_for_64(void*, void*, uint64_t, int32_t);
16
17#pragma weak __cilkrts_cilk_for_32
18#pragma weak __cilkrts_cilk_for_64
19
20static void CheckResult(const char *func, MyoError error) {
21 if (error != MYO_SUCCESS) {
22 LIBOFFLOAD_ERROR(c_myotarget_checkresult, func, error);
23 exit(1);
24 }
25}
26
27static void __offload_myo_shared_table_register(SharedTableEntry *entry)
28{
29 int entries = 0;
30 SharedTableEntry *t_start;
31
32 OFFLOAD_DEBUG_TRACE(3, "%s(%p)\n", __func__, entry);
33
34 t_start = entry;
35 while (t_start->varName != 0) {
36 OFFLOAD_DEBUG_TRACE_1(4, 0, c_offload_mic_myo_shared,
37 "myo shared entry name = \"%s\" addr = %p\n",
38 t_start->varName, t_start->sharedAddr);
39 t_start++;
40 entries++;
41 }
42
43 if (entries > 0) {
44 OFFLOAD_DEBUG_TRACE(3, "myoiMicVarTableRegister(%p, %d)\n", entry,
45 entries);
46 CheckResult("myoiMicVarTableRegister",
47 myoiMicVarTableRegister(entry, entries));
48 }
49}
50
51static void __offload_myo_fptr_table_register(
52 FptrTableEntry *entry
53)
54{
55 int entries = 0;
56 FptrTableEntry *t_start;
57
58 OFFLOAD_DEBUG_TRACE(3, "%s(%p)\n", __func__, entry);
59
60 t_start = entry;
61 while (t_start->funcName != 0) {
62 OFFLOAD_DEBUG_TRACE_1(4, 0, c_offload_mic_myo_fptr,
63 "myo fptr entry name = \"%s\" addr = %p\n",
64 t_start->funcName, t_start->funcAddr);
65 t_start++;
66 entries++;
67 }
68
69 if (entries > 0) {
70 OFFLOAD_DEBUG_TRACE(3, "myoiTargetFptrTableRegister(%p, %d, 0)\n",
71 entry, entries);
72 CheckResult("myoiTargetFptrTableRegister",
73 myoiTargetFptrTableRegister(entry, entries, 0));
74 }
75}
76
77extern "C" void __offload_myoAcquire(void)
78{
79 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
80 CheckResult("myoAcquire", myoAcquire());
81}
82
83extern "C" void __offload_myoRelease(void)
84{
85 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
86 CheckResult("myoRelease", myoRelease());
87}
88
89extern "C" void __intel_cilk_for_32_offload_wrapper(void *args_)
90{
91 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
92
93 struct S {
94 void *M1;
95 unsigned int M2;
96 unsigned int M3;
97 char closure[];
98 } *args = (struct S*) args_;
99
100 __cilkrts_cilk_for_32(args->M1, args->closure, args->M2, args->M3);
101}
102
103extern "C" void __intel_cilk_for_64_offload_wrapper(void *args_)
104{
105 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
106
107 struct S {
108 void *M1;
109 uint64_t M2;
110 uint64_t M3;
111 char closure[];
112 } *args = (struct S*) args_;
113
114 __cilkrts_cilk_for_64(args->M1, args->closure, args->M2, args->M3);
115}
116
117static void __offload_myo_once_init(void)
118{
119 CheckResult("myoiRemoteFuncRegister",
120 myoiRemoteFuncRegister(
121 (MyoiRemoteFuncType) __intel_cilk_for_32_offload_wrapper,
122 "__intel_cilk_for_32_offload"));
123 CheckResult("myoiRemoteFuncRegister",
124 myoiRemoteFuncRegister(
125 (MyoiRemoteFuncType) __intel_cilk_for_64_offload_wrapper,
126 "__intel_cilk_for_64_offload"));
127}
128
129extern "C" void __offload_myoRegisterTables(
130 SharedTableEntry *shared_table,
131 FptrTableEntry *fptr_table
132)
133{
134 OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__);
135
136 // one time registration of Intel(R) Cilk(TM) language entries
137 static pthread_once_t once_control = PTHREAD_ONCE_INIT;
138 pthread_once(&once_control, __offload_myo_once_init);
139
140 // register module's tables
141 if (shared_table->varName == 0 && fptr_table->funcName == 0) {
142 return;
143 }
144
145 __offload_myo_shared_table_register(shared_table);
146 __offload_myo_fptr_table_register(fptr_table);
147}
148
149extern "C" void* _Offload_shared_malloc(size_t size)
150{
151 OFFLOAD_DEBUG_TRACE(3, "%s(%lld)\n", __func__, size);
152 return myoSharedMalloc(size);
153}
154
155extern "C" void _Offload_shared_free(void *ptr)
156{
157 OFFLOAD_DEBUG_TRACE(3, "%s(%p)\n", __func__, ptr);
158 myoSharedFree(ptr);
159}
160
161extern "C" void* _Offload_shared_aligned_malloc(size_t size, size_t align)
162{
163 OFFLOAD_DEBUG_TRACE(3, "%s(%lld, %lld)\n", __func__, size, align);
164 return myoSharedAlignedMalloc(size, align);
165}
166
167extern "C" void _Offload_shared_aligned_free(void *ptr)
168{
169 OFFLOAD_DEBUG_TRACE(3, "%s(%p)\n", __func__, ptr);
170 myoSharedAlignedFree(ptr);
171}
172
173// temporary workaround for blocking behavior of myoiLibInit/Fini calls
174extern "C" void __offload_myoLibInit()
175{
176 OFFLOAD_DEBUG_TRACE(3, "%s()\n", __func__);
177 CheckResult("myoiLibInit", myoiLibInit(0, 0));
178}
179
180extern "C" void __offload_myoLibFini()
181{
182 OFFLOAD_DEBUG_TRACE(3, "%s()\n", __func__);
183 myoiLibFini();
184}