ctf: Remove redundant declarations of lexer/parser functions
[babeltrace.git] / src / plugins / lttng-utils / debug-info / trace-ir-metadata-field-class-copy.c
CommitLineData
ca9f27f3
FD
1/*
2 * Babeltrace - Trace IR field copy
3 *
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>
7 *
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:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
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
24 * SOFTWARE.
25 */
26
91bc8451 27#define BT_COMP_LOG_SELF_COMP (md_maps->self_comp)
3a3d15f3 28#define BT_LOG_OUTPUT_LEVEL (md_maps->log_level)
350ad6c1 29#define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-META-FC-COPY"
d9c39b0a 30#include "logging/comp-logging.h"
ca9f27f3 31
578e048b
MJ
32#include "common/assert.h"
33#include "common/common.h"
34#include "compat/compiler.h"
3fadfbc0 35#include <babeltrace2/babeltrace.h>
ca9f27f3
FD
36
37#include "trace-ir-metadata-copy.h"
38#include "trace-ir-metadata-field-class-copy.h"
39
40/*
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.
44 */
45static
3a3d15f3
PP
46const bt_field_class *walk_field_path(struct trace_ir_metadata_maps *md_maps,
47 const bt_field_path *fp, const bt_field_class *fc)
ca9f27f3 48{
66ddcddf 49 uint64_t i, fp_item_count;
ca9f27f3
FD
50 const bt_field_class *curr_fc;
51
52 BT_ASSERT(bt_field_class_get_type(fc) == BT_FIELD_CLASS_TYPE_STRUCTURE);
91bc8451 53 BT_COMP_LOGD("Walking field path on field class: fp-addr=%p, fc-addr=%p",
bc463d34 54 fp, fc);
ca9f27f3 55
66ddcddf 56 fp_item_count = bt_field_path_get_item_count(fp);
ca9f27f3 57 curr_fc = fc;
66ddcddf 58 for (i = 0; i < fp_item_count; i++) {
ca9f27f3 59 bt_field_class_type fc_type = bt_field_class_get_type(curr_fc);
66ddcddf
PP
60 const bt_field_path_item *fp_item =
61 bt_field_path_borrow_item_by_index_const(fp, i);
ca9f27f3 62
ebdb6693 63 if (fc_type == BT_FIELD_CLASS_TYPE_STRUCTURE) {
66ddcddf
PP
64 const bt_field_class_structure_member *member;
65
66 BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
67 BT_FIELD_PATH_ITEM_TYPE_INDEX);
68 member = bt_field_class_structure_borrow_member_by_index_const(
69 curr_fc,
70 bt_field_path_item_index_get_index(fp_item));
1e6fd1d7
PP
71 curr_fc = bt_field_class_structure_member_borrow_field_class_const(
72 member);
ebdb6693 73 } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_OPTION)) {
f29ef814
PP
74 BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
75 BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT);
76 curr_fc = bt_field_class_option_borrow_field_class_const(
77 curr_fc);
ebdb6693
PP
78
79 } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_VARIANT)) {
66ddcddf
PP
80 const bt_field_class_variant_option *option;
81
82 BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
83 BT_FIELD_PATH_ITEM_TYPE_INDEX);
84 option = bt_field_class_variant_borrow_option_by_index_const(
85 curr_fc,
86 bt_field_path_item_index_get_index(fp_item));
1e6fd1d7
PP
87 curr_fc = bt_field_class_variant_option_borrow_field_class_const(
88 option);
ca9f27f3 89 break;
ebdb6693 90 } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_ARRAY)) {
66ddcddf
PP
91 BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
92 BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT);
93 curr_fc = bt_field_class_array_borrow_element_field_class_const(
94 curr_fc);
95 break;
ebdb6693 96 } else {
ca9f27f3
FD
97 abort();
98 }
99 }
100
101 return curr_fc;
102}
103
104static
105const bt_field_class *resolve_field_path_to_field_class(const bt_field_path *fp,
106 struct trace_ir_metadata_maps *md_maps)
107{
108 struct field_class_resolving_context *fc_resolving_ctx;
109 const bt_field_class *fc;
e7ceb9df 110 bt_field_path_scope fp_scope;
ca9f27f3 111
91bc8451 112 BT_COMP_LOGD("Resolving field path: fp-addr=%p", fp);
ca9f27f3
FD
113
114 fc_resolving_ctx = md_maps->fc_resolving_ctx;
115 fp_scope = bt_field_path_get_root_scope(fp);
116
117 switch (fp_scope) {
e7ceb9df 118 case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT:
3a3d15f3
PP
119 fc = walk_field_path(md_maps, fp,
120 fc_resolving_ctx->packet_context);
ca9f27f3 121 break;
e7ceb9df 122 case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT:
3a3d15f3
PP
123 fc = walk_field_path(md_maps, fp,
124 fc_resolving_ctx->event_common_context);
ca9f27f3 125 break;
e7ceb9df 126 case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT:
3a3d15f3
PP
127 fc = walk_field_path(md_maps, fp,
128 fc_resolving_ctx->event_specific_context);
ca9f27f3 129 break;
e7ceb9df 130 case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD:
3a3d15f3
PP
131 fc = walk_field_path(md_maps, fp,
132 fc_resolving_ctx->event_payload);
ca9f27f3
FD
133 break;
134 default:
135 abort();
136 }
137
138 return fc;
139}
140
141static inline
142void field_class_integer_set_props(const bt_field_class *input_fc,
143 bt_field_class *output_fc)
144{
145 bt_field_class_integer_set_preferred_display_base(output_fc,
bc463d34 146 bt_field_class_integer_get_preferred_display_base(input_fc));
ca9f27f3 147 bt_field_class_integer_set_field_value_range(output_fc,
bc463d34 148 bt_field_class_integer_get_field_value_range(input_fc));
ca9f27f3
FD
149}
150
f7cfbcc3 151static inline
3b34b490
FD
152enum debug_info_trace_ir_mapping_status field_class_bool_copy(
153 struct trace_ir_metadata_maps *md_maps,
f7cfbcc3
PP
154 const bt_field_class *in_field_class,
155 bt_field_class *out_field_class)
156{
157 BT_COMP_LOGD("Copying content of boolean field class: "
bc463d34
FD
158 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
159 /*
160 * There is no content to copy. Keep this function call anyway for
161 * logging purposes.
162 */
f7cfbcc3 163 BT_COMP_LOGD("Copied content of boolean field class: "
bc463d34 164 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
3b34b490 165 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
f7cfbcc3
PP
166}
167
dc7ac074 168static inline
3b34b490 169enum debug_info_trace_ir_mapping_status field_class_bit_array_copy(
dc7ac074
PP
170 struct trace_ir_metadata_maps *md_maps,
171 const bt_field_class *in_field_class,
172 bt_field_class *out_field_class)
173{
174 BT_COMP_LOGD("Copying content of bit array field class: "
bc463d34
FD
175 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
176 /*
177 * There is no content to copy. Keep this function call anyway for
178 * logging purposes.
179 */
dc7ac074 180 BT_COMP_LOGD("Copied content of bit array field class: "
bc463d34 181 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
3b34b490 182 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
dc7ac074
PP
183}
184
ca9f27f3 185static inline
3b34b490 186enum debug_info_trace_ir_mapping_status field_class_unsigned_integer_copy(
ca9f27f3
FD
187 struct trace_ir_metadata_maps *md_maps,
188 const bt_field_class *in_field_class,
189 bt_field_class *out_field_class)
190{
91bc8451 191 BT_COMP_LOGD("Copying content of unsigned integer field class: "
bc463d34 192 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
193
194 field_class_integer_set_props(in_field_class, out_field_class);
195
91bc8451 196 BT_COMP_LOGD("Copied content of unsigned integer field class: "
bc463d34 197 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
3b34b490 198 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
199}
200
201static inline
3b34b490 202enum debug_info_trace_ir_mapping_status field_class_signed_integer_copy(
ca9f27f3
FD
203 struct trace_ir_metadata_maps *md_maps,
204 const bt_field_class *in_field_class,
205 bt_field_class *out_field_class)
206{
91bc8451 207 BT_COMP_LOGD("Copying content of signed integer field class: "
bc463d34 208 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
209
210 field_class_integer_set_props(in_field_class, out_field_class);
211
91bc8451 212 BT_COMP_LOGD("Copied content of signed integer field class: "
bc463d34 213 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
3b34b490 214 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
215}
216
217BT_HIDDEN
3b34b490 218enum debug_info_trace_ir_mapping_status field_class_unsigned_enumeration_copy(
ca9f27f3
FD
219 struct trace_ir_metadata_maps *md_maps,
220 const bt_field_class *in_field_class,
221 bt_field_class *out_field_class)
222{
3b34b490 223 enum debug_info_trace_ir_mapping_status status;
ca9f27f3 224 uint64_t i, enum_mapping_count;
ca9f27f3 225
91bc8451 226 BT_COMP_LOGD("Copying content of unsigned enumeration field class: "
bc463d34 227 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
228
229 /* Copy properties of the inner integer. */
230 field_class_integer_set_props(in_field_class, out_field_class);
231
232 /* Copy all enumeration entries. */
bc463d34
FD
233 enum_mapping_count = bt_field_class_enumeration_get_mapping_count(
234 in_field_class);
ca9f27f3
FD
235 for (i = 0; i < enum_mapping_count; i++) {
236 const char *label;
45c51519 237 const bt_integer_range_set_unsigned *range_set;
9c08c816 238 const bt_field_class_enumeration_unsigned_mapping *u_mapping;
8f3ccfbc 239 const bt_field_class_enumeration_mapping *mapping;
3b34b490 240 enum bt_field_class_enumeration_add_mapping_status add_mapping_status;
ca9f27f3 241
9c08c816 242 u_mapping = bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
bc463d34 243 in_field_class, i);
9c08c816 244 mapping = bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
8f3ccfbc 245 u_mapping);
45c51519 246 label = bt_field_class_enumeration_mapping_get_label(mapping);
9c08c816 247 range_set = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
45c51519 248 u_mapping);
3b34b490 249 add_mapping_status = bt_field_class_enumeration_unsigned_add_mapping(
45c51519 250 out_field_class, label, range_set);
3b34b490
FD
251 if (add_mapping_status != BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK) {
252 status = (int) add_mapping_status;
253 goto end;
ca9f27f3
FD
254 }
255 }
256
91bc8451 257 BT_COMP_LOGD("Copied content of unsigned enumeration field class: "
bc463d34 258 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 259
3b34b490
FD
260 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
261end:
262 return status;
ca9f27f3
FD
263}
264
265static inline
3b34b490 266enum debug_info_trace_ir_mapping_status field_class_signed_enumeration_copy(
ca9f27f3
FD
267 struct trace_ir_metadata_maps *md_maps,
268 const bt_field_class *in_field_class,
269 bt_field_class *out_field_class)
270{
3b34b490 271 enum debug_info_trace_ir_mapping_status status;
ca9f27f3 272 uint64_t i, enum_mapping_count;
ca9f27f3 273
91bc8451 274 BT_COMP_LOGD("Copying content of signed enumeration field class: "
bc463d34 275 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
276
277 /* Copy properties of the inner integer. */
278 field_class_integer_set_props(in_field_class, out_field_class);
279
280 /* Copy all enumeration entries. */
281 enum_mapping_count =
282 bt_field_class_enumeration_get_mapping_count(in_field_class);
283 for (i = 0; i < enum_mapping_count; i++) {
284 const char *label;
45c51519 285 const bt_integer_range_set_signed *range_set;
9c08c816 286 const bt_field_class_enumeration_signed_mapping *s_mapping;
8f3ccfbc 287 const bt_field_class_enumeration_mapping *mapping;
3b34b490 288 enum bt_field_class_enumeration_add_mapping_status add_mapping_status;
ca9f27f3 289
9c08c816 290 s_mapping = bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
bc463d34 291 in_field_class, i);
9c08c816 292 mapping = bt_field_class_enumeration_signed_mapping_as_mapping_const(
45c51519
PP
293 s_mapping);
294 label = bt_field_class_enumeration_mapping_get_label(mapping);
9c08c816 295 range_set = bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
45c51519 296 s_mapping);
3b34b490 297 add_mapping_status = bt_field_class_enumeration_signed_add_mapping(
45c51519 298 out_field_class, label, range_set);
3b34b490
FD
299 if (add_mapping_status != BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK) {
300 status = (int) add_mapping_status;
301 goto end;
ca9f27f3
FD
302 }
303 }
304
91bc8451 305 BT_COMP_LOGD("Copied content of signed enumeration field class: "
bc463d34 306 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 307
3b34b490
FD
308 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
309end:
310 return status;
ca9f27f3
FD
311}
312
313static inline
3b34b490 314enum debug_info_trace_ir_mapping_status field_class_single_precision_real_copy(
ca9f27f3
FD
315 struct trace_ir_metadata_maps *md_maps,
316 const bt_field_class *in_field_class,
317 bt_field_class *out_field_class)
318{
fe4df857
FD
319 BT_COMP_LOGD("Copying content of single-precision real field class: "
320 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 321
fe4df857
FD
322 BT_COMP_LOGD("Copied content single-precision real field class:"
323 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 324
3b34b490 325 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
fe4df857
FD
326}
327
328static inline
3b34b490 329enum debug_info_trace_ir_mapping_status field_class_double_precision_real_copy(
fe4df857
FD
330 struct trace_ir_metadata_maps *md_maps,
331 const bt_field_class *in_field_class,
332 bt_field_class *out_field_class)
333{
334 BT_COMP_LOGD("Copying content of double-precision real field class: "
335 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
336
337 BT_COMP_LOGD("Copied content double-precision real field class:"
338 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 339
3b34b490 340 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
341}
342
343static inline
3b34b490 344enum debug_info_trace_ir_mapping_status field_class_structure_copy(
ca9f27f3
FD
345 struct trace_ir_metadata_maps *md_maps,
346 const bt_field_class *in_field_class,
347 bt_field_class *out_field_class)
348{
3b34b490 349 bt_self_component *self_comp = md_maps->self_comp;
ca9f27f3 350 uint64_t i, struct_member_count;
3b34b490 351 enum debug_info_trace_ir_mapping_status status;
ca9f27f3 352
91bc8451 353 BT_COMP_LOGD("Copying content of structure field class: "
bc463d34 354 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
355 /* Get the number of member in that struct. */
356 struct_member_count =
357 bt_field_class_structure_get_member_count(in_field_class);
358
359 /* Iterate over all the members of the struct. */
360 for (i = 0; i < struct_member_count; i++) {
3b34b490 361 enum bt_field_class_structure_append_member_status append_member_status;
ce45f74a
PP
362 const bt_field_class_structure_member *in_member;
363 bt_field_class_structure_member *out_member;
ca9f27f3 364 const char *member_name;
ce45f74a 365 const bt_field_class *in_member_fc;
3b34b490 366 bt_field_class *out_member_fc;
ca9f27f3 367
ce45f74a 368 in_member = bt_field_class_structure_borrow_member_by_index_const(
1e6fd1d7 369 in_field_class, i);
ce45f74a
PP
370 in_member_fc = bt_field_class_structure_member_borrow_field_class_const(
371 in_member);
372 member_name = bt_field_class_structure_member_get_name(in_member);
3b34b490
FD
373 BT_COMP_LOGD("Copying structure field class's member: "
374 "index=%" PRId64 ", member-fc-addr=%p, member-name=\"%s\"",
ce45f74a 375 i, in_member_fc, member_name);
ca9f27f3 376
3b34b490
FD
377 out_member_fc = create_field_class_copy(md_maps, in_member_fc);
378 if (!out_member_fc) {
379 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy structure field class's member: "
380 "index=%" PRId64 ", in-member-fc-addr=%p, "
381 "member-name=\"%s\"", i, in_member_fc,
382 member_name);
383 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
384 goto end;
ca9f27f3 385 }
3b34b490
FD
386
387 status = copy_field_class_content(md_maps, in_member_fc,
388 out_member_fc);
389 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
390 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy content of structure field class's member: "
391 "index=%" PRId64 ", in-member-fc-addr=%p, "
392 "member-name=\"%s\"", i, in_member_fc,
393 member_name);
394 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc);
395 goto end;
ca9f27f3
FD
396 }
397
3b34b490
FD
398 append_member_status = bt_field_class_structure_append_member(out_field_class,
399 member_name, out_member_fc);
400 if (append_member_status !=
d24d5663 401 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
3b34b490
FD
402 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append structure field class's field: "
403 "index=%" PRId64 ", field-fc-addr=%p, "
404 "field-name=\"%s\"", i, in_member_fc,
405 member_name);
406 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc);
407 status = (int) append_member_status;
408 goto end;
ca9f27f3 409 }
ce45f74a
PP
410
411 out_member = bt_field_class_structure_borrow_member_by_index(
412 out_field_class, i);
413 BT_ASSERT(out_member);
414
415 /*
416 * Safe to use the same value object because it's frozen
417 * at this point.
418 */
419 bt_field_class_structure_member_set_user_attributes(
420 out_member,
421 bt_field_class_structure_member_borrow_user_attributes_const(
422 in_member));
ca9f27f3
FD
423 }
424
91bc8451 425 BT_COMP_LOGD("Copied structure field class: original-fc-addr=%p, copy-fc-addr=%p",
ca9f27f3
FD
426 in_field_class, out_field_class);
427
3b34b490
FD
428 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
429end:
430 return status;
ca9f27f3
FD
431}
432
433static inline
3b34b490 434enum debug_info_trace_ir_mapping_status field_class_variant_copy(
ca9f27f3
FD
435 struct trace_ir_metadata_maps *md_maps,
436 const bt_field_class *in_field_class,
437 bt_field_class *out_field_class)
438{
3b34b490
FD
439 bt_self_component *self_comp = md_maps->self_comp;
440 enum debug_info_trace_ir_mapping_status status;
1ec009b2 441 bt_field_class *out_tag_field_class = NULL;
ca9f27f3 442 uint64_t i, variant_option_count;
45c51519 443 bt_field_class_type fc_type = bt_field_class_get_type(in_field_class);
ca9f27f3 444
91bc8451 445 BT_COMP_LOGD("Copying content of variant field class: "
bc463d34 446 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
447 variant_option_count =
448 bt_field_class_variant_get_option_count(in_field_class);
449 for (i = 0; i < variant_option_count; i++) {
ce45f74a 450 const bt_field_class *in_option_fc;
ca9f27f3 451 const char *option_name;
3b34b490 452 bt_field_class *out_option_fc;
ce45f74a
PP
453 const bt_field_class_variant_option *in_option;
454 bt_field_class_variant_option *out_option;
ca9f27f3 455
ce45f74a 456 in_option = bt_field_class_variant_borrow_option_by_index_const(
1e6fd1d7 457 in_field_class, i);
ce45f74a
PP
458 in_option_fc = bt_field_class_variant_option_borrow_field_class_const(
459 in_option);
460 option_name = bt_field_class_variant_option_get_name(in_option);
3b34b490
FD
461
462 out_option_fc = create_field_class_copy_internal(
463 md_maps, in_option_fc);
464 if (!out_option_fc) {
465 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy variant option field class: "
466 "in-option-fc=%p, in-option-name=\"%s\"",
467 in_option_fc, option_name);
468 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
469 goto end;
ca9f27f3 470 }
3b34b490
FD
471
472 status = copy_field_class_content_internal(md_maps, in_option_fc,
473 out_option_fc);
474 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
475 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error copying content of variant option field class: "
476 "in-option-fc=%p, in-option-name=\"%s\"",
477 in_option_fc, option_name);
478 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_option_fc);
479 goto end;
ca9f27f3
FD
480 }
481
de821fe5
PP
482 if (fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD) {
483 const bt_field_class_variant_with_selector_field_integer_unsigned_option *spec_opt =
484 bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const(
45c51519
PP
485 in_field_class, i);
486 const bt_integer_range_set_unsigned *ranges =
de821fe5 487 bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const(
45c51519 488 spec_opt);
3b34b490
FD
489 enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status =
490 bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
45c51519 491 out_field_class, option_name,
3b34b490
FD
492 out_option_fc, ranges);
493
494 if (append_opt_status !=
de821fe5 495 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
3b34b490
FD
496 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class with unsigned integer selector"
497 "out-fc-addr=%p, out-option-fc-addr=%p, "
498 "out-option-name=\"%s\"", out_field_class,
499 out_option_fc, option_name);
45c51519 500 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
3b34b490
FD
501 status = (int) append_opt_status;
502 goto end;
45c51519 503 }
de821fe5
PP
504 } else if (fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD) {
505 const bt_field_class_variant_with_selector_field_integer_signed_option *spec_opt =
506 bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const(
45c51519
PP
507 in_field_class, i);
508 const bt_integer_range_set_signed *ranges =
de821fe5 509 bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const(
45c51519
PP
510 spec_opt);
511
3b34b490
FD
512 enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status =
513 bt_field_class_variant_with_selector_field_integer_signed_append_option(
45c51519 514 out_field_class, option_name,
3b34b490
FD
515 out_option_fc, ranges);
516 if (append_opt_status !=
de821fe5 517 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
3b34b490
FD
518 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class with signed integer selector"
519 "out-fc-addr=%p, out-option-fc-addr=%p, "
520 "out-option-name=\"%s\"", out_field_class,
521 out_option_fc, option_name);
45c51519 522 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
3b34b490
FD
523 status = (int) append_opt_status;
524 goto end;
45c51519
PP
525 }
526 } else {
de821fe5 527 BT_ASSERT(fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD);
45c51519 528
3b34b490
FD
529 enum bt_field_class_variant_without_selector_append_option_status append_opt_status =
530 bt_field_class_variant_without_selector_append_option(
45c51519 531 out_field_class, option_name,
3b34b490
FD
532 out_option_fc);
533 if (append_opt_status !=
de821fe5 534 BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
3b34b490
FD
535 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class"
536 "out-fc-addr=%p, out-option-fc-addr=%p, "
537 "out-option-name=\"%s\"", out_field_class,
538 out_option_fc, option_name);
45c51519 539 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
3b34b490
FD
540 status = (int) append_opt_status;
541 goto end;
45c51519 542 }
ca9f27f3 543 }
ce45f74a
PP
544
545 out_option = bt_field_class_variant_borrow_option_by_index(
546 out_field_class, i);
547 BT_ASSERT(out_option);
548
549 /*
550 * Safe to use the same value object because it's frozen
551 * at this point.
552 */
553 bt_field_class_variant_option_set_user_attributes(
554 out_option,
555 bt_field_class_variant_option_borrow_user_attributes_const(
556 in_option));
ca9f27f3
FD
557 }
558
91bc8451 559 BT_COMP_LOGD("Copied content of variant field class: in-fc-addr=%p, "
ca9f27f3 560 "out-fc-addr=%p", in_field_class, out_field_class);
3b34b490
FD
561 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
562end:
563 return status;
ca9f27f3
FD
564}
565
566static inline
3b34b490 567enum debug_info_trace_ir_mapping_status field_class_static_array_copy(
ca9f27f3
FD
568 struct trace_ir_metadata_maps *md_maps,
569 const bt_field_class *in_field_class,
570 bt_field_class *out_field_class)
571{
91bc8451 572 BT_COMP_LOGD("Copying content of static array field class: in-fc-addr=%p, "
bc463d34 573 "out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
574 /*
575 * There is no content to copy. Keep this function call anyway for
576 * logging purposes.
577 */
91bc8451 578 BT_COMP_LOGD("Copied content of static array field class: in-fc-addr=%p, "
bc463d34 579 "out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 580
3b34b490 581 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
582}
583
584static inline
3b34b490 585enum debug_info_trace_ir_mapping_status field_class_dynamic_array_copy(
ca9f27f3
FD
586 struct trace_ir_metadata_maps *md_maps,
587 const bt_field_class *in_field_class,
588 bt_field_class *out_field_class)
589{
91bc8451 590 BT_COMP_LOGD("Copying content of dynamic array field class: "
bc463d34 591 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
1367bc7c
PP
592 /*
593 * There is no content to copy. Keep this function call anyway for
594 * logging purposes.
595 */
bc463d34
FD
596 BT_COMP_LOGD("Copied content of dynamic array field class: "
597 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 598
3b34b490 599 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
600}
601
f29ef814 602static inline
3b34b490 603enum debug_info_trace_ir_mapping_status field_class_option_copy(
f29ef814
PP
604 struct trace_ir_metadata_maps *md_maps,
605 const bt_field_class *in_field_class,
606 bt_field_class *out_field_class)
607{
608 BT_COMP_LOGD("Copying content of option field class: "
bc463d34 609 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
f29ef814 610
0aa006b7 611 if (bt_field_class_get_type(out_field_class) ==
de821fe5
PP
612 BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD) {
613 bt_field_class_option_with_selector_field_bool_set_selector_is_reversed(
0aa006b7 614 out_field_class,
de821fe5 615 bt_field_class_option_with_selector_field_bool_selector_is_reversed(
0aa006b7
PP
616 in_field_class));
617 }
618
bc463d34
FD
619 BT_COMP_LOGD("Copied content of option field class: "
620 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
f29ef814 621
3b34b490 622 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
f29ef814
PP
623}
624
ca9f27f3 625static inline
3b34b490
FD
626enum debug_info_trace_ir_mapping_status field_class_string_copy(
627 struct trace_ir_metadata_maps *md_maps,
ca9f27f3
FD
628 const bt_field_class *in_field_class,
629 bt_field_class *out_field_class)
630{
91bc8451 631 BT_COMP_LOGD("Copying content of string field class: in-fc-addr=%p, "
bc463d34 632 "out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3
FD
633 /*
634 * There is no content to copy. Keep this function call anyway for
635 * logging purposes.
636 */
91bc8451 637 BT_COMP_LOGD("Copied content of string field class: in-fc-addr=%p, "
bc463d34 638 "out-fc-addr=%p", in_field_class, out_field_class);
ca9f27f3 639
3b34b490 640 return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
641}
642
643static
3b34b490
FD
644bt_field_class *copy_field_class_array_element(
645 struct trace_ir_metadata_maps *md_maps,
ca9f27f3
FD
646 const bt_field_class *in_elem_fc)
647{
3b34b490 648 bt_self_component *self_comp = md_maps->self_comp;
ca9f27f3
FD
649 bt_field_class *out_elem_fc =
650 create_field_class_copy_internal(md_maps, in_elem_fc);
651 if (!out_elem_fc) {
3b34b490
FD
652 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
653 "Error creating output elem field class from input elem field class for static array: "
bc463d34 654 "in-fc-addr=%p", in_elem_fc);
3b34b490 655 goto end;
ca9f27f3
FD
656 }
657
3b34b490
FD
658 if (copy_field_class_content_internal(md_maps, in_elem_fc, out_elem_fc) !=
659 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
660 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
661 "Error creating output elem field class from input elem field class for static array: "
bc463d34 662 "in-fc-addr=%p", in_elem_fc);
ca9f27f3 663 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_elem_fc);
3b34b490 664 goto end;
ca9f27f3
FD
665 }
666
3b34b490 667end:
ca9f27f3
FD
668 return out_elem_fc;
669}
670
671BT_HIDDEN
3b34b490
FD
672bt_field_class *create_field_class_copy_internal(
673 struct trace_ir_metadata_maps *md_maps,
ca9f27f3
FD
674 const bt_field_class *in_field_class)
675{
3b34b490
FD
676 bt_self_component *self_comp = md_maps->self_comp;
677 enum debug_info_trace_ir_mapping_status status;
ca9f27f3 678 bt_field_class *out_field_class = NULL;
45c51519 679 bt_field_class_type fc_type = bt_field_class_get_type(in_field_class);
ca9f27f3 680
91bc8451 681 BT_COMP_LOGD("Creating bare field class based on field class: in-fc-addr=%p",
bc463d34 682 in_field_class);
ca9f27f3 683
45c51519 684 switch (fc_type) {
f7cfbcc3
PP
685 case BT_FIELD_CLASS_TYPE_BOOL:
686 out_field_class = bt_field_class_bool_create(
bc463d34 687 md_maps->output_trace_class);
f7cfbcc3 688 break;
dc7ac074
PP
689 case BT_FIELD_CLASS_TYPE_BIT_ARRAY:
690 out_field_class = bt_field_class_bit_array_create(
bc463d34
FD
691 md_maps->output_trace_class,
692 bt_field_class_bit_array_get_length(
693 in_field_class));
dc7ac074 694 break;
ca9f27f3 695 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
9c08c816 696 out_field_class = bt_field_class_integer_unsigned_create(
bc463d34 697 md_maps->output_trace_class);
ca9f27f3
FD
698 break;
699 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
9c08c816 700 out_field_class = bt_field_class_integer_signed_create(
bc463d34 701 md_maps->output_trace_class);
ca9f27f3
FD
702 break;
703 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
9c08c816 704 out_field_class = bt_field_class_enumeration_unsigned_create(
bc463d34 705 md_maps->output_trace_class);
ca9f27f3
FD
706 break;
707 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION:
9c08c816 708 out_field_class = bt_field_class_enumeration_signed_create(
bc463d34 709 md_maps->output_trace_class);
ca9f27f3 710 break;
fe4df857
FD
711 case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL:
712 out_field_class = bt_field_class_real_single_precision_create(
bc463d34 713 md_maps->output_trace_class);
fe4df857
FD
714 break;
715 case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL:
716 out_field_class = bt_field_class_real_double_precision_create(
bc463d34 717 md_maps->output_trace_class);
ca9f27f3
FD
718 break;
719 case BT_FIELD_CLASS_TYPE_STRING:
720 out_field_class = bt_field_class_string_create(
bc463d34 721 md_maps->output_trace_class);
ca9f27f3
FD
722 break;
723 case BT_FIELD_CLASS_TYPE_STRUCTURE:
724 out_field_class = bt_field_class_structure_create(
bc463d34 725 md_maps->output_trace_class);
ca9f27f3
FD
726 break;
727 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
728 {
729 const bt_field_class *in_elem_fc =
730 bt_field_class_array_borrow_element_field_class_const(
731 in_field_class);
bc463d34
FD
732 uint64_t array_len = bt_field_class_array_static_get_length(
733 in_field_class);
ca9f27f3
FD
734
735 bt_field_class *out_elem_fc = copy_field_class_array_element(
736 md_maps, in_elem_fc);
737 if (!out_elem_fc) {
738 out_field_class = NULL;
739 goto error;
740 }
741
9c08c816 742 out_field_class = bt_field_class_array_static_create(
bc463d34
FD
743 md_maps->output_trace_class,
744 out_elem_fc, array_len);
ca9f27f3
FD
745 break;
746 }
ebdb6693
PP
747 default:
748 break;
749 }
750
751 if (bt_field_class_type_is(fc_type,
752 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY)) {
ca9f27f3
FD
753 const bt_field_class *in_elem_fc =
754 bt_field_class_array_borrow_element_field_class_const(
755 in_field_class);
1367bc7c 756 bt_field_class *out_length_fc = NULL;
ca9f27f3 757 bt_field_class *out_elem_fc = copy_field_class_array_element(
1367bc7c 758 md_maps, in_elem_fc);
81b8fa44 759
ca9f27f3
FD
760 if (!out_elem_fc) {
761 out_field_class = NULL;
762 goto error;
763 }
764
81b8fa44
PP
765 if (fc_type == BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD) {
766 const bt_field_path *length_fp =
767 bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(
768 in_field_class);
1367bc7c
PP
769 const bt_field_class *in_length_fc =
770 resolve_field_path_to_field_class(length_fp,
771 md_maps);
772
773 BT_ASSERT(in_length_fc);
774 out_length_fc = g_hash_table_lookup(md_maps->field_class_map,
775 in_length_fc);
776 BT_ASSERT(out_length_fc);
777 }
778
9c08c816 779 out_field_class = bt_field_class_array_dynamic_create(
3b34b490
FD
780 md_maps->output_trace_class, out_elem_fc, out_length_fc);
781 } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_OPTION)) {
f29ef814
PP
782 const bt_field_class *in_content_fc =
783 bt_field_class_option_borrow_field_class_const(
bc463d34 784 in_field_class);
f29ef814
PP
785 bt_field_class *out_selector_fc = NULL;
786 bt_field_class *out_content_fc;
f29ef814
PP
787
788 out_content_fc = create_field_class_copy_internal(
bc463d34 789 md_maps, in_content_fc);
f29ef814 790 if (!out_content_fc) {
3b34b490
FD
791 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
792 "Cannot copy option's content field class: "
793 "in-content-fc-addr=%p", in_content_fc);
f29ef814
PP
794 goto error;
795 }
796
3b34b490 797 status = copy_field_class_content_internal(md_maps,
f29ef814 798 in_content_fc, out_content_fc);
3b34b490
FD
799 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
800 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
801 "Error copying content of option's content field class: "
802 "in-content-fc-addr=%p, out-content-fc-addr=%p",
803 in_content_fc, out_content_fc);
804 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_content_fc);
f29ef814
PP
805 goto error;
806 }
807
de821fe5 808 if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD) {
0aa006b7
PP
809 out_field_class =
810 bt_field_class_option_without_selector_create(
811 md_maps->output_trace_class,
812 out_content_fc);
813 } else {
814 const bt_field_path *in_selector_fp =
de821fe5 815 bt_field_class_option_with_selector_field_borrow_selector_field_path_const(
0aa006b7
PP
816 in_field_class);
817 const bt_field_class *in_selector_fc;
f29ef814 818
0aa006b7
PP
819 BT_ASSERT(in_selector_fp);
820 in_selector_fc = resolve_field_path_to_field_class(
821 in_selector_fp, md_maps);
f29ef814
PP
822 BT_ASSERT(in_selector_fc);
823 out_selector_fc = g_hash_table_lookup(
824 md_maps->field_class_map, in_selector_fc);
825 BT_ASSERT(out_selector_fc);
0aa006b7 826
de821fe5 827 if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD) {
0aa006b7 828 out_field_class =
de821fe5 829 bt_field_class_option_with_selector_field_bool_create(
0aa006b7
PP
830 md_maps->output_trace_class,
831 out_content_fc, out_selector_fc);
de821fe5 832 } else if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD) {
0aa006b7 833 const bt_integer_range_set_unsigned *ranges =
de821fe5 834 bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const(
0aa006b7
PP
835 in_field_class);
836
837 BT_ASSERT(ranges);
838 out_field_class =
de821fe5 839 bt_field_class_option_with_selector_field_integer_unsigned_create(
0aa006b7
PP
840 md_maps->output_trace_class,
841 out_content_fc, out_selector_fc,
842 ranges);
de821fe5 843 } else if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD) {
0aa006b7 844 const bt_integer_range_set_signed *ranges =
de821fe5 845 bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const(
0aa006b7
PP
846 in_field_class);
847
848 BT_ASSERT(ranges);
849 out_field_class =
de821fe5 850 bt_field_class_option_with_selector_field_integer_signed_create(
0aa006b7
PP
851 md_maps->output_trace_class,
852 out_content_fc, out_selector_fc,
853 ranges);
854 }
f29ef814 855 }
ebdb6693
PP
856 } else if (bt_field_class_type_is(fc_type,
857 BT_FIELD_CLASS_TYPE_VARIANT)) {
45c51519
PP
858 bt_field_class *out_sel_fc = NULL;
859
ebdb6693
PP
860 if (bt_field_class_type_is(fc_type,
861 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD)) {
45c51519
PP
862 const bt_field_class *in_sel_fc;
863 const bt_field_path *sel_fp =
de821fe5 864 bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(
45c51519
PP
865 in_field_class);
866
867 BT_ASSERT(sel_fp);
868 in_sel_fc = resolve_field_path_to_field_class(sel_fp,
869 md_maps);
870 BT_ASSERT(in_sel_fc);
871 out_sel_fc = g_hash_table_lookup(
872 md_maps->field_class_map, in_sel_fc);
873 BT_ASSERT(out_sel_fc);
874 }
875
ca9f27f3 876 out_field_class = bt_field_class_variant_create(
45c51519 877 md_maps->output_trace_class, out_sel_fc);
ca9f27f3
FD
878 }
879
880 /*
881 * Add mapping from in_field_class to out_field_class. This simplifies
882 * the resolution of field paths in variant and dynamic array field
883 * classes.
884 */
ebdb6693 885 BT_ASSERT(out_field_class);
ca9f27f3 886 g_hash_table_insert(md_maps->field_class_map,
bc463d34 887 (gpointer) in_field_class, out_field_class);
ca9f27f3
FD
888
889error:
890 if(out_field_class){
91bc8451 891 BT_COMP_LOGD("Created bare field class based on field class: in-fc-addr=%p, "
ca9f27f3
FD
892 "out-fc-addr=%p", in_field_class, out_field_class);
893 } else {
3b34b490
FD
894 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
895 "Error creating output field class from input field class: "
896 "in-fc-addr=%p", in_field_class);
ca9f27f3
FD
897 }
898
899 return out_field_class;
900}
901
902BT_HIDDEN
3b34b490 903enum debug_info_trace_ir_mapping_status copy_field_class_content_internal(
ca9f27f3
FD
904 struct trace_ir_metadata_maps *md_maps,
905 const bt_field_class *in_field_class,
906 bt_field_class *out_field_class)
907{
3b34b490 908 enum debug_info_trace_ir_mapping_status status;
ebdb6693
PP
909 bt_field_class_type in_fc_type =
910 bt_field_class_get_type(in_field_class);
ce45f74a
PP
911
912 /*
913 * Safe to use the same value object because it's frozen at this
914 * point.
915 */
916 bt_field_class_set_user_attributes(out_field_class,
917 bt_field_class_borrow_user_attributes_const(in_field_class));
918
ebdb6693 919 if (in_fc_type == BT_FIELD_CLASS_TYPE_BOOL) {
3b34b490
FD
920 status = field_class_bool_copy(md_maps,
921 in_field_class, out_field_class);
ebdb6693 922 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_BIT_ARRAY) {
3b34b490
FD
923 status = field_class_bit_array_copy(md_maps,
924 in_field_class, out_field_class);
ebdb6693 925 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER) {
3b34b490
FD
926 status = field_class_unsigned_integer_copy(md_maps,
927 in_field_class, out_field_class);
ebdb6693 928 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SIGNED_INTEGER) {
3b34b490
FD
929 status = field_class_signed_integer_copy(md_maps,
930 in_field_class, out_field_class);
ebdb6693 931 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
3b34b490
FD
932 status = field_class_unsigned_enumeration_copy(md_maps,
933 in_field_class, out_field_class);
ebdb6693 934 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
3b34b490
FD
935 status = field_class_signed_enumeration_copy(md_maps,
936 in_field_class, out_field_class);
ebdb6693 937 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL) {
3b34b490
FD
938 status = field_class_single_precision_real_copy(md_maps,
939 in_field_class, out_field_class);
ebdb6693 940 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL) {
3b34b490
FD
941 status = field_class_double_precision_real_copy(md_maps,
942 in_field_class, out_field_class);
ebdb6693 943 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STRING) {
3b34b490
FD
944 status = field_class_string_copy(md_maps,
945 in_field_class, out_field_class);
ebdb6693 946 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STRUCTURE) {
3b34b490
FD
947 status = field_class_structure_copy(md_maps,
948 in_field_class, out_field_class);
ebdb6693 949 } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STATIC_ARRAY) {
3b34b490
FD
950 status = field_class_static_array_copy(md_maps,
951 in_field_class, out_field_class);
ebdb6693
PP
952 } else if (bt_field_class_type_is(in_fc_type,
953 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY)) {
3b34b490
FD
954 status = field_class_dynamic_array_copy(md_maps,
955 in_field_class, out_field_class);
ebdb6693
PP
956 } else if (bt_field_class_type_is(in_fc_type,
957 BT_FIELD_CLASS_TYPE_OPTION)) {
3b34b490
FD
958 status = field_class_option_copy(md_maps,
959 in_field_class, out_field_class);
ebdb6693
PP
960 } else if (bt_field_class_type_is(in_fc_type,
961 BT_FIELD_CLASS_TYPE_VARIANT)) {
3b34b490
FD
962 status = field_class_variant_copy(md_maps,
963 in_field_class, out_field_class);
ebdb6693 964 } else {
ca9f27f3
FD
965 abort();
966 }
967
3b34b490 968 return status;
ca9f27f3 969}
This page took 0.092589 seconds and 4 git commands to generate.