2 * SPDX-License-Identifier: MIT
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>
8 * Babeltrace - Trace IR metadata object copy
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"
19 #include "common/assert.h"
21 #include "trace-ir-metadata-copy.h"
22 #include "trace-ir-metadata-field-class-copy.h"
26 enum debug_info_trace_ir_mapping_status
copy_trace_class_content(
27 struct trace_ir_maps
*ir_maps
,
28 const bt_trace_class
*in_trace_class
,
29 bt_trace_class
*out_trace_class
,
30 bt_logging_level log_level
, bt_self_component
*self_comp
)
32 enum debug_info_trace_ir_mapping_status status
;
33 uint64_t sc_number
, sc_idx
;
35 BT_COMP_LOGD("Copying content of trace class: in-tc-addr=%p, out-tc-addr=%p",
36 in_trace_class
, out_trace_class
);
39 * Safe to use the same value object because it's frozen at this
42 bt_trace_class_set_user_attributes(out_trace_class
,
43 bt_trace_class_borrow_user_attributes_const(in_trace_class
));
45 /* Use the same stream class ids as in the origin trace class. */
46 bt_trace_class_set_assigns_automatic_stream_class_id(out_trace_class
,
49 /* Copy stream classes contained in the trace class. */
50 sc_number
= bt_trace_class_get_stream_class_count(in_trace_class
);
51 for (sc_idx
= 0; sc_idx
< sc_number
; sc_idx
++) {
52 bt_stream_class
*out_stream_class
;
53 const bt_stream_class
*in_stream_class
=
54 bt_trace_class_borrow_stream_class_by_index_const(
55 in_trace_class
, sc_idx
);
57 out_stream_class
= trace_ir_mapping_borrow_mapped_stream_class(
58 ir_maps
, in_stream_class
);
59 if (!out_stream_class
) {
60 out_stream_class
= trace_ir_mapping_create_new_mapped_stream_class(
61 ir_maps
, in_stream_class
);
62 if (!out_stream_class
) {
63 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
69 BT_COMP_LOGD("Copied content of trace class: in-tc-addr=%p, out-tc-addr=%p",
70 in_trace_class
, out_trace_class
);
72 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
78 enum debug_info_trace_ir_mapping_status
copy_clock_class_content(
79 const bt_clock_class
*in_clock_class
,
80 bt_clock_class
*out_clock_class
, bt_logging_level log_level
,
81 bt_self_component
*self_comp
)
83 enum debug_info_trace_ir_mapping_status status
;
84 const char *clock_class_name
, *clock_class_description
;
89 BT_COMP_LOGD("Copying content of clock class: in-cc-addr=%p, out-cc-addr=%p",
90 in_clock_class
, out_clock_class
);
92 clock_class_name
= bt_clock_class_get_name(in_clock_class
);
94 if (clock_class_name
) {
95 enum bt_clock_class_set_name_status set_name_status
=
96 bt_clock_class_set_name(out_clock_class
, clock_class_name
);
97 if (set_name_status
!= BT_CLOCK_CLASS_SET_NAME_STATUS_OK
) {
98 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
99 "Error setting clock class' name: "
100 "cc-addr=%p, name=%s", out_clock_class
,
102 status
= (int) set_name_status
;
108 * Safe to use the same value object because it's frozen at this
111 bt_clock_class_set_user_attributes(out_clock_class
,
112 bt_clock_class_borrow_user_attributes_const(in_clock_class
));
114 clock_class_description
= bt_clock_class_get_description(in_clock_class
);
116 if (clock_class_description
) {
117 enum bt_clock_class_set_description_status set_desc_status
=
118 bt_clock_class_set_description(out_clock_class
, clock_class_description
);
119 if (set_desc_status
!= BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_OK
) {
120 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
121 "Error setting clock class' description: "
122 "cc-addr=%p, cc-desc=%s", out_clock_class
,
123 clock_class_description
);
124 status
= (int) set_desc_status
;
129 in_uuid
= bt_clock_class_get_uuid(in_clock_class
);
131 bt_clock_class_set_uuid(out_clock_class
, in_uuid
);
134 bt_clock_class_set_frequency(out_clock_class
,
135 bt_clock_class_get_frequency(in_clock_class
));
136 bt_clock_class_set_precision(out_clock_class
,
137 bt_clock_class_get_precision(in_clock_class
));
138 bt_clock_class_get_offset(in_clock_class
, &seconds
, &cycles
);
139 bt_clock_class_set_offset(out_clock_class
, seconds
, cycles
);
140 bt_clock_class_set_origin_is_unix_epoch(out_clock_class
,
141 bt_clock_class_origin_is_unix_epoch(in_clock_class
));
143 BT_COMP_LOGD("Copied content of clock class: in-cc-addr=%p, out-cc-addr=%p",
144 in_clock_class
, out_clock_class
);
146 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
152 bt_clock_class
*borrow_mapped_clock_class(
153 struct trace_ir_metadata_maps
*md_maps
,
154 const bt_clock_class
*in_clock_class
)
156 BT_ASSERT_DBG(md_maps
);
157 BT_ASSERT_DBG(in_clock_class
);
159 return g_hash_table_lookup(md_maps
->clock_class_map
,
160 (gpointer
) in_clock_class
);
164 bt_clock_class
*create_new_mapped_clock_class(bt_self_component
*self_comp
,
165 struct trace_ir_metadata_maps
*md_maps
,
166 const bt_clock_class
*in_clock_class
)
168 enum debug_info_trace_ir_mapping_status status
;
169 bt_clock_class
*out_clock_class
;
170 bt_logging_level log_level
= md_maps
->log_level
;
172 BT_COMP_LOGD("Creating new mapped clock class: in-cc-addr=%p",
176 BT_ASSERT(in_clock_class
);
178 BT_ASSERT(!borrow_mapped_clock_class(md_maps
, in_clock_class
));
180 out_clock_class
= bt_clock_class_create(self_comp
);
181 if (!out_clock_class
) {
182 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
183 "Cannot create clock class");
186 /* If not, create a new one and add it to the mapping. */
187 status
= copy_clock_class_content(in_clock_class
, out_clock_class
,
188 log_level
, self_comp
);
189 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
190 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
191 "Cannot copy clock class");
192 BT_CLOCK_CLASS_PUT_REF_AND_RESET(out_clock_class
);
196 g_hash_table_insert(md_maps
->clock_class_map
,
197 (gpointer
) in_clock_class
, out_clock_class
);
199 BT_COMP_LOGD("Created new mapped clock class: in-cc-addr=%p, out-cc-addr=%p",
200 in_clock_class
, out_clock_class
);
202 return out_clock_class
;
206 enum debug_info_trace_ir_mapping_status
copy_stream_class_content(
207 struct trace_ir_maps
*ir_maps
,
208 const bt_stream_class
*in_stream_class
,
209 bt_stream_class
*out_stream_class
)
211 enum debug_info_trace_ir_mapping_status status
;
212 struct trace_ir_metadata_maps
*md_maps
;
213 const bt_clock_class
*in_clock_class
;
214 bt_clock_class
*out_clock_class
;
215 const bt_field_class
*in_packet_context_fc
, *in_common_context_fc
;
216 bt_field_class
*out_packet_context_fc
, *out_common_context_fc
;
218 uint64_t ec_number
, ec_idx
;
219 bt_logging_level log_level
= ir_maps
->log_level
;
220 bt_self_component
*self_comp
= ir_maps
->self_comp
;
222 BT_COMP_LOGD("Copying content of stream class: in-sc-addr=%p, out-sc-addr=%p",
223 in_stream_class
, out_stream_class
);
225 md_maps
= borrow_metadata_maps_from_input_stream_class(ir_maps
, in_stream_class
);
226 in_clock_class
= bt_stream_class_borrow_default_clock_class_const(
229 if (in_clock_class
) {
230 enum bt_stream_class_set_default_clock_class_status set_def_cc_status
;
231 /* Copy the clock class. */
232 out_clock_class
= borrow_mapped_clock_class(md_maps
,
234 if (!out_clock_class
) {
235 out_clock_class
= create_new_mapped_clock_class(
236 ir_maps
->self_comp
, md_maps
, in_clock_class
);
237 if (!out_clock_class
) {
238 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
242 set_def_cc_status
= bt_stream_class_set_default_clock_class(
243 out_stream_class
, out_clock_class
);
244 if (set_def_cc_status
!= BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK
) {
245 status
= (int) set_def_cc_status
;
251 * Safe to use the same value object because it's frozen at this
254 bt_stream_class_set_user_attributes(out_stream_class
,
255 bt_stream_class_borrow_user_attributes_const(in_stream_class
));
257 bt_stream_class_set_supports_packets(
259 bt_stream_class_supports_packets(in_stream_class
),
260 bt_stream_class_packets_have_beginning_default_clock_snapshot(
262 bt_stream_class_packets_have_end_default_clock_snapshot(
264 bt_stream_class_set_supports_discarded_events(
266 bt_stream_class_supports_discarded_events(in_stream_class
),
267 bt_stream_class_discarded_events_have_default_clock_snapshots(
269 bt_stream_class_set_supports_discarded_packets(
271 bt_stream_class_supports_discarded_packets(in_stream_class
),
272 bt_stream_class_discarded_packets_have_default_clock_snapshots(
275 in_name
= bt_stream_class_get_name(in_stream_class
);
277 enum bt_stream_class_set_name_status set_name_status
=
278 bt_stream_class_set_name(out_stream_class
, in_name
);
279 if (set_name_status
!= BT_STREAM_CLASS_SET_NAME_STATUS_OK
) {
280 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
281 "Error set stream class name: "
282 "out-sc-addr=%p, name=%s", out_stream_class
,
284 status
= (int) set_name_status
;
289 bt_stream_class_set_assigns_automatic_stream_id(out_stream_class
,
291 bt_stream_class_set_assigns_automatic_event_class_id(out_stream_class
,
295 * Add the input packet context field class to the context to
296 * resolution in the further steps.
298 in_packet_context_fc
=
299 bt_stream_class_borrow_packet_context_field_class_const(
301 md_maps
->fc_resolving_ctx
->packet_context
=
302 in_packet_context_fc
;
304 if (in_packet_context_fc
) {
305 enum bt_stream_class_set_field_class_status set_fc_status
;
306 /* Copy packet context. */
307 out_packet_context_fc
= create_field_class_copy(md_maps
,
308 in_packet_context_fc
);
310 status
= copy_field_class_content(md_maps
, in_packet_context_fc
,
311 out_packet_context_fc
);
312 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
313 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
314 "Error copying stream class' packet context field class: "
315 "in-packet-ctx-fc-addr=%p, out-packet-ctx-fc-addr=%p",
316 in_packet_context_fc
, out_packet_context_fc
);
320 set_fc_status
= bt_stream_class_set_packet_context_field_class(
321 out_stream_class
, out_packet_context_fc
);
322 if (set_fc_status
!= BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK
) {
323 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
324 "Error setting stream class' packet context field class: "
325 "out-sc-addr=%p, out-packet-ctx-fc-addr=%p",
326 out_stream_class
, out_packet_context_fc
);
327 status
= (int) set_fc_status
;
333 * Add the input common context field class to the context to
334 * resolution in the further steps.
336 in_common_context_fc
=
337 bt_stream_class_borrow_event_common_context_field_class_const(
339 md_maps
->fc_resolving_ctx
->event_common_context
= in_common_context_fc
;
341 if (in_common_context_fc
) {
342 enum bt_stream_class_set_field_class_status set_fc_status
;
343 /* Copy common context. */
344 /* TODO: I find it a bit awkward to have this special function
345 * here to add the debug-info field class. I would like to
347 out_common_context_fc
= create_field_class_copy(md_maps
,
348 in_common_context_fc
);
349 status
= copy_event_common_context_field_class_content(md_maps
,
350 ir_maps
->debug_info_field_class_name
,
351 in_common_context_fc
, out_common_context_fc
);
352 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
353 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
354 "Error copying stream class' common context field class: "
355 "in-comm-ctx-fc-addr=%p, out-comm-ctx-fc-addr=%p",
356 in_common_context_fc
, out_common_context_fc
);
360 set_fc_status
= bt_stream_class_set_event_common_context_field_class(
361 out_stream_class
, out_common_context_fc
);
362 if (set_fc_status
!= BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK
) {
363 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
364 "Error setting stream class' common context field class: "
365 "out-sc-addr=%p, out-comm-ctx-fc-addr=%p",
366 out_stream_class
, out_common_context_fc
);
367 status
= (int) set_fc_status
;
372 /* Copy event classes contained in the stream class. */
373 ec_number
= bt_stream_class_get_event_class_count(in_stream_class
);
374 for (ec_idx
= 0; ec_idx
< ec_number
; ec_idx
++) {
375 bt_event_class
*out_event_class
;
376 const bt_event_class
*in_event_class
=
377 bt_stream_class_borrow_event_class_by_id_const(
378 in_stream_class
, ec_idx
);
379 out_event_class
= trace_ir_mapping_borrow_mapped_event_class(
380 ir_maps
, in_event_class
);
381 if (!out_event_class
) {
383 * We don't need the new event_class yet. We simply
384 * want to create it and keep it in the map.
386 out_event_class
= trace_ir_mapping_create_new_mapped_event_class(
387 ir_maps
, in_event_class
);
388 if (!out_event_class
) {
389 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
395 BT_COMP_LOGD("Copied content of stream class: in-sc-addr=%p, out-sc-addr=%p",
396 in_stream_class
, out_stream_class
);
398 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
404 enum debug_info_trace_ir_mapping_status
copy_event_class_content(
405 struct trace_ir_maps
*ir_maps
,
406 const bt_event_class
*in_event_class
,
407 bt_event_class
*out_event_class
)
409 enum debug_info_trace_ir_mapping_status status
;
410 struct trace_ir_metadata_maps
*md_maps
;
411 const char *in_event_class_name
, *in_emf_uri
;
412 bt_property_availability prop_avail
;
413 bt_event_class_log_level ec_log_level
;
414 bt_field_class
*out_specific_context_fc
, *out_payload_fc
;
415 const bt_field_class
*in_event_specific_context
, *in_event_payload
;
416 bt_logging_level log_level
= ir_maps
->log_level
;
417 bt_self_component
*self_comp
= ir_maps
->self_comp
;
419 BT_COMP_LOGD("Copying content of event class: in-ec-addr=%p, out-ec-addr=%p",
420 in_event_class
, out_event_class
);
422 /* Copy event class name. */
423 in_event_class_name
= bt_event_class_get_name(in_event_class
);
424 if (in_event_class_name
) {
425 enum bt_event_class_set_name_status set_name_status
=
426 bt_event_class_set_name(out_event_class
, in_event_class_name
);
427 if (set_name_status
!= BT_EVENT_CLASS_SET_NAME_STATUS_OK
) {
428 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Error setting event class' name: ec-addr=%p, "
429 "name=%s", out_event_class
, in_event_class_name
);
430 status
= (int) set_name_status
;
436 * Safe to use the same value object because it's frozen at this
439 bt_event_class_set_user_attributes(out_event_class
,
440 bt_event_class_borrow_user_attributes_const(in_event_class
));
442 /* Copy event class loglevel. */
443 prop_avail
= bt_event_class_get_log_level(in_event_class
,
445 if (prop_avail
== BT_PROPERTY_AVAILABILITY_AVAILABLE
) {
446 bt_event_class_set_log_level(out_event_class
, ec_log_level
);
449 /* Copy event class emf uri. */
450 in_emf_uri
= bt_event_class_get_emf_uri(in_event_class
);
452 enum bt_event_class_set_emf_uri_status set_emf_status
=
453 bt_event_class_set_emf_uri(out_event_class
, in_emf_uri
);
454 if (set_emf_status
!= BT_EVENT_CLASS_SET_EMF_URI_STATUS_OK
) {
455 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
456 "Error setting event class' emf uri: "
457 "out-ec-addr=%p, emf-uri=\"%s\"",
458 out_event_class
, in_emf_uri
);
459 status
= (int) set_emf_status
;
464 md_maps
= borrow_metadata_maps_from_input_event_class(ir_maps
,
467 * Add the input event class' specific ctx to te
470 in_event_specific_context
=
471 bt_event_class_borrow_specific_context_field_class_const(
474 md_maps
->fc_resolving_ctx
->event_specific_context
=
475 in_event_specific_context
;
477 if (in_event_specific_context
) {
478 enum bt_event_class_set_field_class_status set_fc_status
;
479 /* Copy the specific context of this event class. */
480 out_specific_context_fc
= create_field_class_copy(md_maps
,
481 in_event_specific_context
);
483 status
= copy_field_class_content(md_maps
,
484 in_event_specific_context
, out_specific_context_fc
);
485 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
486 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
487 "Error copying event class' specific context field class:"
488 "in-spec-ctx-fc-addr=%p, out-spec-ctx-fc-addr=%p",
489 in_event_specific_context
, out_specific_context_fc
);
493 * Add the output specific context to the output event
496 set_fc_status
= bt_event_class_set_specific_context_field_class(
497 out_event_class
, out_specific_context_fc
);
498 if (set_fc_status
!= BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK
) {
499 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
500 "Error setting event class' specific context field class:"
501 "out-ec-addr=%p, out-spec-ctx-fc-addr=%p",
502 out_event_class
, out_specific_context_fc
);
503 status
= (int) set_fc_status
;
509 * Add the input event class' payload field class to
512 in_event_payload
= bt_event_class_borrow_payload_field_class_const(
515 md_maps
->fc_resolving_ctx
->event_payload
= in_event_payload
;
517 if (in_event_payload
) {
518 enum bt_event_class_set_field_class_status set_fc_status
;
519 /* Copy the payload of this event class. */
520 out_payload_fc
= create_field_class_copy(md_maps
,
522 status
= copy_field_class_content(md_maps
, in_event_payload
,
524 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
525 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
526 "Error copying event class' specific context field class:"
527 "in-payload-fc-addr=%p, out-payload-fc-addr=%p",
528 in_event_payload
, out_payload_fc
);
532 /* Add the output payload to the output event class. */
533 set_fc_status
= bt_event_class_set_payload_field_class(
534 out_event_class
, out_payload_fc
);
535 if (set_fc_status
!= BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK
) {
536 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Error setting event class' payload field class: "
537 "out-ec-addr=%p, out-payload-fc-addr=%p",
538 out_event_class
, out_payload_fc
);
539 status
= (int) set_fc_status
;
544 BT_COMP_LOGD("Copied content of event class: in-ec-addr=%p, out-ec-addr=%p",
545 in_event_class
, out_event_class
);
547 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
553 enum debug_info_trace_ir_mapping_status
554 copy_event_common_context_field_class_content(
555 struct trace_ir_metadata_maps
*md_maps
,
556 const char *debug_info_fc_name
,
557 const bt_field_class
*in_field_class
,
558 bt_field_class
*out_field_class
)
560 enum debug_info_trace_ir_mapping_status status
;
561 bt_field_class
*debug_field_class
= NULL
, *bin_field_class
= NULL
,
562 *func_field_class
= NULL
, *src_field_class
= NULL
;
563 bt_logging_level log_level
= md_maps
->log_level
;
564 bt_self_component
*self_comp
= md_maps
->self_comp
;
566 BT_COMP_LOGD("Copying content of event common context field class: "
567 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
569 /* Copy the content of the input common context. */
570 status
= copy_field_class_content(md_maps
, in_field_class
, out_field_class
);
571 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
572 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
573 "Error copying content of event common context field class: "
574 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
,
580 * If this event common context has the necessary fields to compute the
581 * debug information append the debug-info field class to the event
584 if (is_event_common_ctx_dbg_info_compatible(in_field_class
, debug_info_fc_name
)) {
585 enum bt_field_class_structure_append_member_status append_member_status
;
587 * The struct field and 3 sub-fields are not stored in the
588 * field class map because they don't have input equivalent.
589 * We need to put our reference each of these field classes
590 * once they are added to their respective containing field
593 debug_field_class
= bt_field_class_structure_create(
594 md_maps
->output_trace_class
);
595 if (!debug_field_class
) {
596 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
597 "Failed to create debug_info structure.");
598 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
602 bin_field_class
= bt_field_class_string_create(
603 md_maps
->output_trace_class
);
604 if (!bin_field_class
) {
605 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
606 "Failed to create string for field=\"bin\".");
607 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
611 func_field_class
= bt_field_class_string_create(
612 md_maps
->output_trace_class
);
613 if (!func_field_class
) {
614 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
615 "Failed to create string for field=\"func\".");
616 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
620 src_field_class
= bt_field_class_string_create(
621 md_maps
->output_trace_class
);
622 if (!src_field_class
) {
623 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
624 "Failed to create string for field=\"src\".");
625 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
629 append_member_status
= bt_field_class_structure_append_member(
630 debug_field_class
, "bin", bin_field_class
);
631 if (append_member_status
!=
632 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
633 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
634 "Failed to add a field to debug_info struct: "
636 status
= (int) append_member_status
;
639 BT_FIELD_CLASS_PUT_REF_AND_RESET(bin_field_class
);
641 append_member_status
= bt_field_class_structure_append_member(
642 debug_field_class
, "func", func_field_class
);
643 if (append_member_status
!=
644 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
645 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
646 "Failed to add a field to debug_info struct: "
648 status
= (int) append_member_status
;
651 BT_FIELD_CLASS_PUT_REF_AND_RESET(func_field_class
);
653 append_member_status
= bt_field_class_structure_append_member(
654 debug_field_class
, "src", src_field_class
);
655 if (append_member_status
!=
656 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
657 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
658 "Failed to add a field to debug_info struct: "
660 status
= (int) append_member_status
;
663 BT_FIELD_CLASS_PUT_REF_AND_RESET(src_field_class
);
665 /*Add the filled debug-info field class to the common context. */
666 append_member_status
= bt_field_class_structure_append_member(
667 out_field_class
, debug_info_fc_name
, debug_field_class
);
668 if (append_member_status
!=
669 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
670 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
671 "Failed to add debug_info field to event common context.");
672 status
= (int) append_member_status
;
675 BT_FIELD_CLASS_PUT_REF_AND_RESET(debug_field_class
);
677 BT_COMP_LOGD("Copied content of event common context field class: "
678 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
680 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
684 if (debug_field_class
) {
685 bt_field_class_put_ref(debug_field_class
);
687 if (bin_field_class
) {
688 bt_field_class_put_ref(bin_field_class
);
690 if (func_field_class
) {
691 bt_field_class_put_ref(func_field_class
);
693 if (src_field_class
) {
694 bt_field_class_put_ref(src_field_class
);
701 bt_field_class
*create_field_class_copy(struct trace_ir_metadata_maps
*md_maps
,
702 const bt_field_class
*in_field_class
)
704 return create_field_class_copy_internal(md_maps
, in_field_class
);
708 enum debug_info_trace_ir_mapping_status
copy_field_class_content(
709 struct trace_ir_metadata_maps
*md_maps
,
710 const bt_field_class
*in_field_class
,
711 bt_field_class
*out_field_class
)
713 return copy_field_class_content_internal(md_maps
, in_field_class
,