Visibility hidden by default
[babeltrace.git] / src / plugins / lttng-utils / debug-info / trace-ir-metadata-field-class-copy.c
index 79da94e1171d3cdd12edf86d333cf0d8fe86178e..68504d2be61e541c5044f3e408b6f4944f60f9a4 100644 (file)
@@ -1,27 +1,11 @@
 /*
- * Babeltrace - Trace IR field copy
+ * SPDX-License-Identifier: MIT
  *
  * Copyright (c) 2015-2019 EfficiOS Inc. and Linux Foundation
  * Copyright (c) 2018 Philippe Proulx <pproulx@efficios.com>
  * Copyright (c) 2019 Francis Deslauriers <francis.deslauriers@efficios.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
+ * Babeltrace - Trace IR field copy
  */
 
 #define BT_COMP_LOG_SELF_COMP (md_maps->self_comp)
@@ -60,9 +44,7 @@ const bt_field_class *walk_field_path(struct trace_ir_metadata_maps *md_maps,
                const bt_field_path_item *fp_item =
                        bt_field_path_borrow_item_by_index_const(fp, i);
 
-               switch (fc_type) {
-               case BT_FIELD_CLASS_TYPE_STRUCTURE:
-               {
+               if (fc_type == BT_FIELD_CLASS_TYPE_STRUCTURE) {
                        const bt_field_class_structure_member *member;
 
                        BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
@@ -72,23 +54,13 @@ const bt_field_class *walk_field_path(struct trace_ir_metadata_maps *md_maps,
                                bt_field_path_item_index_get_index(fp_item));
                        curr_fc = bt_field_class_structure_member_borrow_field_class_const(
                                member);
-                       break;
-               }
-               case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD:
-               case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD:
-               case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-               case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-               {
+               } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_OPTION)) {
                        BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
                                BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT);
                        curr_fc = bt_field_class_option_borrow_field_class_const(
                                curr_fc);
-                       break;
-               }
-               case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD:
-               case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-               case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-               {
+
+               } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_VARIANT)) {
                        const bt_field_class_variant_option *option;
 
                        BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
@@ -99,19 +71,14 @@ const bt_field_class *walk_field_path(struct trace_ir_metadata_maps *md_maps,
                        curr_fc = bt_field_class_variant_option_borrow_field_class_const(
                                option);
                        break;
-               }
-               case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
-               case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD:
-               case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD:
-               {
+               } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_ARRAY)) {
                        BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
                                BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT);
                        curr_fc = bt_field_class_array_borrow_element_field_class_const(
                                curr_fc);
                        break;
-               }
-               default:
-                       abort();
+               } else {
+                       bt_common_abort();
                }
        }
 
@@ -149,7 +116,7 @@ const bt_field_class *resolve_field_path_to_field_class(const bt_field_path *fp,
                        fc_resolving_ctx->event_payload);
                break;
        default:
-               abort();
+               bt_common_abort();
        }
 
        return fc;
@@ -166,7 +133,8 @@ void field_class_integer_set_props(const bt_field_class *input_fc,
 }
 
 static inline
-int field_class_bool_copy(struct trace_ir_metadata_maps *md_maps,
+enum debug_info_trace_ir_mapping_status field_class_bool_copy(
+               struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
@@ -178,11 +146,11 @@ int field_class_bool_copy(struct trace_ir_metadata_maps *md_maps,
         */
        BT_COMP_LOGD("Copied content of boolean field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_bit_array_copy(
+enum debug_info_trace_ir_mapping_status field_class_bit_array_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -195,11 +163,11 @@ int field_class_bit_array_copy(
         */
        BT_COMP_LOGD("Copied content of bit array field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_unsigned_integer_copy(
+enum debug_info_trace_ir_mapping_status field_class_unsigned_integer_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -211,11 +179,11 @@ int field_class_unsigned_integer_copy(
 
        BT_COMP_LOGD("Copied content of unsigned integer field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_signed_integer_copy(
+enum debug_info_trace_ir_mapping_status field_class_signed_integer_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -227,17 +195,17 @@ int field_class_signed_integer_copy(
 
        BT_COMP_LOGD("Copied content of signed integer field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
-BT_HIDDEN
-int field_class_unsigned_enumeration_copy(
+static
+enum debug_info_trace_ir_mapping_status field_class_unsigned_enumeration_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
+       enum debug_info_trace_ir_mapping_status status;
        uint64_t i, enum_mapping_count;
-       int ret = 0;
 
        BT_COMP_LOGD("Copying content of unsigned enumeration field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
@@ -253,6 +221,7 @@ int field_class_unsigned_enumeration_copy(
                const bt_integer_range_set_unsigned *range_set;
                const bt_field_class_enumeration_unsigned_mapping *u_mapping;
                const bt_field_class_enumeration_mapping *mapping;
+               enum bt_field_class_enumeration_add_mapping_status add_mapping_status;
 
                u_mapping = bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
                        in_field_class, i);
@@ -261,28 +230,30 @@ int field_class_unsigned_enumeration_copy(
                label = bt_field_class_enumeration_mapping_get_label(mapping);
                range_set = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
                        u_mapping);
-               ret = bt_field_class_enumeration_unsigned_add_mapping(
+               add_mapping_status = bt_field_class_enumeration_unsigned_add_mapping(
                        out_field_class, label, range_set);
-               if (ret) {
-                       goto error;
+               if (add_mapping_status != BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK) {
+                       status = (int) add_mapping_status;
+                       goto end;
                }
        }
 
        BT_COMP_LOGD("Copied content of unsigned enumeration field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-error:
-       return ret;
+       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
+end:
+       return status;
 }
 
 static inline
-int field_class_signed_enumeration_copy(
+enum debug_info_trace_ir_mapping_status field_class_signed_enumeration_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
+       enum debug_info_trace_ir_mapping_status status;
        uint64_t i, enum_mapping_count;
-       int ret = 0;
 
        BT_COMP_LOGD("Copying content of signed enumeration field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
@@ -298,6 +269,7 @@ int field_class_signed_enumeration_copy(
                const bt_integer_range_set_signed *range_set;
                const bt_field_class_enumeration_signed_mapping *s_mapping;
                const bt_field_class_enumeration_mapping *mapping;
+               enum bt_field_class_enumeration_add_mapping_status add_mapping_status;
 
                s_mapping = bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
                        in_field_class, i);
@@ -306,22 +278,24 @@ int field_class_signed_enumeration_copy(
                label = bt_field_class_enumeration_mapping_get_label(mapping);
                range_set = bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
                        s_mapping);
-               ret = bt_field_class_enumeration_signed_add_mapping(
+               add_mapping_status = bt_field_class_enumeration_signed_add_mapping(
                        out_field_class, label, range_set);
-               if (ret) {
-                       goto error;
+               if (add_mapping_status != BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK) {
+                       status = (int) add_mapping_status;
+                       goto end;
                }
        }
 
        BT_COMP_LOGD("Copied content of signed enumeration field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-error:
-       return ret;
+       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
+end:
+       return status;
 }
 
 static inline
-int field_class_single_precision_real_copy(
+enum debug_info_trace_ir_mapping_status field_class_single_precision_real_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -332,11 +306,11 @@ int field_class_single_precision_real_copy(
        BT_COMP_LOGD("Copied content single-precision real field class:"
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_double_precision_real_copy(
+enum debug_info_trace_ir_mapping_status field_class_double_precision_real_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -347,17 +321,18 @@ int field_class_double_precision_real_copy(
        BT_COMP_LOGD("Copied content double-precision real field class:"
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_structure_copy(
+enum debug_info_trace_ir_mapping_status field_class_structure_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
+       bt_self_component *self_comp = md_maps->self_comp;
        uint64_t i, struct_member_count;
-       int ret = 0;
+       enum debug_info_trace_ir_mapping_status status;
 
        BT_COMP_LOGD("Copying content of structure field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
@@ -367,46 +342,54 @@ int field_class_structure_copy(
 
        /* Iterate over all the members of the struct. */
        for (i = 0; i < struct_member_count; i++) {
+               enum bt_field_class_structure_append_member_status append_member_status;
                const bt_field_class_structure_member *in_member;
                bt_field_class_structure_member *out_member;
                const char *member_name;
                const bt_field_class *in_member_fc;
-               bt_field_class *out_member_field_class;
+               bt_field_class *out_member_fc;
 
                in_member = bt_field_class_structure_borrow_member_by_index_const(
                        in_field_class, i);
                in_member_fc = bt_field_class_structure_member_borrow_field_class_const(
                        in_member);
                member_name = bt_field_class_structure_member_get_name(in_member);
-               BT_COMP_LOGD("Copying structure field class's field: "
-                       "index=%" PRId64 ", member-fc-addr=%p, field-name=\"%s\"",
+               BT_COMP_LOGD("Copying structure field class's member: "
+                       "index=%" PRId64 ", member-fc-addr=%p, member-name=\"%s\"",
                        i, in_member_fc, member_name);
 
-               out_member_field_class = create_field_class_copy(md_maps,
-                               in_member_fc);
-               if (!out_member_field_class) {
-                       BT_COMP_LOGE("Cannot copy structure field class's field: "
-                               "index=%" PRId64 ", field-fc-addr=%p, field-name=\"%s\"",
-                               i, in_member_fc, member_name);
-                       ret = -1;
-                       goto error;
+               out_member_fc = create_field_class_copy(md_maps, in_member_fc);
+               if (!out_member_fc) {
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy structure field class's member: "
+                               "index=%" PRId64 ", in-member-fc-addr=%p, "
+                               "member-name=\"%s\"", i, in_member_fc,
+                               member_name);
+                       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
+                       goto end;
                }
-               ret = copy_field_class_content(md_maps, in_member_fc,
-                               out_member_field_class);
-               if (ret) {
-                       goto error;
+
+               status = copy_field_class_content(md_maps, in_member_fc,
+                       out_member_fc);
+               if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy content of structure field class's member: "
+                               "index=%" PRId64 ", in-member-fc-addr=%p, "
+                               "member-name=\"%s\"", i, in_member_fc,
+                               member_name);
+                       BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc);
+                       goto end;
                }
 
-               if (bt_field_class_structure_append_member(out_field_class,
-                               member_name, out_member_field_class) !=
+               append_member_status = bt_field_class_structure_append_member(out_field_class,
+                               member_name, out_member_fc);
+               if (append_member_status !=
                                BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
-                       BT_COMP_LOGE("Cannot append structure field class's field: "
-                               "index=%" PRId64 ", "
-                               "field-fc-addr=%p, field-name=\"%s\"",
-                               i, in_member_fc, member_name);
-                       BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_field_class);
-                       ret = -1;
-                       goto error;
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append structure field class's field: "
+                               "index=%" PRId64 ", field-fc-addr=%p, "
+                               "field-name=\"%s\"", i, in_member_fc,
+                               member_name);
+                       BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_fc);
+                       status = (int) append_member_status;
+                       goto end;
                }
 
                out_member = bt_field_class_structure_borrow_member_by_index(
@@ -426,20 +409,22 @@ int field_class_structure_copy(
        BT_COMP_LOGD("Copied structure field class: original-fc-addr=%p, copy-fc-addr=%p",
                in_field_class, out_field_class);
 
-error:
-       return ret;
+       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
+end:
+       return status;
 }
 
 static inline
-int field_class_variant_copy(
+enum debug_info_trace_ir_mapping_status field_class_variant_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
+       bt_self_component *self_comp = md_maps->self_comp;
+       enum debug_info_trace_ir_mapping_status status;
        bt_field_class *out_tag_field_class = NULL;
        uint64_t i, variant_option_count;
        bt_field_class_type fc_type = bt_field_class_get_type(in_field_class);
-       int ret = 0;
 
        BT_COMP_LOGD("Copying content of variant field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
@@ -448,7 +433,7 @@ int field_class_variant_copy(
        for (i = 0; i < variant_option_count; i++) {
                const bt_field_class *in_option_fc;
                const char *option_name;
-               bt_field_class *out_option_field_class;
+               bt_field_class *out_option_fc;
                const bt_field_class_variant_option *in_option;
                bt_field_class_variant_option *out_option;
 
@@ -457,19 +442,25 @@ int field_class_variant_copy(
                in_option_fc = bt_field_class_variant_option_borrow_field_class_const(
                        in_option);
                option_name = bt_field_class_variant_option_get_name(in_option);
-               out_option_field_class = create_field_class_copy_internal(
-                               md_maps, in_option_fc);
-               if (!out_option_field_class) {
-                       BT_COMP_LOGE_STR("Cannot copy field class.");
-                       ret = -1;
-                       goto error;
+
+               out_option_fc = create_field_class_copy_internal(
+                       md_maps, in_option_fc);
+               if (!out_option_fc) {
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot copy variant option field class: "
+                               "in-option-fc=%p, in-option-name=\"%s\"",
+                               in_option_fc, option_name);
+                       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
+                       goto end;
                }
-               ret = copy_field_class_content_internal(md_maps, in_option_fc,
-                       out_option_field_class);
-               if (ret) {
-                       BT_COMP_LOGE_STR("Error copying content of option variant "
-                                       "field class'");
-                       goto error;
+
+               status = copy_field_class_content_internal(md_maps, in_option_fc,
+                       out_option_fc);
+               if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error copying content of variant option field class: "
+                               "in-option-fc=%p, in-option-name=\"%s\"",
+                               in_option_fc, option_name);
+                       BT_FIELD_CLASS_PUT_REF_AND_RESET(out_option_fc);
+                       goto end;
                }
 
                if (fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD) {
@@ -479,15 +470,20 @@ int field_class_variant_copy(
                        const bt_integer_range_set_unsigned *ranges =
                                bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const(
                                        spec_opt);
-
-                       if (bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
+                       enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status =
+                               bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
                                        out_field_class, option_name,
-                                       out_option_field_class, ranges) !=
+                                       out_option_fc, ranges);
+
+                       if (append_opt_status !=
                                        BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
-                               BT_COMP_LOGE_STR("Cannot append option to variant field class with unsigned integer selector'");
+                               BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class with unsigned integer selector"
+                                       "out-fc-addr=%p, out-option-fc-addr=%p, "
+                                       "out-option-name=\"%s\"", out_field_class,
+                                       out_option_fc, option_name);
                                BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
-                               ret = -1;
-                               goto error;
+                               status = (int) append_opt_status;
+                               goto end;
                        }
                } else if (fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD) {
                        const bt_field_class_variant_with_selector_field_integer_signed_option *spec_opt =
@@ -497,26 +493,36 @@ int field_class_variant_copy(
                                bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const(
                                        spec_opt);
 
-                       if (bt_field_class_variant_with_selector_field_integer_signed_append_option(
+                       enum bt_field_class_variant_with_selector_field_integer_append_option_status append_opt_status =
+                               bt_field_class_variant_with_selector_field_integer_signed_append_option(
                                        out_field_class, option_name,
-                                       out_option_field_class, ranges) !=
+                                       out_option_fc, ranges);
+                       if (append_opt_status !=
                                        BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
-                               BT_COMP_LOGE_STR("Cannot append option to variant field class with signed integer selector'");
+                               BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class with signed integer selector"
+                                       "out-fc-addr=%p, out-option-fc-addr=%p, "
+                                       "out-option-name=\"%s\"", out_field_class,
+                                       out_option_fc, option_name);
                                BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
-                               ret = -1;
-                               goto error;
+                               status = (int) append_opt_status;
+                               goto end;
                        }
                } else {
                        BT_ASSERT(fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD);
 
-                       if (bt_field_class_variant_without_selector_append_option(
+                       enum bt_field_class_variant_without_selector_append_option_status append_opt_status =
+                               bt_field_class_variant_without_selector_append_option(
                                        out_field_class, option_name,
-                                       out_option_field_class) !=
+                                       out_option_fc);
+                       if (append_opt_status !=
                                        BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK) {
-                               BT_COMP_LOGE_STR("Cannot append option to variant field class'");
+                               BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Cannot append option to variant field class"
+                                       "out-fc-addr=%p, out-option-fc-addr=%p, "
+                                       "out-option-name=\"%s\"", out_field_class,
+                                       out_option_fc, option_name);
                                BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class);
-                               ret = -1;
-                               goto error;
+                               status = (int) append_opt_status;
+                               goto end;
                        }
                }
 
@@ -536,13 +542,13 @@ int field_class_variant_copy(
 
        BT_COMP_LOGD("Copied content of variant field class: in-fc-addr=%p, "
                "out-fc-addr=%p", in_field_class, out_field_class);
-
-error:
-       return ret;
+       status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
+end:
+       return status;
 }
 
 static inline
-int field_class_static_array_copy(
+enum debug_info_trace_ir_mapping_status field_class_static_array_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -556,11 +562,11 @@ int field_class_static_array_copy(
        BT_COMP_LOGD("Copied content of static array field class: in-fc-addr=%p, "
                "out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_dynamic_array_copy(
+enum debug_info_trace_ir_mapping_status field_class_dynamic_array_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -574,11 +580,11 @@ int field_class_dynamic_array_copy(
        BT_COMP_LOGD("Copied content of dynamic array field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_option_copy(
+enum debug_info_trace_ir_mapping_status field_class_option_copy(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
@@ -597,11 +603,12 @@ int field_class_option_copy(
        BT_COMP_LOGD("Copied content of option field class: "
                "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static inline
-int field_class_string_copy(struct trace_ir_metadata_maps *md_maps,
+enum debug_info_trace_ir_mapping_status field_class_string_copy(
+               struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
@@ -614,40 +621,43 @@ int field_class_string_copy(struct trace_ir_metadata_maps *md_maps,
        BT_COMP_LOGD("Copied content of string field class: in-fc-addr=%p, "
                "out-fc-addr=%p", in_field_class, out_field_class);
 
-       return 0;
+       return DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
 }
 
 static
-bt_field_class *copy_field_class_array_element(struct trace_ir_metadata_maps *md_maps,
+bt_field_class *copy_field_class_array_element(
+               struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_elem_fc)
 {
-       int ret;
+       bt_self_component *self_comp = md_maps->self_comp;
        bt_field_class *out_elem_fc =
                create_field_class_copy_internal(md_maps, in_elem_fc);
        if (!out_elem_fc) {
-               BT_COMP_LOGE("Error creating output elem field class "
-                       "from input elem field class for static array: "
+               BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+                       "Error creating output elem field class from input elem field class for static array: "
                        "in-fc-addr=%p", in_elem_fc);
-               goto error;
+               goto end;
        }
 
-       ret = copy_field_class_content_internal(md_maps, in_elem_fc, out_elem_fc);
-       if (ret) {
-               BT_COMP_LOGE("Error creating output elem field class "
-                       "from input elem field class for static array: "
+       if (copy_field_class_content_internal(md_maps, in_elem_fc, out_elem_fc) !=
+                       DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
+               BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+                       "Error creating output elem field class from input elem field class for static array: "
                        "in-fc-addr=%p", in_elem_fc);
                BT_FIELD_CLASS_PUT_REF_AND_RESET(out_elem_fc);
-               goto error;
+               goto end;
        }
 
-error:
+end:
        return out_elem_fc;
 }
 
-BT_HIDDEN
-bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *md_maps,
+bt_field_class *create_field_class_copy_internal(
+               struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class)
 {
+       bt_self_component *self_comp = md_maps->self_comp;
+       enum debug_info_trace_ir_mapping_status status;
        bt_field_class *out_field_class = NULL;
        bt_field_class_type fc_type = bt_field_class_get_type(in_field_class);
 
@@ -717,9 +727,12 @@ bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *
                        out_elem_fc, array_len);
                break;
        }
-       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD:
-       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD:
-       {
+       default:
+               break;
+       }
+
+       if (bt_field_class_type_is(fc_type,
+                       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY)) {
                const bt_field_class *in_elem_fc =
                        bt_field_class_array_borrow_element_field_class_const(
                                        in_field_class);
@@ -747,34 +760,31 @@ bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *
                }
 
                out_field_class = bt_field_class_array_dynamic_create(
-                       md_maps->output_trace_class,
-                       out_elem_fc, out_length_fc);
-               break;
-       }
-       case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-       {
+                       md_maps->output_trace_class, out_elem_fc, out_length_fc);
+       } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_OPTION)) {
                const bt_field_class *in_content_fc =
                        bt_field_class_option_borrow_field_class_const(
                                in_field_class);
                bt_field_class *out_selector_fc = NULL;
                bt_field_class *out_content_fc;
-               int ret;
 
                out_content_fc = create_field_class_copy_internal(
                        md_maps, in_content_fc);
                if (!out_content_fc) {
-                       BT_COMP_LOGE_STR("Cannot copy option's content field class.");
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+                               "Cannot copy option's content field class: "
+                               "in-content-fc-addr=%p", in_content_fc);
                        goto error;
                }
 
-               ret = copy_field_class_content_internal(md_maps,
+               status = copy_field_class_content_internal(md_maps,
                        in_content_fc, out_content_fc);
-               if (ret) {
-                       BT_COMP_LOGE_STR("Error copying content of option's "
-                               "content field class");
+               if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
+                       BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+                               "Error copying content of option's content field class: "
+                               "in-content-fc-addr=%p, out-content-fc-addr=%p",
+                               in_content_fc, out_content_fc);
+                       BT_FIELD_CLASS_PUT_REF_AND_RESET(out_content_fc);
                        goto error;
                }
 
@@ -826,18 +836,12 @@ bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *
                                                ranges);
                        }
                }
-
-               BT_ASSERT(out_field_class);
-               break;
-       }
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-       {
+       } else if (bt_field_class_type_is(fc_type,
+                       BT_FIELD_CLASS_TYPE_VARIANT)) {
                bt_field_class *out_sel_fc = NULL;
 
-               if (fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD ||
-                               fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD) {
+               if (bt_field_class_type_is(fc_type,
+                               BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD)) {
                        const bt_field_class *in_sel_fc;
                        const bt_field_path *sel_fp =
                                bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(
@@ -854,10 +858,6 @@ bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *
 
                out_field_class = bt_field_class_variant_create(
                        md_maps->output_trace_class, out_sel_fc);
-               break;
-       }
-       default:
-               abort();
        }
 
        /*
@@ -865,6 +865,7 @@ bt_field_class *create_field_class_copy_internal(struct trace_ir_metadata_maps *
         * the resolution of field paths in variant and dynamic array field
         * classes.
         */
+       BT_ASSERT(out_field_class);
        g_hash_table_insert(md_maps->field_class_map,
                (gpointer) in_field_class, out_field_class);
 
@@ -873,20 +874,22 @@ error:
                BT_COMP_LOGD("Created bare field class based on field class: in-fc-addr=%p, "
                                "out-fc-addr=%p", in_field_class, out_field_class);
        } else {
-               BT_COMP_LOGE("Error creating output field class from input field "
-                       "class: in-fc-addr=%p", in_field_class);
+               BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+                       "Error creating output field class from input field class: "
+                       "in-fc-addr=%p", in_field_class);
        }
 
        return out_field_class;
 }
 
-BT_HIDDEN
-int copy_field_class_content_internal(
+enum debug_info_trace_ir_mapping_status copy_field_class_content_internal(
                struct trace_ir_metadata_maps *md_maps,
                const bt_field_class *in_field_class,
                bt_field_class *out_field_class)
 {
-       int ret = 0;
+       enum debug_info_trace_ir_mapping_status status;
+       bt_field_class_type in_fc_type =
+               bt_field_class_get_type(in_field_class);
 
        /*
         * Safe to use the same value object because it's frozen at this
@@ -895,72 +898,54 @@ int copy_field_class_content_internal(
        bt_field_class_set_user_attributes(out_field_class,
                bt_field_class_borrow_user_attributes_const(in_field_class));
 
-       switch(bt_field_class_get_type(in_field_class)) {
-       case BT_FIELD_CLASS_TYPE_BOOL:
-               ret = field_class_bool_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_BIT_ARRAY:
-               ret = field_class_bit_array_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
-               ret = field_class_unsigned_integer_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
-               ret = field_class_signed_integer_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
-               ret = field_class_unsigned_enumeration_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION:
-               ret = field_class_signed_enumeration_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL:
-               ret = field_class_single_precision_real_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL:
-               ret = field_class_double_precision_real_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_STRING:
-               ret = field_class_string_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_STRUCTURE:
-               ret = field_class_structure_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
-               ret = field_class_static_array_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD:
-       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD:
-               ret = field_class_dynamic_array_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-               ret = field_class_option_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
-       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
-               ret = field_class_variant_copy(md_maps,
-                               in_field_class, out_field_class);
-               break;
-       default:
-               abort();
+       if (in_fc_type == BT_FIELD_CLASS_TYPE_BOOL) {
+               status = field_class_bool_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_BIT_ARRAY) {
+               status = field_class_bit_array_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER) {
+               status = field_class_unsigned_integer_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SIGNED_INTEGER) {
+               status = field_class_signed_integer_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
+               status = field_class_unsigned_enumeration_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
+               status = field_class_signed_enumeration_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL) {
+               status = field_class_single_precision_real_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL) {
+               status = field_class_double_precision_real_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STRING) {
+               status = field_class_string_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STRUCTURE) {
+               status = field_class_structure_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (in_fc_type == BT_FIELD_CLASS_TYPE_STATIC_ARRAY) {
+               status = field_class_static_array_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (bt_field_class_type_is(in_fc_type,
+                       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY)) {
+               status = field_class_dynamic_array_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (bt_field_class_type_is(in_fc_type,
+                       BT_FIELD_CLASS_TYPE_OPTION)) {
+               status = field_class_option_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else if (bt_field_class_type_is(in_fc_type,
+                       BT_FIELD_CLASS_TYPE_VARIANT)) {
+               status = field_class_variant_copy(md_maps,
+                       in_field_class, out_field_class);
+       } else {
+               bt_common_abort();
        }
 
-       return ret;
+       return status;
 }
This page took 0.036201 seconds and 4 git commands to generate.