2 * SPDX-License-Identifier: MIT
4 * Copyright (c) 2015-2019 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 field copy
11 #define BT_COMP_LOG_SELF_COMP (md_maps->self_comp)
12 #define BT_LOG_OUTPUT_LEVEL (md_maps->log_level)
13 #define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-META-FC-COPY"
14 #include "logging/comp-logging.h"
16 #include "common/assert.h"
17 #include "common/common.h"
18 #include "compat/compiler.h"
19 #include <babeltrace2/babeltrace.h>
21 #include "trace-ir-metadata-copy.h"
22 #include "trace-ir-metadata-field-class-copy.h"
25 * This fonction walks througth the nested structures field class to resolve a
26 * field path object. A field path is made of indexes inside possibly nested
27 * structures ultimately leading to a field class.
30 const bt_field_class
*walk_field_path(struct trace_ir_metadata_maps
*md_maps
,
31 const bt_field_path
*fp
, const bt_field_class
*fc
)
33 uint64_t i
, fp_item_count
;
34 const bt_field_class
*curr_fc
;
36 BT_ASSERT(bt_field_class_get_type(fc
) == BT_FIELD_CLASS_TYPE_STRUCTURE
);
37 BT_COMP_LOGD("Walking field path on field class: fp-addr=%p, fc-addr=%p",
40 fp_item_count
= bt_field_path_get_item_count(fp
);
42 for (i
= 0; i
< fp_item_count
; i
++) {
43 bt_field_class_type fc_type
= bt_field_class_get_type(curr_fc
);
44 const bt_field_path_item
*fp_item
=
45 bt_field_path_borrow_item_by_index_const(fp
, i
);
47 if (fc_type
== BT_FIELD_CLASS_TYPE_STRUCTURE
) {
48 const bt_field_class_structure_member
*member
;
50 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
51 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
52 member
= bt_field_class_structure_borrow_member_by_index_const(
54 bt_field_path_item_index_get_index(fp_item
));
55 curr_fc
= bt_field_class_structure_member_borrow_field_class_const(
57 } else if (bt_field_class_type_is(fc_type
, BT_FIELD_CLASS_TYPE_OPTION
)) {
58 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
59 BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT
);
60 curr_fc
= bt_field_class_option_borrow_field_class_const(
63 } else if (bt_field_class_type_is(fc_type
, BT_FIELD_CLASS_TYPE_VARIANT
)) {
64 const bt_field_class_variant_option
*option
;
66 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
67 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
68 option
= bt_field_class_variant_borrow_option_by_index_const(
70 bt_field_path_item_index_get_index(fp_item
));
71 curr_fc
= bt_field_class_variant_option_borrow_field_class_const(
74 } else if (bt_field_class_type_is(fc_type
, BT_FIELD_CLASS_TYPE_ARRAY
)) {
75 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
76 BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT
);
77 curr_fc
= bt_field_class_array_borrow_element_field_class_const(
89 const bt_field_class
*resolve_field_path_to_field_class(const bt_field_path
*fp
,
90 struct trace_ir_metadata_maps
*md_maps
)
92 struct field_class_resolving_context
*fc_resolving_ctx
;
93 const bt_field_class
*fc
;
94 bt_field_path_scope fp_scope
;
96 BT_COMP_LOGD("Resolving field path: fp-addr=%p", fp
);
98 fc_resolving_ctx
= md_maps
->fc_resolving_ctx
;
99 fp_scope
= bt_field_path_get_root_scope(fp
);
102 case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT
:
103 fc
= walk_field_path(md_maps
, fp
,
104 fc_resolving_ctx
->packet_context
);
106 case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT
:
107 fc
= walk_field_path(md_maps
, fp
,
108 fc_resolving_ctx
->event_common_context
);
110 case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT
:
111 fc
= walk_field_path(md_maps
, fp
,
112 fc_resolving_ctx
->event_specific_context
);
114 case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD
:
115 fc
= walk_field_path(md_maps
, fp
,
116 fc_resolving_ctx
->event_payload
);
126 void field_class_integer_set_props(const bt_field_class
*input_fc
,
127 bt_field_class
*output_fc
)
129 bt_field_class_integer_set_preferred_display_base(output_fc
,
130 bt_field_class_integer_get_preferred_display_base(input_fc
));
131 bt_field_class_integer_set_field_value_range(output_fc
,
132 bt_field_class_integer_get_field_value_range(input_fc
));
136 enum debug_info_trace_ir_mapping_status
field_class_bool_copy(
137 struct trace_ir_metadata_maps
*md_maps
,
138 const bt_field_class
*in_field_class
,
139 bt_field_class
*out_field_class
)
141 BT_COMP_LOGD("Copying content of boolean field class: "
142 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
144 * There is no content to copy. Keep this function call anyway for
147 BT_COMP_LOGD("Copied content of boolean field class: "
148 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
149 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
153 enum debug_info_trace_ir_mapping_status
field_class_bit_array_copy(
154 struct trace_ir_metadata_maps
*md_maps
,
155 const bt_field_class
*in_field_class
,
156 bt_field_class
*out_field_class
)
158 BT_COMP_LOGD("Copying content of bit array field class: "
159 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
161 * There is no content to copy. Keep this function call anyway for
164 BT_COMP_LOGD("Copied content of bit array field class: "
165 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
166 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
170 enum debug_info_trace_ir_mapping_status
field_class_unsigned_integer_copy(
171 struct trace_ir_metadata_maps
*md_maps
,
172 const bt_field_class
*in_field_class
,
173 bt_field_class
*out_field_class
)
175 BT_COMP_LOGD("Copying content of unsigned integer field class: "
176 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
178 field_class_integer_set_props(in_field_class
, out_field_class
);
180 BT_COMP_LOGD("Copied content of unsigned integer field class: "
181 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
182 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
186 enum debug_info_trace_ir_mapping_status
field_class_signed_integer_copy(
187 struct trace_ir_metadata_maps
*md_maps
,
188 const bt_field_class
*in_field_class
,
189 bt_field_class
*out_field_class
)
191 BT_COMP_LOGD("Copying content of signed integer field class: "
192 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
194 field_class_integer_set_props(in_field_class
, out_field_class
);
196 BT_COMP_LOGD("Copied content of signed integer field class: "
197 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
198 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
202 enum debug_info_trace_ir_mapping_status
field_class_unsigned_enumeration_copy(
203 struct trace_ir_metadata_maps
*md_maps
,
204 const bt_field_class
*in_field_class
,
205 bt_field_class
*out_field_class
)
207 enum debug_info_trace_ir_mapping_status status
;
208 uint64_t i
, enum_mapping_count
;
210 BT_COMP_LOGD("Copying content of unsigned enumeration field class: "
211 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
213 /* Copy properties of the inner integer. */
214 field_class_integer_set_props(in_field_class
, out_field_class
);
216 /* Copy all enumeration entries. */
217 enum_mapping_count
= bt_field_class_enumeration_get_mapping_count(
219 for (i
= 0; i
< enum_mapping_count
; i
++) {
221 const bt_integer_range_set_unsigned
*range_set
;
222 const bt_field_class_enumeration_unsigned_mapping
*u_mapping
;
223 const bt_field_class_enumeration_mapping
*mapping
;
224 enum bt_field_class_enumeration_add_mapping_status add_mapping_status
;
226 u_mapping
= bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
228 mapping
= bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
230 label
= bt_field_class_enumeration_mapping_get_label(mapping
);
231 range_set
= bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
233 add_mapping_status
= bt_field_class_enumeration_unsigned_add_mapping(
234 out_field_class
, label
, range_set
);
235 if (add_mapping_status
!= BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK
) {
236 status
= (int) add_mapping_status
;
241 BT_COMP_LOGD("Copied content of unsigned enumeration field class: "
242 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
244 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
250 enum debug_info_trace_ir_mapping_status
field_class_signed_enumeration_copy(
251 struct trace_ir_metadata_maps
*md_maps
,
252 const bt_field_class
*in_field_class
,
253 bt_field_class
*out_field_class
)
255 enum debug_info_trace_ir_mapping_status status
;
256 uint64_t i
, enum_mapping_count
;
258 BT_COMP_LOGD("Copying content of signed enumeration field class: "
259 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
261 /* Copy properties of the inner integer. */
262 field_class_integer_set_props(in_field_class
, out_field_class
);
264 /* Copy all enumeration entries. */
266 bt_field_class_enumeration_get_mapping_count(in_field_class
);
267 for (i
= 0; i
< enum_mapping_count
; i
++) {
269 const bt_integer_range_set_signed
*range_set
;
270 const bt_field_class_enumeration_signed_mapping
*s_mapping
;
271 const bt_field_class_enumeration_mapping
*mapping
;
272 enum bt_field_class_enumeration_add_mapping_status add_mapping_status
;
274 s_mapping
= bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
276 mapping
= bt_field_class_enumeration_signed_mapping_as_mapping_const(
278 label
= bt_field_class_enumeration_mapping_get_label(mapping
);
279 range_set
= bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
281 add_mapping_status
= bt_field_class_enumeration_signed_add_mapping(
282 out_field_class
, label
, range_set
);
283 if (add_mapping_status
!= BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK
) {
284 status
= (int) add_mapping_status
;
289 BT_COMP_LOGD("Copied content of signed enumeration field class: "
290 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
292 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
298 enum debug_info_trace_ir_mapping_status
field_class_single_precision_real_copy(
299 struct trace_ir_metadata_maps
*md_maps
,
300 const bt_field_class
*in_field_class
,
301 bt_field_class
*out_field_class
)
303 BT_COMP_LOGD("Copying content of single-precision real field class: "
304 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
306 BT_COMP_LOGD("Copied content single-precision real field class:"
307 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
309 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
313 enum debug_info_trace_ir_mapping_status
field_class_double_precision_real_copy(
314 struct trace_ir_metadata_maps
*md_maps
,
315 const bt_field_class
*in_field_class
,
316 bt_field_class
*out_field_class
)
318 BT_COMP_LOGD("Copying content of double-precision real field class: "
319 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
321 BT_COMP_LOGD("Copied content double-precision real field class:"
322 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
324 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
328 enum debug_info_trace_ir_mapping_status
field_class_structure_copy(
329 struct trace_ir_metadata_maps
*md_maps
,
330 const bt_field_class
*in_field_class
,
331 bt_field_class
*out_field_class
)
333 bt_self_component
*self_comp
= md_maps
->self_comp
;
334 uint64_t i
, struct_member_count
;
335 enum debug_info_trace_ir_mapping_status status
;
337 BT_COMP_LOGD("Copying content of structure field class: "
338 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
339 /* Get the number of member in that struct. */
340 struct_member_count
=
341 bt_field_class_structure_get_member_count(in_field_class
);
343 /* Iterate over all the members of the struct. */
344 for (i
= 0; i
< struct_member_count
; i
++) {
345 enum bt_field_class_structure_append_member_status append_member_status
;
346 const bt_field_class_structure_member
*in_member
;
347 bt_field_class_structure_member
*out_member
;
348 const char *member_name
;
349 const bt_field_class
*in_member_fc
;
350 bt_field_class
*out_member_fc
;
352 in_member
= bt_field_class_structure_borrow_member_by_index_const(
354 in_member_fc
= bt_field_class_structure_member_borrow_field_class_const(
356 member_name
= bt_field_class_structure_member_get_name(in_member
);
357 BT_COMP_LOGD("Copying structure field class's member: "
358 "index=%" PRId64
", member-fc-addr=%p, member-name=\"%s\"",
359 i
, in_member_fc
, member_name
);
361 out_member_fc
= create_field_class_copy(md_maps
, in_member_fc
);
362 if (!out_member_fc
) {
363 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot copy structure field class's member: "
364 "index=%" PRId64
", in-member-fc-addr=%p, "
365 "member-name=\"%s\"", i
, in_member_fc
,
367 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
371 status
= copy_field_class_content(md_maps
, in_member_fc
,
373 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
374 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot copy content of structure field class's member: "
375 "index=%" PRId64
", in-member-fc-addr=%p, "
376 "member-name=\"%s\"", i
, in_member_fc
,
378 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc
);
382 append_member_status
= bt_field_class_structure_append_member(out_field_class
,
383 member_name
, out_member_fc
);
384 if (append_member_status
!=
385 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
386 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot append structure field class's field: "
387 "index=%" PRId64
", field-fc-addr=%p, "
388 "field-name=\"%s\"", i
, in_member_fc
,
390 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc
);
391 status
= (int) append_member_status
;
395 out_member
= bt_field_class_structure_borrow_member_by_index(
397 BT_ASSERT(out_member
);
400 * Safe to use the same value object because it's frozen
403 bt_field_class_structure_member_set_user_attributes(
405 bt_field_class_structure_member_borrow_user_attributes_const(
409 BT_COMP_LOGD("Copied structure field class: original-fc-addr=%p, copy-fc-addr=%p",
410 in_field_class
, out_field_class
);
412 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
418 enum debug_info_trace_ir_mapping_status
field_class_variant_copy(
419 struct trace_ir_metadata_maps
*md_maps
,
420 const bt_field_class
*in_field_class
,
421 bt_field_class
*out_field_class
)
423 bt_self_component
*self_comp
= md_maps
->self_comp
;
424 enum debug_info_trace_ir_mapping_status status
;
425 bt_field_class
*out_tag_field_class
= NULL
;
426 uint64_t i
, variant_option_count
;
427 bt_field_class_type fc_type
= bt_field_class_get_type(in_field_class
);
429 BT_COMP_LOGD("Copying content of variant field class: "
430 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
431 variant_option_count
=
432 bt_field_class_variant_get_option_count(in_field_class
);
433 for (i
= 0; i
< variant_option_count
; i
++) {
434 const bt_field_class
*in_option_fc
;
435 const char *option_name
;
436 bt_field_class
*out_option_fc
;
437 const bt_field_class_variant_option
*in_option
;
438 bt_field_class_variant_option
*out_option
;
440 in_option
= bt_field_class_variant_borrow_option_by_index_const(
442 in_option_fc
= bt_field_class_variant_option_borrow_field_class_const(
444 option_name
= bt_field_class_variant_option_get_name(in_option
);
446 out_option_fc
= create_field_class_copy_internal(
447 md_maps
, in_option_fc
);
448 if (!out_option_fc
) {
449 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot copy variant option field class: "
450 "in-option-fc=%p, in-option-name=\"%s\"",
451 in_option_fc
, option_name
);
452 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
;
456 status
= copy_field_class_content_internal(md_maps
, in_option_fc
,
458 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
459 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Error copying content of variant option field class: "
460 "in-option-fc=%p, in-option-name=\"%s\"",
461 in_option_fc
, option_name
);
462 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_option_fc
);
466 if (fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD
) {
467 const bt_field_class_variant_with_selector_field_integer_unsigned_option
*spec_opt
=
468 bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const(
470 const bt_integer_range_set_unsigned
*ranges
=
471 bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const(
473 enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status
=
474 bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
475 out_field_class
, option_name
,
476 out_option_fc
, ranges
);
478 if (append_opt_status
!=
479 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK
) {
480 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot append option to variant field class with unsigned integer selector"
481 "out-fc-addr=%p, out-option-fc-addr=%p, "
482 "out-option-name=\"%s\"", out_field_class
,
483 out_option_fc
, option_name
);
484 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
485 status
= (int) append_opt_status
;
488 } else if (fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD
) {
489 const bt_field_class_variant_with_selector_field_integer_signed_option
*spec_opt
=
490 bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const(
492 const bt_integer_range_set_signed
*ranges
=
493 bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const(
496 enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status
=
497 bt_field_class_variant_with_selector_field_integer_signed_append_option(
498 out_field_class
, option_name
,
499 out_option_fc
, ranges
);
500 if (append_opt_status
!=
501 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK
) {
502 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot append option to variant field class with signed integer selector"
503 "out-fc-addr=%p, out-option-fc-addr=%p, "
504 "out-option-name=\"%s\"", out_field_class
,
505 out_option_fc
, option_name
);
506 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
507 status
= (int) append_opt_status
;
511 BT_ASSERT(fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD
);
513 enum bt_field_class_variant_without_selector_append_option_status append_opt_status
=
514 bt_field_class_variant_without_selector_append_option(
515 out_field_class
, option_name
,
517 if (append_opt_status
!=
518 BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK
) {
519 BT_COMP_LOGE_APPEND_CAUSE(self_comp
, "Cannot append option to variant field class"
520 "out-fc-addr=%p, out-option-fc-addr=%p, "
521 "out-option-name=\"%s\"", out_field_class
,
522 out_option_fc
, option_name
);
523 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
524 status
= (int) append_opt_status
;
529 out_option
= bt_field_class_variant_borrow_option_by_index(
531 BT_ASSERT(out_option
);
534 * Safe to use the same value object because it's frozen
537 bt_field_class_variant_option_set_user_attributes(
539 bt_field_class_variant_option_borrow_user_attributes_const(
543 BT_COMP_LOGD("Copied content of variant field class: in-fc-addr=%p, "
544 "out-fc-addr=%p", in_field_class
, out_field_class
);
545 status
= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
551 enum debug_info_trace_ir_mapping_status
field_class_static_array_copy(
552 struct trace_ir_metadata_maps
*md_maps
,
553 const bt_field_class
*in_field_class
,
554 bt_field_class
*out_field_class
)
556 BT_COMP_LOGD("Copying content of static array field class: in-fc-addr=%p, "
557 "out-fc-addr=%p", in_field_class
, out_field_class
);
559 * There is no content to copy. Keep this function call anyway for
562 BT_COMP_LOGD("Copied content of static array field class: in-fc-addr=%p, "
563 "out-fc-addr=%p", in_field_class
, out_field_class
);
565 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
569 enum debug_info_trace_ir_mapping_status
field_class_dynamic_array_copy(
570 struct trace_ir_metadata_maps
*md_maps
,
571 const bt_field_class
*in_field_class
,
572 bt_field_class
*out_field_class
)
574 BT_COMP_LOGD("Copying content of dynamic array field class: "
575 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
577 * There is no content to copy. Keep this function call anyway for
580 BT_COMP_LOGD("Copied content of dynamic array field class: "
581 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
583 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
587 enum debug_info_trace_ir_mapping_status
field_class_option_copy(
588 struct trace_ir_metadata_maps
*md_maps
,
589 const bt_field_class
*in_field_class
,
590 bt_field_class
*out_field_class
)
592 BT_COMP_LOGD("Copying content of option field class: "
593 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
595 if (bt_field_class_get_type(out_field_class
) ==
596 BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD
) {
597 bt_field_class_option_with_selector_field_bool_set_selector_is_reversed(
599 bt_field_class_option_with_selector_field_bool_selector_is_reversed(
603 BT_COMP_LOGD("Copied content of option field class: "
604 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
606 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
610 enum debug_info_trace_ir_mapping_status
field_class_string_copy(
611 struct trace_ir_metadata_maps
*md_maps
,
612 const bt_field_class
*in_field_class
,
613 bt_field_class
*out_field_class
)
615 BT_COMP_LOGD("Copying content of string field class: in-fc-addr=%p, "
616 "out-fc-addr=%p", in_field_class
, out_field_class
);
618 * There is no content to copy. Keep this function call anyway for
621 BT_COMP_LOGD("Copied content of string field class: in-fc-addr=%p, "
622 "out-fc-addr=%p", in_field_class
, out_field_class
);
624 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
;
628 bt_field_class
*copy_field_class_array_element(
629 struct trace_ir_metadata_maps
*md_maps
,
630 const bt_field_class
*in_elem_fc
)
632 bt_self_component
*self_comp
= md_maps
->self_comp
;
633 bt_field_class
*out_elem_fc
=
634 create_field_class_copy_internal(md_maps
, in_elem_fc
);
636 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
637 "Error creating output elem field class from input elem field class for static array: "
638 "in-fc-addr=%p", in_elem_fc
);
642 if (copy_field_class_content_internal(md_maps
, in_elem_fc
, out_elem_fc
) !=
643 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
644 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
645 "Error creating output elem field class from input elem field class for static array: "
646 "in-fc-addr=%p", in_elem_fc
);
647 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_elem_fc
);
656 bt_field_class
*create_field_class_copy_internal(
657 struct trace_ir_metadata_maps
*md_maps
,
658 const bt_field_class
*in_field_class
)
660 bt_self_component
*self_comp
= md_maps
->self_comp
;
661 enum debug_info_trace_ir_mapping_status status
;
662 bt_field_class
*out_field_class
= NULL
;
663 bt_field_class_type fc_type
= bt_field_class_get_type(in_field_class
);
665 BT_COMP_LOGD("Creating bare field class based on field class: in-fc-addr=%p",
669 case BT_FIELD_CLASS_TYPE_BOOL
:
670 out_field_class
= bt_field_class_bool_create(
671 md_maps
->output_trace_class
);
673 case BT_FIELD_CLASS_TYPE_BIT_ARRAY
:
674 out_field_class
= bt_field_class_bit_array_create(
675 md_maps
->output_trace_class
,
676 bt_field_class_bit_array_get_length(
679 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
:
680 out_field_class
= bt_field_class_integer_unsigned_create(
681 md_maps
->output_trace_class
);
683 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
:
684 out_field_class
= bt_field_class_integer_signed_create(
685 md_maps
->output_trace_class
);
687 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
:
688 out_field_class
= bt_field_class_enumeration_unsigned_create(
689 md_maps
->output_trace_class
);
691 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
:
692 out_field_class
= bt_field_class_enumeration_signed_create(
693 md_maps
->output_trace_class
);
695 case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
:
696 out_field_class
= bt_field_class_real_single_precision_create(
697 md_maps
->output_trace_class
);
699 case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL
:
700 out_field_class
= bt_field_class_real_double_precision_create(
701 md_maps
->output_trace_class
);
703 case BT_FIELD_CLASS_TYPE_STRING
:
704 out_field_class
= bt_field_class_string_create(
705 md_maps
->output_trace_class
);
707 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
708 out_field_class
= bt_field_class_structure_create(
709 md_maps
->output_trace_class
);
711 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
713 const bt_field_class
*in_elem_fc
=
714 bt_field_class_array_borrow_element_field_class_const(
716 uint64_t array_len
= bt_field_class_array_static_get_length(
719 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
720 md_maps
, in_elem_fc
);
722 out_field_class
= NULL
;
726 out_field_class
= bt_field_class_array_static_create(
727 md_maps
->output_trace_class
,
728 out_elem_fc
, array_len
);
735 if (bt_field_class_type_is(fc_type
,
736 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
)) {
737 const bt_field_class
*in_elem_fc
=
738 bt_field_class_array_borrow_element_field_class_const(
740 bt_field_class
*out_length_fc
= NULL
;
741 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
742 md_maps
, in_elem_fc
);
745 out_field_class
= NULL
;
749 if (fc_type
== BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD
) {
750 const bt_field_path
*length_fp
=
751 bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(
753 const bt_field_class
*in_length_fc
=
754 resolve_field_path_to_field_class(length_fp
,
757 BT_ASSERT(in_length_fc
);
758 out_length_fc
= g_hash_table_lookup(md_maps
->field_class_map
,
760 BT_ASSERT(out_length_fc
);
763 out_field_class
= bt_field_class_array_dynamic_create(
764 md_maps
->output_trace_class
, out_elem_fc
, out_length_fc
);
765 } else if (bt_field_class_type_is(fc_type
, BT_FIELD_CLASS_TYPE_OPTION
)) {
766 const bt_field_class
*in_content_fc
=
767 bt_field_class_option_borrow_field_class_const(
769 bt_field_class
*out_selector_fc
= NULL
;
770 bt_field_class
*out_content_fc
;
772 out_content_fc
= create_field_class_copy_internal(
773 md_maps
, in_content_fc
);
774 if (!out_content_fc
) {
775 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
776 "Cannot copy option's content field class: "
777 "in-content-fc-addr=%p", in_content_fc
);
781 status
= copy_field_class_content_internal(md_maps
,
782 in_content_fc
, out_content_fc
);
783 if (status
!= DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
) {
784 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
785 "Error copying content of option's content field class: "
786 "in-content-fc-addr=%p, out-content-fc-addr=%p",
787 in_content_fc
, out_content_fc
);
788 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_content_fc
);
792 if (fc_type
== BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD
) {
794 bt_field_class_option_without_selector_create(
795 md_maps
->output_trace_class
,
798 const bt_field_path
*in_selector_fp
=
799 bt_field_class_option_with_selector_field_borrow_selector_field_path_const(
801 const bt_field_class
*in_selector_fc
;
803 BT_ASSERT(in_selector_fp
);
804 in_selector_fc
= resolve_field_path_to_field_class(
805 in_selector_fp
, md_maps
);
806 BT_ASSERT(in_selector_fc
);
807 out_selector_fc
= g_hash_table_lookup(
808 md_maps
->field_class_map
, in_selector_fc
);
809 BT_ASSERT(out_selector_fc
);
811 if (fc_type
== BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD
) {
813 bt_field_class_option_with_selector_field_bool_create(
814 md_maps
->output_trace_class
,
815 out_content_fc
, out_selector_fc
);
816 } else if (fc_type
== BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD
) {
817 const bt_integer_range_set_unsigned
*ranges
=
818 bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const(
823 bt_field_class_option_with_selector_field_integer_unsigned_create(
824 md_maps
->output_trace_class
,
825 out_content_fc
, out_selector_fc
,
827 } else if (fc_type
== BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD
) {
828 const bt_integer_range_set_signed
*ranges
=
829 bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const(
834 bt_field_class_option_with_selector_field_integer_signed_create(
835 md_maps
->output_trace_class
,
836 out_content_fc
, out_selector_fc
,
840 } else if (bt_field_class_type_is(fc_type
,
841 BT_FIELD_CLASS_TYPE_VARIANT
)) {
842 bt_field_class
*out_sel_fc
= NULL
;
844 if (bt_field_class_type_is(fc_type
,
845 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD
)) {
846 const bt_field_class
*in_sel_fc
;
847 const bt_field_path
*sel_fp
=
848 bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(
852 in_sel_fc
= resolve_field_path_to_field_class(sel_fp
,
854 BT_ASSERT(in_sel_fc
);
855 out_sel_fc
= g_hash_table_lookup(
856 md_maps
->field_class_map
, in_sel_fc
);
857 BT_ASSERT(out_sel_fc
);
860 out_field_class
= bt_field_class_variant_create(
861 md_maps
->output_trace_class
, out_sel_fc
);
865 * Add mapping from in_field_class to out_field_class. This simplifies
866 * the resolution of field paths in variant and dynamic array field
869 BT_ASSERT(out_field_class
);
870 g_hash_table_insert(md_maps
->field_class_map
,
871 (gpointer
) in_field_class
, out_field_class
);
875 BT_COMP_LOGD("Created bare field class based on field class: in-fc-addr=%p, "
876 "out-fc-addr=%p", in_field_class
, out_field_class
);
878 BT_COMP_LOGE_APPEND_CAUSE(self_comp
,
879 "Error creating output field class from input field class: "
880 "in-fc-addr=%p", in_field_class
);
883 return out_field_class
;
887 enum debug_info_trace_ir_mapping_status
copy_field_class_content_internal(
888 struct trace_ir_metadata_maps
*md_maps
,
889 const bt_field_class
*in_field_class
,
890 bt_field_class
*out_field_class
)
892 enum debug_info_trace_ir_mapping_status status
;
893 bt_field_class_type in_fc_type
=
894 bt_field_class_get_type(in_field_class
);
897 * Safe to use the same value object because it's frozen at this
900 bt_field_class_set_user_attributes(out_field_class
,
901 bt_field_class_borrow_user_attributes_const(in_field_class
));
903 if (in_fc_type
== BT_FIELD_CLASS_TYPE_BOOL
) {
904 status
= field_class_bool_copy(md_maps
,
905 in_field_class
, out_field_class
);
906 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_BIT_ARRAY
) {
907 status
= field_class_bit_array_copy(md_maps
,
908 in_field_class
, out_field_class
);
909 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
) {
910 status
= field_class_unsigned_integer_copy(md_maps
,
911 in_field_class
, out_field_class
);
912 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
) {
913 status
= field_class_signed_integer_copy(md_maps
,
914 in_field_class
, out_field_class
);
915 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
) {
916 status
= field_class_unsigned_enumeration_copy(md_maps
,
917 in_field_class
, out_field_class
);
918 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
) {
919 status
= field_class_signed_enumeration_copy(md_maps
,
920 in_field_class
, out_field_class
);
921 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
) {
922 status
= field_class_single_precision_real_copy(md_maps
,
923 in_field_class
, out_field_class
);
924 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL
) {
925 status
= field_class_double_precision_real_copy(md_maps
,
926 in_field_class
, out_field_class
);
927 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_STRING
) {
928 status
= field_class_string_copy(md_maps
,
929 in_field_class
, out_field_class
);
930 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_STRUCTURE
) {
931 status
= field_class_structure_copy(md_maps
,
932 in_field_class
, out_field_class
);
933 } else if (in_fc_type
== BT_FIELD_CLASS_TYPE_STATIC_ARRAY
) {
934 status
= field_class_static_array_copy(md_maps
,
935 in_field_class
, out_field_class
);
936 } else if (bt_field_class_type_is(in_fc_type
,
937 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
)) {
938 status
= field_class_dynamic_array_copy(md_maps
,
939 in_field_class
, out_field_class
);
940 } else if (bt_field_class_type_is(in_fc_type
,
941 BT_FIELD_CLASS_TYPE_OPTION
)) {
942 status
= field_class_option_copy(md_maps
,
943 in_field_class
, out_field_class
);
944 } else if (bt_field_class_type_is(in_fc_type
,
945 BT_FIELD_CLASS_TYPE_VARIANT
)) {
946 status
= field_class_variant_copy(md_maps
,
947 in_field_class
, out_field_class
);