2 * Babeltrace - Trace IR field copy
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 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 #define BT_COMP_LOG_SELF_COMP (md_maps->self_comp)
28 #define BT_LOG_OUTPUT_LEVEL (md_maps->log_level)
29 #define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-META-FC-COPY"
30 #include "logging/comp-logging.h"
32 #include "common/assert.h"
33 #include "common/common.h"
34 #include "compat/compiler.h"
35 #include <babeltrace2/babeltrace.h>
37 #include "trace-ir-metadata-copy.h"
38 #include "trace-ir-metadata-field-class-copy.h"
41 * This fonction walks througth the nested structures field class to resolve a
42 * field path object. A field path is made of indexes inside possibly nested
43 * structures ultimately leading to a field class.
46 const bt_field_class
*walk_field_path(struct trace_ir_metadata_maps
*md_maps
,
47 const bt_field_path
*fp
, const bt_field_class
*fc
)
49 uint64_t i
, fp_item_count
;
50 const bt_field_class
*curr_fc
;
52 BT_ASSERT(bt_field_class_get_type(fc
) == BT_FIELD_CLASS_TYPE_STRUCTURE
);
53 BT_COMP_LOGD("Walking field path on field class: fp-addr=%p, fc-addr=%p",
56 fp_item_count
= bt_field_path_get_item_count(fp
);
58 for (i
= 0; i
< fp_item_count
; i
++) {
59 bt_field_class_type fc_type
= bt_field_class_get_type(curr_fc
);
60 const bt_field_path_item
*fp_item
=
61 bt_field_path_borrow_item_by_index_const(fp
, i
);
64 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
66 const bt_field_class_structure_member
*member
;
68 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
69 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
70 member
= bt_field_class_structure_borrow_member_by_index_const(
72 bt_field_path_item_index_get_index(fp_item
));
73 curr_fc
= bt_field_class_structure_member_borrow_field_class_const(
77 case BT_FIELD_CLASS_TYPE_OPTION
:
79 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
80 BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT
);
81 curr_fc
= bt_field_class_option_borrow_field_class_const(
85 case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
:
86 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
:
87 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
:
89 const bt_field_class_variant_option
*option
;
91 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
92 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
93 option
= bt_field_class_variant_borrow_option_by_index_const(
95 bt_field_path_item_index_get_index(fp_item
));
96 curr_fc
= bt_field_class_variant_option_borrow_field_class_const(
100 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
101 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
103 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
104 BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT
);
105 curr_fc
= bt_field_class_array_borrow_element_field_class_const(
118 const bt_field_class
*resolve_field_path_to_field_class(const bt_field_path
*fp
,
119 struct trace_ir_metadata_maps
*md_maps
)
121 struct field_class_resolving_context
*fc_resolving_ctx
;
122 const bt_field_class
*fc
;
123 bt_field_path_scope fp_scope
;
125 BT_COMP_LOGD("Resolving field path: fp-addr=%p", fp
);
127 fc_resolving_ctx
= md_maps
->fc_resolving_ctx
;
128 fp_scope
= bt_field_path_get_root_scope(fp
);
131 case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT
:
132 fc
= walk_field_path(md_maps
, fp
,
133 fc_resolving_ctx
->packet_context
);
135 case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT
:
136 fc
= walk_field_path(md_maps
, fp
,
137 fc_resolving_ctx
->event_common_context
);
139 case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT
:
140 fc
= walk_field_path(md_maps
, fp
,
141 fc_resolving_ctx
->event_specific_context
);
143 case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD
:
144 fc
= walk_field_path(md_maps
, fp
,
145 fc_resolving_ctx
->event_payload
);
155 void field_class_integer_set_props(const bt_field_class
*input_fc
,
156 bt_field_class
*output_fc
)
158 bt_field_class_integer_set_preferred_display_base(output_fc
,
159 bt_field_class_integer_get_preferred_display_base(input_fc
));
160 bt_field_class_integer_set_field_value_range(output_fc
,
161 bt_field_class_integer_get_field_value_range(input_fc
));
165 int field_class_bool_copy(
166 struct trace_ir_metadata_maps
*md_maps
,
167 const bt_field_class
*in_field_class
,
168 bt_field_class
*out_field_class
)
170 BT_COMP_LOGD("Copying content of boolean field class: "
171 "in-fc-addr=%p, out-fc-addr=%p",
172 in_field_class
, out_field_class
);
173 BT_COMP_LOGD("Copied content of boolean field class: "
174 "in-fc-addr=%p, out-fc-addr=%p",
175 in_field_class
, out_field_class
);
180 int field_class_bit_array_copy(
181 struct trace_ir_metadata_maps
*md_maps
,
182 const bt_field_class
*in_field_class
,
183 bt_field_class
*out_field_class
)
185 BT_COMP_LOGD("Copying content of bit array field class: "
186 "in-fc-addr=%p, out-fc-addr=%p",
187 in_field_class
, out_field_class
);
188 BT_COMP_LOGD("Copied content of bit array field class: "
189 "in-fc-addr=%p, out-fc-addr=%p",
190 in_field_class
, out_field_class
);
195 int field_class_unsigned_integer_copy(
196 struct trace_ir_metadata_maps
*md_maps
,
197 const bt_field_class
*in_field_class
,
198 bt_field_class
*out_field_class
)
200 BT_COMP_LOGD("Copying content of unsigned integer field class: "
201 "in-fc-addr=%p, out-fc-addr=%p",
202 in_field_class
, out_field_class
);
204 field_class_integer_set_props(in_field_class
, out_field_class
);
206 BT_COMP_LOGD("Copied content of unsigned integer field class: "
207 "in-fc-addr=%p, out-fc-addr=%p",
208 in_field_class
, out_field_class
);
213 int field_class_signed_integer_copy(
214 struct trace_ir_metadata_maps
*md_maps
,
215 const bt_field_class
*in_field_class
,
216 bt_field_class
*out_field_class
)
218 BT_COMP_LOGD("Copying content of signed integer field class: "
219 "in-fc-addr=%p, out-fc-addr=%p",
220 in_field_class
, out_field_class
);
222 field_class_integer_set_props(in_field_class
, out_field_class
);
224 BT_COMP_LOGD("Copied content of signed integer field class: "
225 "in-fc-addr=%p, out-fc-addr=%p",
226 in_field_class
, out_field_class
);
231 int field_class_unsigned_enumeration_copy(
232 struct trace_ir_metadata_maps
*md_maps
,
233 const bt_field_class
*in_field_class
,
234 bt_field_class
*out_field_class
)
236 uint64_t i
, enum_mapping_count
;
239 BT_COMP_LOGD("Copying content of unsigned enumeration field class: "
240 "in-fc-addr=%p, out-fc-addr=%p",
241 in_field_class
, out_field_class
);
243 /* Copy properties of the inner integer. */
244 field_class_integer_set_props(in_field_class
, out_field_class
);
246 /* Copy all enumeration entries. */
247 enum_mapping_count
= bt_field_class_enumeration_get_mapping_count(in_field_class
);
248 for (i
= 0; i
< enum_mapping_count
; i
++) {
250 const bt_integer_range_set_unsigned
*range_set
;
251 const bt_field_class_enumeration_unsigned_mapping
*u_mapping
;
252 const bt_field_class_enumeration_mapping
*mapping
;
254 u_mapping
= bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
256 mapping
= bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
258 label
= bt_field_class_enumeration_mapping_get_label(mapping
);
259 range_set
= bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
261 ret
= bt_field_class_enumeration_unsigned_add_mapping(
262 out_field_class
, label
, range_set
);
268 BT_COMP_LOGD("Copied content of unsigned enumeration field class: "
269 "in-fc-addr=%p, out-fc-addr=%p",
270 in_field_class
, out_field_class
);
277 int field_class_signed_enumeration_copy(
278 struct trace_ir_metadata_maps
*md_maps
,
279 const bt_field_class
*in_field_class
,
280 bt_field_class
*out_field_class
)
282 uint64_t i
, enum_mapping_count
;
285 BT_COMP_LOGD("Copying content of signed enumeration field class: "
286 "in-fc-addr=%p, out-fc-addr=%p",
287 in_field_class
, out_field_class
);
289 /* Copy properties of the inner integer. */
290 field_class_integer_set_props(in_field_class
, out_field_class
);
292 /* Copy all enumeration entries. */
294 bt_field_class_enumeration_get_mapping_count(in_field_class
);
295 for (i
= 0; i
< enum_mapping_count
; i
++) {
297 const bt_integer_range_set_signed
*range_set
;
298 const bt_field_class_enumeration_signed_mapping
*s_mapping
;
299 const bt_field_class_enumeration_mapping
*mapping
;
301 s_mapping
= bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
303 mapping
= bt_field_class_enumeration_signed_mapping_as_mapping_const(
305 label
= bt_field_class_enumeration_mapping_get_label(mapping
);
306 range_set
= bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
308 ret
= bt_field_class_enumeration_signed_add_mapping(
309 out_field_class
, label
, range_set
);
315 BT_COMP_LOGD("Copied content of signed enumeration field class: "
316 "in-fc-addr=%p, out-fc-addr=%p",
317 in_field_class
, out_field_class
);
324 int field_class_single_precision_real_copy(
325 struct trace_ir_metadata_maps
*md_maps
,
326 const bt_field_class
*in_field_class
,
327 bt_field_class
*out_field_class
)
329 BT_COMP_LOGD("Copying content of single-precision real field class: "
330 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
332 BT_COMP_LOGD("Copied content single-precision real field class:"
333 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
339 int field_class_double_precision_real_copy(
340 struct trace_ir_metadata_maps
*md_maps
,
341 const bt_field_class
*in_field_class
,
342 bt_field_class
*out_field_class
)
344 BT_COMP_LOGD("Copying content of double-precision real field class: "
345 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
347 BT_COMP_LOGD("Copied content double-precision real field class:"
348 "in-fc-addr=%p, out-fc-addr=%p", in_field_class
, out_field_class
);
354 int field_class_structure_copy(
355 struct trace_ir_metadata_maps
*md_maps
,
356 const bt_field_class
*in_field_class
,
357 bt_field_class
*out_field_class
)
359 uint64_t i
, struct_member_count
;
362 BT_COMP_LOGD("Copying content of structure field class: "
363 "in-fc-addr=%p, out-fc-addr=%p",
364 in_field_class
, out_field_class
);
365 /* Get the number of member in that struct. */
366 struct_member_count
=
367 bt_field_class_structure_get_member_count(in_field_class
);
369 /* Iterate over all the members of the struct. */
370 for (i
= 0; i
< struct_member_count
; i
++) {
371 const bt_field_class_structure_member
*in_member
;
372 bt_field_class_structure_member
*out_member
;
373 const char *member_name
;
374 const bt_field_class
*in_member_fc
;
375 bt_field_class
*out_member_field_class
;
377 in_member
= bt_field_class_structure_borrow_member_by_index_const(
379 in_member_fc
= bt_field_class_structure_member_borrow_field_class_const(
381 member_name
= bt_field_class_structure_member_get_name(in_member
);
382 BT_COMP_LOGD("Copying structure field class's field: "
383 "index=%" PRId64
", "
384 "member-fc-addr=%p, field-name=\"%s\"",
385 i
, in_member_fc
, member_name
);
387 out_member_field_class
= create_field_class_copy(md_maps
,
389 if (!out_member_field_class
) {
390 BT_COMP_LOGE("Cannot copy structure field class's field: "
391 "index=%" PRId64
", "
392 "field-fc-addr=%p, field-name=\"%s\"",
393 i
, in_member_fc
, member_name
);
397 ret
= copy_field_class_content(md_maps
, in_member_fc
,
398 out_member_field_class
);
403 if (bt_field_class_structure_append_member(out_field_class
,
404 member_name
, out_member_field_class
) !=
405 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK
) {
406 BT_COMP_LOGE("Cannot append structure field class's field: "
407 "index=%" PRId64
", "
408 "field-fc-addr=%p, field-name=\"%s\"",
409 i
, in_member_fc
, member_name
);
410 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_field_class
);
415 out_member
= bt_field_class_structure_borrow_member_by_index(
417 BT_ASSERT(out_member
);
420 * Safe to use the same value object because it's frozen
423 bt_field_class_structure_member_set_user_attributes(
425 bt_field_class_structure_member_borrow_user_attributes_const(
429 BT_COMP_LOGD("Copied structure field class: original-fc-addr=%p, copy-fc-addr=%p",
430 in_field_class
, out_field_class
);
437 int field_class_variant_copy(
438 struct trace_ir_metadata_maps
*md_maps
,
439 const bt_field_class
*in_field_class
,
440 bt_field_class
*out_field_class
)
442 bt_field_class
*out_tag_field_class
= NULL
;
443 uint64_t i
, variant_option_count
;
444 bt_field_class_type fc_type
= bt_field_class_get_type(in_field_class
);
447 BT_COMP_LOGD("Copying content of variant field class: "
448 "in-fc-addr=%p, out-fc-addr=%p",
449 in_field_class
, out_field_class
);
450 variant_option_count
=
451 bt_field_class_variant_get_option_count(in_field_class
);
452 for (i
= 0; i
< variant_option_count
; i
++) {
453 const bt_field_class
*in_option_fc
;
454 const char *option_name
;
455 bt_field_class
*out_option_field_class
;
456 const bt_field_class_variant_option
*in_option
;
457 bt_field_class_variant_option
*out_option
;
459 in_option
= bt_field_class_variant_borrow_option_by_index_const(
461 in_option_fc
= bt_field_class_variant_option_borrow_field_class_const(
463 option_name
= bt_field_class_variant_option_get_name(in_option
);
464 out_option_field_class
= create_field_class_copy_internal(
465 md_maps
, in_option_fc
);
466 if (!out_option_field_class
) {
467 BT_COMP_LOGE_STR("Cannot copy field class.");
471 ret
= copy_field_class_content_internal(md_maps
, in_option_fc
,
472 out_option_field_class
);
474 BT_COMP_LOGE_STR("Error copying content of option variant "
479 if (fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
) {
480 const bt_field_class_variant_with_selector_unsigned_option
*spec_opt
=
481 bt_field_class_variant_with_selector_unsigned_borrow_option_by_index_const(
483 const bt_integer_range_set_unsigned
*ranges
=
484 bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const(
487 if (bt_field_class_variant_with_selector_unsigned_append_option(
488 out_field_class
, option_name
,
489 out_option_field_class
, ranges
) !=
490 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_APPEND_OPTION_STATUS_OK
) {
491 BT_COMP_LOGE_STR("Cannot append option to variant field class with unsigned selector'");
492 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
496 } else if (fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
) {
497 const bt_field_class_variant_with_selector_signed_option
*spec_opt
=
498 bt_field_class_variant_with_selector_signed_borrow_option_by_index_const(
500 const bt_integer_range_set_signed
*ranges
=
501 bt_field_class_variant_with_selector_signed_option_borrow_ranges_const(
504 if (bt_field_class_variant_with_selector_signed_append_option(
505 out_field_class
, option_name
,
506 out_option_field_class
, ranges
) !=
507 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_APPEND_OPTION_STATUS_OK
) {
508 BT_COMP_LOGE_STR("Cannot append option to variant field class with signed selector'");
509 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
514 BT_ASSERT(fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
);
516 if (bt_field_class_variant_without_selector_append_option(
517 out_field_class
, option_name
,
518 out_option_field_class
) !=
519 BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_APPEND_OPTION_STATUS_OK
) {
520 BT_COMP_LOGE_STR("Cannot append option to variant field class'");
521 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
527 out_option
= bt_field_class_variant_borrow_option_by_index(
529 BT_ASSERT(out_option
);
532 * Safe to use the same value object because it's frozen
535 bt_field_class_variant_option_set_user_attributes(
537 bt_field_class_variant_option_borrow_user_attributes_const(
541 BT_COMP_LOGD("Copied content of variant field class: in-fc-addr=%p, "
542 "out-fc-addr=%p", in_field_class
, out_field_class
);
549 int field_class_static_array_copy(
550 struct trace_ir_metadata_maps
*md_maps
,
551 const bt_field_class
*in_field_class
,
552 bt_field_class
*out_field_class
)
554 BT_COMP_LOGD("Copying content of static array field class: in-fc-addr=%p, "
555 "out-fc-addr=%p", in_field_class
, out_field_class
);
557 * There is no content to copy. Keep this function call anyway for
560 BT_COMP_LOGD("Copied content of static array field class: in-fc-addr=%p, "
561 "out-fc-addr=%p", in_field_class
, out_field_class
);
567 int field_class_dynamic_array_copy(
568 struct trace_ir_metadata_maps
*md_maps
,
569 const bt_field_class
*in_field_class
,
570 bt_field_class
*out_field_class
)
572 BT_COMP_LOGD("Copying content of dynamic array field class: "
573 "in-fc-addr=%p, out-fc-addr=%p",
574 in_field_class
, out_field_class
);
577 * There is no content to copy. Keep this function call anyway for
580 BT_COMP_LOGD("Copied dynamic array field class: in-fc-addr=%p, "
581 "out-fc-addr=%p", in_field_class
, out_field_class
);
587 int 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",
594 in_field_class
, out_field_class
);
597 * There is no content to copy. Keep this function call anyway for
600 BT_COMP_LOGD("Copied option field class: in-fc-addr=%p, "
601 "out-fc-addr=%p", in_field_class
, out_field_class
);
607 int field_class_string_copy(struct trace_ir_metadata_maps
*md_maps
,
608 const bt_field_class
*in_field_class
,
609 bt_field_class
*out_field_class
)
611 BT_COMP_LOGD("Copying content of string field class: in-fc-addr=%p, "
612 "out-fc-addr=%p", in_field_class
, out_field_class
);
614 * There is no content to copy. Keep this function call anyway for
617 BT_COMP_LOGD("Copied content of string field class: in-fc-addr=%p, "
618 "out-fc-addr=%p", in_field_class
, out_field_class
);
624 bt_field_class
*copy_field_class_array_element(struct trace_ir_metadata_maps
*md_maps
,
625 const bt_field_class
*in_elem_fc
)
628 bt_field_class
*out_elem_fc
=
629 create_field_class_copy_internal(md_maps
, in_elem_fc
);
631 BT_COMP_LOGE("Error creating output elem field class "
632 "from input elem field class for static array: "
633 "in-fc-addr=%p", in_elem_fc
);
637 ret
= copy_field_class_content_internal(md_maps
, in_elem_fc
, out_elem_fc
);
639 BT_COMP_LOGE("Error creating output elem field class "
640 "from input elem field class for static array: "
641 "in-fc-addr=%p", in_elem_fc
);
642 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_elem_fc
);
651 bt_field_class
*create_field_class_copy_internal(struct trace_ir_metadata_maps
*md_maps
,
652 const bt_field_class
*in_field_class
)
654 bt_field_class
*out_field_class
= NULL
;
655 bt_field_class_type fc_type
= bt_field_class_get_type(in_field_class
);
657 BT_COMP_LOGD("Creating bare field class based on field class: in-fc-addr=%p",
661 case BT_FIELD_CLASS_TYPE_BOOL
:
662 out_field_class
= bt_field_class_bool_create(
663 md_maps
->output_trace_class
);
665 case BT_FIELD_CLASS_TYPE_BIT_ARRAY
:
666 out_field_class
= bt_field_class_bit_array_create(
667 md_maps
->output_trace_class
,
668 bt_field_class_bit_array_get_length(
671 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
:
672 out_field_class
= bt_field_class_integer_unsigned_create(
673 md_maps
->output_trace_class
);
675 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
:
676 out_field_class
= bt_field_class_integer_signed_create(
677 md_maps
->output_trace_class
);
679 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
:
680 out_field_class
= bt_field_class_enumeration_unsigned_create(
681 md_maps
->output_trace_class
);
683 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
:
684 out_field_class
= bt_field_class_enumeration_signed_create(
685 md_maps
->output_trace_class
);
687 case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
:
688 out_field_class
= bt_field_class_real_single_precision_create(
689 md_maps
->output_trace_class
);
691 case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL
:
692 out_field_class
= bt_field_class_real_double_precision_create(
693 md_maps
->output_trace_class
);
695 case BT_FIELD_CLASS_TYPE_STRING
:
696 out_field_class
= bt_field_class_string_create(
697 md_maps
->output_trace_class
);
699 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
700 out_field_class
= bt_field_class_structure_create(
701 md_maps
->output_trace_class
);
703 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
705 const bt_field_class
*in_elem_fc
=
706 bt_field_class_array_borrow_element_field_class_const(
709 bt_field_class_array_static_get_length(in_field_class
);
711 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
712 md_maps
, in_elem_fc
);
714 out_field_class
= NULL
;
718 out_field_class
= bt_field_class_array_static_create(
719 md_maps
->output_trace_class
,
720 out_elem_fc
, array_len
);
723 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
725 const bt_field_class
*in_elem_fc
=
726 bt_field_class_array_borrow_element_field_class_const(
728 const bt_field_path
*length_fp
=
729 bt_field_class_array_dynamic_borrow_length_field_path_const(
731 bt_field_class
*out_length_fc
= NULL
;
733 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
734 md_maps
, in_elem_fc
);
736 out_field_class
= NULL
;
741 const bt_field_class
*in_length_fc
=
742 resolve_field_path_to_field_class(length_fp
,
745 BT_ASSERT(in_length_fc
);
746 out_length_fc
= g_hash_table_lookup(md_maps
->field_class_map
,
748 BT_ASSERT(out_length_fc
);
751 out_field_class
= bt_field_class_array_dynamic_create(
752 md_maps
->output_trace_class
,
753 out_elem_fc
, out_length_fc
);
756 case BT_FIELD_CLASS_TYPE_OPTION
:
758 const bt_field_class
*in_content_fc
=
759 bt_field_class_option_borrow_field_class_const(
761 const bt_field_path
*in_selector_fp
=
762 bt_field_class_option_borrow_selector_field_path_const(
764 bt_field_class
*out_selector_fc
= NULL
;
765 bt_field_class
*out_content_fc
;
768 out_content_fc
= create_field_class_copy_internal(
769 md_maps
, in_content_fc
);
770 if (!out_content_fc
) {
771 BT_COMP_LOGE_STR("Cannot copy option's content field class.");
775 ret
= copy_field_class_content_internal(md_maps
,
776 in_content_fc
, out_content_fc
);
778 BT_COMP_LOGE_STR("Error copying content of option's "
779 "content field class");
783 if (in_selector_fp
) {
784 const bt_field_class
*in_selector_fc
=
785 resolve_field_path_to_field_class(
786 in_selector_fp
, md_maps
);
788 BT_ASSERT(in_selector_fc
);
789 out_selector_fc
= g_hash_table_lookup(
790 md_maps
->field_class_map
, in_selector_fc
);
791 BT_ASSERT(out_selector_fc
);
794 out_field_class
= bt_field_class_option_create(
795 md_maps
->output_trace_class
,
796 out_content_fc
, out_selector_fc
);
799 case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
:
800 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
:
801 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
:
803 bt_field_class
*out_sel_fc
= NULL
;
805 if (fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
||
806 fc_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
) {
807 const bt_field_class
*in_sel_fc
;
808 const bt_field_path
*sel_fp
=
809 bt_field_class_variant_with_selector_borrow_selector_field_path_const(
813 in_sel_fc
= resolve_field_path_to_field_class(sel_fp
,
815 BT_ASSERT(in_sel_fc
);
816 out_sel_fc
= g_hash_table_lookup(
817 md_maps
->field_class_map
, in_sel_fc
);
818 BT_ASSERT(out_sel_fc
);
821 out_field_class
= bt_field_class_variant_create(
822 md_maps
->output_trace_class
, out_sel_fc
);
830 * Add mapping from in_field_class to out_field_class. This simplifies
831 * the resolution of field paths in variant and dynamic array field
834 g_hash_table_insert(md_maps
->field_class_map
,
835 (gpointer
) in_field_class
, out_field_class
);
839 BT_COMP_LOGD("Created bare field class based on field class: in-fc-addr=%p, "
840 "out-fc-addr=%p", in_field_class
, out_field_class
);
842 BT_COMP_LOGE("Error creating output field class from input field "
843 "class: in-fc-addr=%p", in_field_class
);
846 return out_field_class
;
850 int copy_field_class_content_internal(
851 struct trace_ir_metadata_maps
*md_maps
,
852 const bt_field_class
*in_field_class
,
853 bt_field_class
*out_field_class
)
858 * Safe to use the same value object because it's frozen at this
861 bt_field_class_set_user_attributes(out_field_class
,
862 bt_field_class_borrow_user_attributes_const(in_field_class
));
864 switch(bt_field_class_get_type(in_field_class
)) {
865 case BT_FIELD_CLASS_TYPE_BOOL
:
866 ret
= field_class_bool_copy(md_maps
,
867 in_field_class
, out_field_class
);
869 case BT_FIELD_CLASS_TYPE_BIT_ARRAY
:
870 ret
= field_class_bit_array_copy(md_maps
,
871 in_field_class
, out_field_class
);
873 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
:
874 ret
= field_class_unsigned_integer_copy(md_maps
,
875 in_field_class
, out_field_class
);
877 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
:
878 ret
= field_class_signed_integer_copy(md_maps
,
879 in_field_class
, out_field_class
);
881 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
:
882 ret
= field_class_unsigned_enumeration_copy(md_maps
,
883 in_field_class
, out_field_class
);
885 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
:
886 ret
= field_class_signed_enumeration_copy(md_maps
,
887 in_field_class
, out_field_class
);
889 case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
:
890 ret
= field_class_single_precision_real_copy(md_maps
,
891 in_field_class
, out_field_class
);
893 case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL
:
894 ret
= field_class_double_precision_real_copy(md_maps
,
895 in_field_class
, out_field_class
);
897 case BT_FIELD_CLASS_TYPE_STRING
:
898 ret
= field_class_string_copy(md_maps
,
899 in_field_class
, out_field_class
);
901 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
902 ret
= field_class_structure_copy(md_maps
,
903 in_field_class
, out_field_class
);
905 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
906 ret
= field_class_static_array_copy(md_maps
,
907 in_field_class
, out_field_class
);
909 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
910 ret
= field_class_dynamic_array_copy(md_maps
,
911 in_field_class
, out_field_class
);
913 case BT_FIELD_CLASS_TYPE_OPTION
:
914 ret
= field_class_option_copy(md_maps
,
915 in_field_class
, out_field_class
);
917 case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
:
918 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
:
919 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
:
920 ret
= field_class_variant_copy(md_maps
,
921 in_field_class
, out_field_class
);