cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / src / plugins / lttng-utils / debug-info / trace-ir-metadata-copy.c
1 /*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright (c) 2015 EfficiOS Inc. and Linux Foundation
5 * Copyright (c) 2018 Philippe Proulx <pproulx@efficios.com>
6 * Copyright (c) 2019 Francis Deslauriers <francis.deslauriers@efficios.com>
7 *
8 * Babeltrace - Trace IR metadata object copy
9 */
10
11 #define BT_COMP_LOG_SELF_COMP self_comp
12 #define BT_LOG_OUTPUT_LEVEL log_level
13 #define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-META-COPY"
14 #include "logging/comp-logging.h"
15
16 #include <inttypes.h>
17 #include <stdint.h>
18
19 #include "common/assert.h"
20
21 #include "trace-ir-metadata-copy.h"
22 #include "trace-ir-metadata-field-class-copy.h"
23 #include "utils.h"
24
25 enum debug_info_trace_ir_mapping_status copy_trace_class_content(
26 struct trace_ir_maps *ir_maps,
27 const bt_trace_class *in_trace_class,
28 bt_trace_class *out_trace_class,
29 bt_logging_level log_level, bt_self_component *self_comp)
30 {
31 enum debug_info_trace_ir_mapping_status status;
32 uint64_t sc_number, sc_idx;
33
34 BT_COMP_LOGD("Copying content of trace class: in-tc-addr=%p, out-tc-addr=%p",
35 in_trace_class, out_trace_class);
36
37 /*
38 * Safe to use the same value object because it's frozen at this
39 * point.
40 */
41 bt_trace_class_set_user_attributes(out_trace_class,
42 bt_trace_class_borrow_user_attributes_const(in_trace_class));
43
44 /* Use the same stream class ids as in the origin trace class. */
45 bt_trace_class_set_assigns_automatic_stream_class_id(out_trace_class,
46 BT_FALSE);
47
48 /* Copy stream classes contained in the trace class. */
49 sc_number = bt_trace_class_get_stream_class_count(in_trace_class);
50 for (sc_idx = 0; sc_idx < sc_number; sc_idx++) {
51 bt_stream_class *out_stream_class;
52 const bt_stream_class *in_stream_class =
53 bt_trace_class_borrow_stream_class_by_index_const(
54 in_trace_class, sc_idx);
55
56 out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(
57 ir_maps, in_stream_class);
58 if (!out_stream_class) {
59 out_stream_class = trace_ir_mapping_create_new_mapped_stream_class(
60 ir_maps, in_stream_class);
61 if (!out_stream_class) {
62 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
63 goto end;
64 }
65 }
66 }
67
68 BT_COMP_LOGD("Copied content of trace class: in-tc-addr=%p, out-tc-addr=%p",
69 in_trace_class, out_trace_class);
70
71 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
72 end:
73 return status;
74 }
75
76 static
77 enum debug_info_trace_ir_mapping_status copy_clock_class_content(
78 const bt_clock_class *in_clock_class,
79 bt_clock_class *out_clock_class, bt_logging_level log_level,
80 bt_self_component *self_comp)
81 {
82 enum debug_info_trace_ir_mapping_status status;
83 const char *clock_class_name, *clock_class_description;
84 int64_t seconds;
85 uint64_t cycles;
86 bt_uuid in_uuid;
87
88 BT_COMP_LOGD("Copying content of clock class: in-cc-addr=%p, out-cc-addr=%p",
89 in_clock_class, out_clock_class);
90
91 clock_class_name = bt_clock_class_get_name(in_clock_class);
92
93 if (clock_class_name) {
94 enum bt_clock_class_set_name_status set_name_status =
95 bt_clock_class_set_name(out_clock_class, clock_class_name);
96 if (set_name_status != BT_CLOCK_CLASS_SET_NAME_STATUS_OK) {
97 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
98 "Error setting clock class' name: "
99 "cc-addr=%p, name=%s", out_clock_class,
100 clock_class_name);
101 status = (int) set_name_status;
102 goto end;
103 }
104 }
105
106 /*
107 * Safe to use the same value object because it's frozen at this
108 * point.
109 */
110 bt_clock_class_set_user_attributes(out_clock_class,
111 bt_clock_class_borrow_user_attributes_const(in_clock_class));
112
113 clock_class_description = bt_clock_class_get_description(in_clock_class);
114
115 if (clock_class_description) {
116 enum bt_clock_class_set_description_status set_desc_status =
117 bt_clock_class_set_description(out_clock_class, clock_class_description);
118 if (set_desc_status!= BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_OK) {
119 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
120 "Error setting clock class' description: "
121 "cc-addr=%p, cc-desc=%s", out_clock_class,
122 clock_class_description);
123 status = (int) set_desc_status;
124 goto end;
125 }
126 }
127
128 in_uuid = bt_clock_class_get_uuid(in_clock_class);
129 if (in_uuid) {
130 bt_clock_class_set_uuid(out_clock_class, in_uuid);
131 }
132
133 bt_clock_class_set_frequency(out_clock_class,
134 bt_clock_class_get_frequency(in_clock_class));
135 bt_clock_class_set_precision(out_clock_class,
136 bt_clock_class_get_precision(in_clock_class));
137 bt_clock_class_get_offset(in_clock_class, &seconds, &cycles);
138 bt_clock_class_set_offset(out_clock_class, seconds, cycles);
139 bt_clock_class_set_origin_is_unix_epoch(out_clock_class,
140 bt_clock_class_origin_is_unix_epoch(in_clock_class));
141
142 BT_COMP_LOGD("Copied content of clock class: in-cc-addr=%p, out-cc-addr=%p",
143 in_clock_class, out_clock_class);
144
145 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
146 end:
147 return status;
148 }
149
150 static
151 bt_clock_class *borrow_mapped_clock_class(
152 struct trace_ir_metadata_maps *md_maps,
153 const bt_clock_class *in_clock_class)
154 {
155 BT_ASSERT_DBG(md_maps);
156 BT_ASSERT_DBG(in_clock_class);
157
158 return g_hash_table_lookup(md_maps->clock_class_map,
159 (gpointer) in_clock_class);
160 }
161
162 static
163 bt_clock_class *create_new_mapped_clock_class(bt_self_component *self_comp,
164 struct trace_ir_metadata_maps *md_maps,
165 const bt_clock_class *in_clock_class)
166 {
167 enum debug_info_trace_ir_mapping_status status;
168 bt_clock_class *out_clock_class;
169 bt_logging_level log_level = md_maps->log_level;
170
171 BT_COMP_LOGD("Creating new mapped clock class: in-cc-addr=%p",
172 in_clock_class);
173
174 BT_ASSERT(md_maps);
175 BT_ASSERT(in_clock_class);
176
177 BT_ASSERT(!borrow_mapped_clock_class(md_maps, in_clock_class));
178
179 out_clock_class = bt_clock_class_create(self_comp);
180 if (!out_clock_class) {
181 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
182 "Cannot create clock class");
183 goto end;
184 }
185 /* If not, create a new one and add it to the mapping. */
186 status = copy_clock_class_content(in_clock_class, out_clock_class,
187 log_level, self_comp);
188 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
189 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
190 "Cannot copy clock class");
191 BT_CLOCK_CLASS_PUT_REF_AND_RESET(out_clock_class);
192 goto end;
193 }
194
195 g_hash_table_insert(md_maps->clock_class_map,
196 (gpointer) in_clock_class, out_clock_class);
197
198 BT_COMP_LOGD("Created new mapped clock class: in-cc-addr=%p, out-cc-addr=%p",
199 in_clock_class, out_clock_class);
200 end:
201 return out_clock_class;
202 }
203
204 enum debug_info_trace_ir_mapping_status copy_stream_class_content(
205 struct trace_ir_maps *ir_maps,
206 const bt_stream_class *in_stream_class,
207 bt_stream_class *out_stream_class)
208 {
209 enum debug_info_trace_ir_mapping_status status;
210 struct trace_ir_metadata_maps *md_maps;
211 const bt_clock_class *in_clock_class;
212 bt_clock_class *out_clock_class;
213 const bt_field_class *in_packet_context_fc, *in_common_context_fc;
214 bt_field_class *out_packet_context_fc, *out_common_context_fc;
215 const char *in_name;
216 uint64_t ec_number, ec_idx;
217 bt_logging_level log_level = ir_maps->log_level;
218 bt_self_component *self_comp = ir_maps->self_comp;
219
220 BT_COMP_LOGD("Copying content of stream class: in-sc-addr=%p, out-sc-addr=%p",
221 in_stream_class, out_stream_class);
222
223 md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps, in_stream_class);
224 in_clock_class = bt_stream_class_borrow_default_clock_class_const(
225 in_stream_class);
226
227 if (in_clock_class) {
228 enum bt_stream_class_set_default_clock_class_status set_def_cc_status;
229 /* Copy the clock class. */
230 out_clock_class = borrow_mapped_clock_class(md_maps,
231 in_clock_class);
232 if (!out_clock_class) {
233 out_clock_class = create_new_mapped_clock_class(
234 ir_maps->self_comp, md_maps, in_clock_class);
235 if (!out_clock_class) {
236 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
237 goto end;
238 }
239 }
240 set_def_cc_status = bt_stream_class_set_default_clock_class(
241 out_stream_class, out_clock_class);
242 if (set_def_cc_status != BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK) {
243 status = (int) set_def_cc_status;
244 goto end;
245 }
246 }
247
248 /*
249 * Safe to use the same value object because it's frozen at this
250 * point.
251 */
252 bt_stream_class_set_user_attributes(out_stream_class,
253 bt_stream_class_borrow_user_attributes_const(in_stream_class));
254
255 bt_stream_class_set_supports_packets(
256 out_stream_class,
257 bt_stream_class_supports_packets(in_stream_class),
258 bt_stream_class_packets_have_beginning_default_clock_snapshot(
259 in_stream_class),
260 bt_stream_class_packets_have_end_default_clock_snapshot(
261 in_stream_class));
262 bt_stream_class_set_supports_discarded_events(
263 out_stream_class,
264 bt_stream_class_supports_discarded_events(in_stream_class),
265 bt_stream_class_discarded_events_have_default_clock_snapshots(
266 in_stream_class));
267 bt_stream_class_set_supports_discarded_packets(
268 out_stream_class,
269 bt_stream_class_supports_discarded_packets(in_stream_class),
270 bt_stream_class_discarded_packets_have_default_clock_snapshots(
271 in_stream_class));
272
273 in_name = bt_stream_class_get_name(in_stream_class);
274 if (in_name) {
275 enum bt_stream_class_set_name_status set_name_status =
276 bt_stream_class_set_name(out_stream_class, in_name);
277 if (set_name_status != BT_STREAM_CLASS_SET_NAME_STATUS_OK) {
278 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
279 "Error set stream class name: "
280 "out-sc-addr=%p, name=%s", out_stream_class,
281 in_name);
282 status = (int) set_name_status;
283 goto end;
284 }
285 }
286
287 bt_stream_class_set_assigns_automatic_stream_id(out_stream_class,
288 BT_FALSE);
289 bt_stream_class_set_assigns_automatic_event_class_id(out_stream_class,
290 BT_FALSE);
291
292 /*
293 * Add the input packet context field class to the context to
294 * resolution in the further steps.
295 */
296 in_packet_context_fc =
297 bt_stream_class_borrow_packet_context_field_class_const(
298 in_stream_class);
299 md_maps->fc_resolving_ctx->packet_context =
300 in_packet_context_fc;
301
302 if (in_packet_context_fc) {
303 enum bt_stream_class_set_field_class_status set_fc_status;
304 /* Copy packet context. */
305 out_packet_context_fc = create_field_class_copy(md_maps,
306 in_packet_context_fc);
307
308 status = copy_field_class_content(md_maps, in_packet_context_fc,
309 out_packet_context_fc);
310 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
311 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
312 "Error copying stream class' packet context field class: "
313 "in-packet-ctx-fc-addr=%p, out-packet-ctx-fc-addr=%p",
314 in_packet_context_fc, out_packet_context_fc);
315 goto end;
316 }
317
318 set_fc_status = bt_stream_class_set_packet_context_field_class(
319 out_stream_class, out_packet_context_fc);
320 if (set_fc_status != BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK) {
321 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
322 "Error setting stream class' packet context field class: "
323 "out-sc-addr=%p, out-packet-ctx-fc-addr=%p",
324 out_stream_class, out_packet_context_fc);
325 status = (int) set_fc_status;
326 goto end;
327 }
328 }
329
330 /*
331 * Add the input common context field class to the context to
332 * resolution in the further steps.
333 */
334 in_common_context_fc =
335 bt_stream_class_borrow_event_common_context_field_class_const(
336 in_stream_class);
337 md_maps->fc_resolving_ctx->event_common_context = in_common_context_fc;
338
339 if (in_common_context_fc) {
340 enum bt_stream_class_set_field_class_status set_fc_status;
341 /* Copy common context. */
342 /* TODO: I find it a bit awkward to have this special function
343 * here to add the debug-info field class. I would like to
344 * abstract that.*/
345 out_common_context_fc = create_field_class_copy(md_maps,
346 in_common_context_fc);
347 status = copy_event_common_context_field_class_content(md_maps,
348 ir_maps->debug_info_field_class_name,
349 in_common_context_fc, out_common_context_fc);
350 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
351 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
352 "Error copying stream class' common context field class: "
353 "in-comm-ctx-fc-addr=%p, out-comm-ctx-fc-addr=%p",
354 in_common_context_fc, out_common_context_fc);
355 goto end;
356 }
357
358 set_fc_status = bt_stream_class_set_event_common_context_field_class(
359 out_stream_class, out_common_context_fc);
360 if (set_fc_status != BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK) {
361 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
362 "Error setting stream class' common context field class: "
363 "out-sc-addr=%p, out-comm-ctx-fc-addr=%p",
364 out_stream_class, out_common_context_fc);
365 status = (int) set_fc_status;
366 goto end;
367 }
368 }
369
370 /* Copy event classes contained in the stream class. */
371 ec_number = bt_stream_class_get_event_class_count(in_stream_class);
372 for (ec_idx = 0; ec_idx < ec_number; ec_idx++) {
373 bt_event_class *out_event_class;
374 const bt_event_class *in_event_class =
375 bt_stream_class_borrow_event_class_by_id_const(
376 in_stream_class, ec_idx);
377 out_event_class = trace_ir_mapping_borrow_mapped_event_class(
378 ir_maps, in_event_class);
379 if (!out_event_class) {
380 /*
381 * We don't need the new event_class yet. We simply
382 * want to create it and keep it in the map.
383 */
384 out_event_class = trace_ir_mapping_create_new_mapped_event_class(
385 ir_maps, in_event_class);
386 if (!out_event_class) {
387 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
388 goto end;
389 }
390 }
391 }
392
393 BT_COMP_LOGD("Copied content of stream class: in-sc-addr=%p, out-sc-addr=%p",
394 in_stream_class, out_stream_class);
395
396 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
397 end:
398 return status;
399 }
400
401 enum debug_info_trace_ir_mapping_status copy_event_class_content(
402 struct trace_ir_maps *ir_maps,
403 const bt_event_class *in_event_class,
404 bt_event_class *out_event_class)
405 {
406 enum debug_info_trace_ir_mapping_status status;
407 struct trace_ir_metadata_maps *md_maps;
408 const char *in_event_class_name, *in_emf_uri;
409 bt_property_availability prop_avail;
410 bt_event_class_log_level ec_log_level;
411 bt_field_class *out_specific_context_fc, *out_payload_fc;
412 const bt_field_class *in_event_specific_context, *in_event_payload;
413 bt_logging_level log_level = ir_maps->log_level;
414 bt_self_component *self_comp = ir_maps->self_comp;
415
416 BT_COMP_LOGD("Copying content of event class: in-ec-addr=%p, out-ec-addr=%p",
417 in_event_class, out_event_class);
418
419 /* Copy event class name. */
420 in_event_class_name = bt_event_class_get_name(in_event_class);
421 if (in_event_class_name) {
422 enum bt_event_class_set_name_status set_name_status =
423 bt_event_class_set_name(out_event_class, in_event_class_name);
424 if (set_name_status != BT_EVENT_CLASS_SET_NAME_STATUS_OK) {
425 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error setting event class' name: ec-addr=%p, "
426 "name=%s", out_event_class, in_event_class_name);
427 status = (int) set_name_status;
428 goto end;
429 }
430 }
431
432 /*
433 * Safe to use the same value object because it's frozen at this
434 * point.
435 */
436 bt_event_class_set_user_attributes(out_event_class,
437 bt_event_class_borrow_user_attributes_const(in_event_class));
438
439 /* Copy event class loglevel. */
440 prop_avail = bt_event_class_get_log_level(in_event_class,
441 &ec_log_level);
442 if (prop_avail == BT_PROPERTY_AVAILABILITY_AVAILABLE) {
443 bt_event_class_set_log_level(out_event_class, ec_log_level);
444 }
445
446 /* Copy event class emf uri. */
447 in_emf_uri = bt_event_class_get_emf_uri(in_event_class);
448 if (in_emf_uri) {
449 enum bt_event_class_set_emf_uri_status set_emf_status =
450 bt_event_class_set_emf_uri(out_event_class, in_emf_uri);
451 if (set_emf_status != BT_EVENT_CLASS_SET_EMF_URI_STATUS_OK) {
452 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
453 "Error setting event class' emf uri: "
454 "out-ec-addr=%p, emf-uri=\"%s\"",
455 out_event_class, in_emf_uri);
456 status = (int) set_emf_status;
457 goto end;
458 }
459 }
460
461 md_maps = borrow_metadata_maps_from_input_event_class(ir_maps,
462 in_event_class);
463 /*
464 * Add the input event class' specific ctx to te
465 * context.
466 */
467 in_event_specific_context =
468 bt_event_class_borrow_specific_context_field_class_const(
469 in_event_class);
470
471 md_maps->fc_resolving_ctx->event_specific_context =
472 in_event_specific_context;
473
474 if (in_event_specific_context) {
475 enum bt_event_class_set_field_class_status set_fc_status;
476 /* Copy the specific context of this event class. */
477 out_specific_context_fc = create_field_class_copy(md_maps,
478 in_event_specific_context);
479
480 status = copy_field_class_content(md_maps,
481 in_event_specific_context, out_specific_context_fc);
482 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
483 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
484 "Error copying event class' specific context field class:"
485 "in-spec-ctx-fc-addr=%p, out-spec-ctx-fc-addr=%p",
486 in_event_specific_context, out_specific_context_fc);
487 goto end;
488 }
489 /*
490 * Add the output specific context to the output event
491 * class.
492 */
493 set_fc_status = bt_event_class_set_specific_context_field_class(
494 out_event_class, out_specific_context_fc);
495 if (set_fc_status != BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK) {
496 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
497 "Error setting event class' specific context field class:"
498 "out-ec-addr=%p, out-spec-ctx-fc-addr=%p",
499 out_event_class, out_specific_context_fc);
500 status = (int) set_fc_status;
501 goto end;
502 }
503 }
504
505 /*
506 * Add the input event class' payload field class to
507 * the context.
508 */
509 in_event_payload = bt_event_class_borrow_payload_field_class_const(
510 in_event_class);
511
512 md_maps->fc_resolving_ctx->event_payload = in_event_payload;
513
514 if (in_event_payload) {
515 enum bt_event_class_set_field_class_status set_fc_status;
516 /* Copy the payload of this event class. */
517 out_payload_fc = create_field_class_copy(md_maps,
518 in_event_payload);
519 status = copy_field_class_content(md_maps, in_event_payload,
520 out_payload_fc);
521 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
522 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
523 "Error copying event class' specific context field class:"
524 "in-payload-fc-addr=%p, out-payload-fc-addr=%p",
525 in_event_payload, out_payload_fc);
526 goto end;
527 }
528
529 /* Add the output payload to the output event class. */
530 set_fc_status = bt_event_class_set_payload_field_class(
531 out_event_class, out_payload_fc);
532 if (set_fc_status != BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK) {
533 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error setting event class' payload field class: "
534 "out-ec-addr=%p, out-payload-fc-addr=%p",
535 out_event_class, out_payload_fc);
536 status = (int) set_fc_status;
537 goto end;
538 }
539 }
540
541 BT_COMP_LOGD("Copied content of event class: in-ec-addr=%p, out-ec-addr=%p",
542 in_event_class, out_event_class);
543
544 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
545 end:
546 return status;
547 }
548
549 enum debug_info_trace_ir_mapping_status
550 copy_event_common_context_field_class_content(
551 struct trace_ir_metadata_maps *md_maps,
552 const char *debug_info_fc_name,
553 const bt_field_class *in_field_class,
554 bt_field_class *out_field_class)
555 {
556 enum debug_info_trace_ir_mapping_status status;
557 bt_field_class *debug_field_class = NULL, *bin_field_class = NULL,
558 *func_field_class = NULL, *src_field_class = NULL;
559 bt_logging_level log_level = md_maps->log_level;
560 bt_self_component *self_comp = md_maps->self_comp;
561
562 BT_COMP_LOGD("Copying content of event common context field class: "
563 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
564
565 /* Copy the content of the input common context. */
566 status = copy_field_class_content(md_maps, in_field_class, out_field_class);
567 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
568 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
569 "Error copying content of event common context field class: "
570 "in-fc-addr=%p, out-fc-addr=%p", in_field_class,
571 out_field_class);
572 goto error;
573 }
574
575 /*
576 * If this event common context has the necessary fields to compute the
577 * debug information append the debug-info field class to the event
578 * common context.
579 */
580 if (is_event_common_ctx_dbg_info_compatible(in_field_class, debug_info_fc_name)) {
581 enum bt_field_class_structure_append_member_status append_member_status;
582 /*
583 * The struct field and 3 sub-fields are not stored in the
584 * field class map because they don't have input equivalent.
585 * We need to put our reference each of these field classes
586 * once they are added to their respective containing field
587 * classes.
588 */
589 debug_field_class = bt_field_class_structure_create(
590 md_maps->output_trace_class);
591 if (!debug_field_class) {
592 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
593 "Failed to create debug_info structure.");
594 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
595 goto error;
596 }
597
598 bin_field_class = bt_field_class_string_create(
599 md_maps->output_trace_class);
600 if (!bin_field_class) {
601 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
602 "Failed to create string for field=\"bin\".");
603 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
604 goto error;
605 }
606
607 func_field_class = bt_field_class_string_create(
608 md_maps->output_trace_class);
609 if (!func_field_class) {
610 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
611 "Failed to create string for field=\"func\".");
612 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
613 goto error;
614 }
615
616 src_field_class = bt_field_class_string_create(
617 md_maps->output_trace_class);
618 if (!src_field_class) {
619 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
620 "Failed to create string for field=\"src\".");
621 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
622 goto error;
623 }
624
625 append_member_status = bt_field_class_structure_append_member(
626 debug_field_class, "bin", bin_field_class);
627 if (append_member_status !=
628 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
629 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
630 "Failed to add a field to debug_info struct: "
631 "field=\"bin\".");
632 status = (int) append_member_status;
633 goto error;
634 }
635 BT_FIELD_CLASS_PUT_REF_AND_RESET(bin_field_class);
636
637 append_member_status = bt_field_class_structure_append_member(
638 debug_field_class, "func", func_field_class);
639 if (append_member_status !=
640 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
641 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
642 "Failed to add a field to debug_info struct: "
643 "field=\"func\".");
644 status = (int) append_member_status;
645 goto error;
646 }
647 BT_FIELD_CLASS_PUT_REF_AND_RESET(func_field_class);
648
649 append_member_status = bt_field_class_structure_append_member(
650 debug_field_class, "src", src_field_class);
651 if (append_member_status !=
652 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
653 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
654 "Failed to add a field to debug_info struct: "
655 "field=\"src\".");
656 status = (int) append_member_status;
657 goto error;
658 }
659 BT_FIELD_CLASS_PUT_REF_AND_RESET(src_field_class);
660
661 /*Add the filled debug-info field class to the common context. */
662 append_member_status = bt_field_class_structure_append_member(
663 out_field_class, debug_info_fc_name, debug_field_class);
664 if (append_member_status !=
665 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
666 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
667 "Failed to add debug_info field to event common context.");
668 status = (int) append_member_status;
669 goto error;
670 }
671 BT_FIELD_CLASS_PUT_REF_AND_RESET(debug_field_class);
672 }
673 BT_COMP_LOGD("Copied content of event common context field class: "
674 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
675
676 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
677 goto end;
678
679 error:
680 if (debug_field_class) {
681 bt_field_class_put_ref(debug_field_class);
682 }
683 if (bin_field_class) {
684 bt_field_class_put_ref(bin_field_class);
685 }
686 if (func_field_class) {
687 bt_field_class_put_ref(func_field_class);
688 }
689 if (src_field_class) {
690 bt_field_class_put_ref(src_field_class);
691 }
692 end:
693 return status;
694 }
695
696 bt_field_class *create_field_class_copy(struct trace_ir_metadata_maps *md_maps,
697 const bt_field_class *in_field_class)
698 {
699 return create_field_class_copy_internal(md_maps, in_field_class);
700 }
701
702 enum debug_info_trace_ir_mapping_status copy_field_class_content(
703 struct trace_ir_metadata_maps *md_maps,
704 const bt_field_class *in_field_class,
705 bt_field_class *out_field_class)
706 {
707 return copy_field_class_content_internal(md_maps, in_field_class,
708 out_field_class);
709 }
This page took 0.042666 seconds and 5 git commands to generate.