blob: 0a06204916674a5cb8d329bb65d2f235bc9a577a [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_trace.h"
12#include <stdio.h>
13#include <stdlib.h>
14#include <stdint.h>
15#include <sstream>
16#include "liboffload_error_codes.h"
17
18extern const char *prefix;
19
20#if !HOST_LIBRARY
21extern int mic_index;
22#endif
23
24// The debug routines
25
26static const char * offload_stage(std::stringstream &ss,
27 int offload_number,
28 const char *tag,
29 const char *text,
30 bool print_tag)
31{
32 ss << "[" << report_get_message_str(c_report_offload) << "]";
33#if HOST_LIBRARY
34 ss << " [" << prefix << "]";
35 if (print_tag) {
36 ss << " [" << report_get_message_str(c_report_tag);
37 ss << " " << offload_number << "]";
38 }
39 else {
40 ss << " ";
41 }
42 ss << " [" << tag << "]";
43 ss << " " << text;
44#else
45 ss << " [" << prefix << " " << mic_index << "]";
46 if (print_tag) {
47 ss << " [" << report_get_message_str(c_report_tag);
48 ss << " " << offload_number << "]";
49 }
50 ss << " [" << tag << "]";
51 ss << " " << text;
52#endif
53 return 0;
54}
55
56static const char * offload_signal(std::stringstream &ss,
57 int offload_number,
58 const char *tag,
59 const char *text)
60{
61 ss << "[" << report_get_message_str(c_report_offload) << "]";
62 ss << " [" << prefix << "]";
63 ss << " [" << report_get_message_str(c_report_tag);
64 ss << " " << offload_number << "]";
65 ss << " [" << tag << "]";
66 ss << " " << text;
67 return 0;
68}
69
70void offload_stage_print(int stage, int offload_number, ...)
71{
72 std::string buf;
73 std::stringstream ss;
74 char const *str1;
75 char const *str2;
76 va_list va_args;
77 va_start(va_args, offload_number);
78 va_arg(va_args, char*);
79
80 switch (stage) {
81 case c_offload_start:
82 str1 = report_get_message_str(c_report_state);
83 str2 = report_get_message_str(c_report_start);
84 offload_stage(ss, offload_number, str1, str2, true);
85 break;
86 case c_offload_init:
87 str1 = report_get_message_str(c_report_state);
88 str2 = report_get_message_str(c_report_init);
89 offload_stage(ss, offload_number, str1, str2, false);
90 ss << " " << report_get_message_str(c_report_logical_card);
91 ss << " " << va_arg(va_args, int);
92 ss << " = " << report_get_message_str(c_report_physical_card);
93 ss << " " << va_arg(va_args, int);
94 break;
95 case c_offload_register:
96 str1 = report_get_message_str(c_report_state);
97 str2 = report_get_message_str(c_report_register);
98 offload_stage(ss, offload_number, str1, str2, true);
99 break;
100 case c_offload_init_func:
101 str1 = report_get_message_str(c_report_state);
102 str2 = report_get_message_str(c_report_init_func);
103 offload_stage(ss, offload_number, str1, str2, true);
104 ss << ": " << va_arg(va_args, char*);
105 break;
106 case c_offload_create_buf_host:
107 str1 = report_get_message_str(c_report_state);
108 str2 = report_get_message_str(c_report_create_buf_host);
109 offload_stage(ss, offload_number, str1, str2, true);
110 ss << ": base=0x" << std::hex << va_arg(va_args, uint64_t);
111 ss << " length=" << std::dec << va_arg(va_args, uint64_t);
112 break;
113 case c_offload_create_buf_mic:
114 str1 = report_get_message_str(c_report_state);
115 str2 = report_get_message_str(c_report_create_buf_mic);
116 offload_stage(ss, offload_number, str1, str2, true);
117 ss << ": size=" << va_arg(va_args, uint64_t);
118 ss << " offset=" << va_arg(va_args, int);
119 if (va_arg(va_args,int))
120 ss << " (2M page)";
121 break;
122 case c_offload_send_pointer_data:
123 str1 = report_get_message_str(c_report_state);
124 str2 = report_get_message_str(c_report_send_pointer_data);
125 offload_stage(ss, offload_number, str1, str2, true);
126 break;
127 case c_offload_sent_pointer_data:
128 str1 = report_get_message_str(c_report_state);
129 str2 = report_get_message_str(c_report_sent_pointer_data);
130 offload_stage(ss, offload_number, str1, str2, true);
131 ss << " " << va_arg(va_args, uint64_t);
132 break;
133 case c_offload_gather_copyin_data:
134 str1 = report_get_message_str(c_report_state);
135 str2 = report_get_message_str(c_report_gather_copyin_data);
136 offload_stage(ss, offload_number, str1, str2, true);
137 break;
138 case c_offload_copyin_data:
139 str1 = report_get_message_str(c_report_state);
140 str2 = report_get_message_str(c_report_copyin_data);
141 offload_stage(ss, offload_number, str1, str2, true);
142 ss << " " << va_arg(va_args, uint64_t) << " ";
143 break;
144 case c_offload_compute:
145 str1 = report_get_message_str(c_report_state);
146 str2 = report_get_message_str(c_report_compute);
147 offload_stage(ss, offload_number, str1, str2, true);
148 break;
149 case c_offload_receive_pointer_data:
150 str1 = report_get_message_str(c_report_state);
151 str2 = report_get_message_str(c_report_receive_pointer_data);
152 offload_stage(ss, offload_number, str1, str2, true);
153 break;
154 case c_offload_received_pointer_data:
155 str1 = report_get_message_str(c_report_state);
156 str2 = report_get_message_str(c_report_received_pointer_data);
157 offload_stage(ss, offload_number, str1, str2, true);
158 ss << " " << va_arg(va_args, uint64_t);
159 break;
160 case c_offload_start_target_func:
161 str1 = report_get_message_str(c_report_state);
162 str2 = report_get_message_str(c_report_start_target_func);
163 offload_stage(ss, offload_number, str1, str2, true);
164 ss << ": " << va_arg(va_args, char*);
165 break;
166 case c_offload_var:
167 str1 = report_get_message_str(c_report_var);
168 offload_stage(ss, offload_number, str1, " ", true);
169 va_arg(va_args, int);
170 ss << va_arg(va_args, char*);
171 ss << " " << " " << va_arg(va_args, char*);
172 break;
173 case c_offload_scatter_copyin_data:
174 str1 = report_get_message_str(c_report_state);
175 str2 = report_get_message_str(c_report_scatter_copyin_data);
176 offload_stage(ss, offload_number, str1, str2, true);
177 break;
178 case c_offload_gather_copyout_data:
179 str1 = report_get_message_str(c_report_state);
180 str2 = report_get_message_str(c_report_gather_copyout_data);
181 offload_stage(ss, offload_number, str1, str2, true);
182 break;
183 case c_offload_scatter_copyout_data:
184 str1 = report_get_message_str(c_report_state);
185 str2 = report_get_message_str(c_report_scatter_copyout_data);
186 offload_stage(ss, offload_number, str1, str2, true);
187 break;
188 case c_offload_copyout_data:
189 str1 = report_get_message_str(c_report_state);
190 str2 = report_get_message_str(c_report_copyout_data);
191 offload_stage(ss, offload_number, str1, str2, true);
192 ss << " " << va_arg(va_args, uint64_t);
193 break;
194 case c_offload_signal:
195 {
196 uint64_t *signal;
197 str1 = report_get_message_str(c_report_state_signal);
198 str2 = report_get_message_str(c_report_signal);
199 offload_signal(ss, offload_number, str1, str2);
200 signal = va_arg(va_args, uint64_t*);
201 if (signal)
202 ss << " 0x" << std::hex << *signal;
203 else
204 ss << " none";
205 }
206 break;
207 case c_offload_wait:
208 {
209 int count;
210 uint64_t **signal;
211 str1 = report_get_message_str(c_report_state_signal);
212 str2 = report_get_message_str(c_report_wait);
213 offload_signal(ss, offload_number, str1, str2);
214 count = va_arg(va_args, int);
215 signal = va_arg(va_args, uint64_t**);
216 if (count) {
217 while (count) {
218 ss << " " << std::hex << signal[count-1];
219 count--;
220 }
221 }
222 else
223 ss << " none";
224 }
225 break;
226 case c_offload_unregister:
227 str1 = report_get_message_str(c_report_state);
228 str2 = report_get_message_str(c_report_unregister);
229 offload_stage(ss, offload_number, str1, str2, false);
230 break;
231 case c_offload_destroy:
232 str1 = report_get_message_str(c_report_state);
233 str2 = report_get_message_str(c_report_destroy);
234 offload_stage(ss, offload_number, str1, str2, true);
235 break;
236 case c_offload_myoinit:
237 str1 = report_get_message_str(c_report_state);
238 str2 = report_get_message_str(c_report_myoinit);
239 offload_stage(ss, offload_number, str1, str2, false);
240 break;
241 case c_offload_myoregister:
242 str1 = report_get_message_str(c_report_state);
243 str2 = report_get_message_str(c_report_myoregister);
244 offload_stage(ss, offload_number, str1, str2, false);
245 break;
246 case c_offload_myofini:
247 str1 = report_get_message_str(c_report_state);
248 str2 = report_get_message_str(c_report_myofini);
249 offload_stage(ss, offload_number, str1, str2, false);
250 break;
251 case c_offload_mic_myo_shared:
252 str1 = report_get_message_str(c_report_state);
253 str2 = report_get_message_str(c_report_mic_myo_shared);
254 offload_stage(ss, offload_number, str1, str2, false);
255 ss << " " << va_arg(va_args, char*);
256 break;
257 case c_offload_mic_myo_fptr:
258 str1 = report_get_message_str(c_report_state);
259 str2 = report_get_message_str(c_report_mic_myo_fptr);
260 offload_stage(ss, offload_number, str1, str2, false);
261 ss << " " << va_arg(va_args, char*);
262 break;
263 case c_offload_myosharedmalloc:
264 str1 = report_get_message_str(c_report_state);
265 str2 = report_get_message_str(c_report_myosharedmalloc);
266 offload_stage(ss, offload_number, str1, str2, false);
267 va_arg(va_args, char*);
268 ss << " " << va_arg(va_args, size_t);
269 break;
270 case c_offload_myosharedfree:
271 str1 = report_get_message_str(c_report_state);
272 str2 = report_get_message_str(c_report_myosharedfree);
273 offload_stage(ss, offload_number, str1, str2, false);
274 break;
275 case c_offload_myosharedalignedmalloc:
276 str1 = report_get_message_str(c_report_state);
277 str2 = report_get_message_str(c_report_myosharedalignedmalloc);
278 offload_stage(ss, offload_number, str1, str2, false);
279 va_arg(va_args, char*);
280 ss << " " << va_arg(va_args, size_t);
281 ss << " " << va_arg(va_args, size_t);
282 break;
283 case c_offload_myosharedalignedfree:
284 str1 = report_get_message_str(c_report_state);
285 str2 = report_get_message_str(c_report_myosharedalignedfree);
286 offload_stage(ss, offload_number, str1, str2, false);
287 break;
288 case c_offload_myoacquire:
289 str1 = report_get_message_str(c_report_state);
290 str2 = report_get_message_str(c_report_myoacquire);
291 offload_stage(ss, offload_number, str1, str2, false);
292 break;
293 case c_offload_myorelease:
294 str1 = report_get_message_str(c_report_state);
295 str2 = report_get_message_str(c_report_myorelease);
296 offload_stage(ss, offload_number, str1, str2, false);
297 break;
298 default:
299 LIBOFFLOAD_ERROR(c_report_unknown_trace_node);
300 abort();
301 }
302 ss << "\n";
303 buf = ss.str();
304 fprintf(stdout, buf.data());
305 fflush(stdout);
306
307 va_end(va_args);
308 return;
309}