X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Ffs-sink%2Ftranslate-trace-ir-to-ctf-ir.c;h=90f98e613c805e8e17fbb31e8ddb9b42b7d2d956;hb=e1c423f9b7082e3d836f10285370f4db0ec1a2a5;hp=30f4552ef4a681da7e0402563d47c79ccb786f51;hpb=2388fb873ed903b3308984c39ec5fb1b509529ac;p=babeltrace.git diff --git a/src/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c b/src/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c index 30f4552e..90f98e61 100644 --- a/src/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c +++ b/src/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c @@ -319,6 +319,13 @@ int create_relative_field_ref(struct ctx *ctx, BT_ASSERT(tgt_fc); BT_ASSERT(fp_item); + if (bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT) { + /* Not supported by CTF 1.8 */ + ret = -1; + goto end; + } + switch (tgt_fc->type) { case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT: BT_ASSERT(bt_field_path_item_get_type(fp_item) == @@ -363,8 +370,8 @@ int create_relative_field_ref(struct ctx *ctx, /* Find target field class having this name in current context */ for (si = ctx->cur_path->len - 1; si >= 0; si--) { struct fs_sink_ctf_field_class *fc; - struct fs_sink_ctf_field_class_struct *struct_fc; - struct fs_sink_ctf_field_class_variant *var_fc; + struct fs_sink_ctf_field_class_struct *struct_fc = NULL; + struct fs_sink_ctf_field_class_variant *var_fc = NULL; struct fs_sink_ctf_named_field_class *named_fc; uint64_t len; @@ -599,6 +606,16 @@ void append_to_parent_field_class(struct ctx *ctx, fs_sink_ctf_field_class_struct_append_member((void *) parent_fc, cur_path_stack_top(ctx)->name->str, fc); break; + case FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION: + { + struct fs_sink_ctf_field_class_option *opt_fc = + (void *) parent_fc; + + BT_ASSERT(!opt_fc->content_fc); + opt_fc->content_fc = fc; + opt_fc->base.alignment = fc->alignment; + break; + } case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT: fs_sink_ctf_field_class_variant_append_option((void *) parent_fc, cur_path_stack_top(ctx)->name->str, fc); @@ -816,26 +833,26 @@ int maybe_protect_variant_option_name(const bt_field_class *ir_var_fc, if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR) { /* No ranges: we're done */ goto end; - } if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR) { - const bt_field_class_variant_with_selector_unsigned_option *var_opt = - bt_field_class_variant_with_selector_unsigned_borrow_option_by_index_const( + } if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR) { + const bt_field_class_variant_with_selector_integer_unsigned_option *var_opt = + bt_field_class_variant_with_selector_integer_unsigned_borrow_option_by_index_const( ir_var_fc, opt_i); opt_ranges = - bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const( + bt_field_class_variant_with_selector_integer_unsigned_option_borrow_ranges_const( var_opt); } else { - const bt_field_class_variant_with_selector_signed_option *var_opt = - bt_field_class_variant_with_selector_signed_borrow_option_by_index_const( + const bt_field_class_variant_with_selector_integer_signed_option *var_opt = + bt_field_class_variant_with_selector_integer_signed_borrow_option_by_index_const( ir_var_fc, opt_i); opt_ranges = - bt_field_class_variant_with_selector_signed_option_borrow_ranges_const( + bt_field_class_variant_with_selector_integer_signed_option_borrow_ranges_const( var_opt); } /* Find corresponding mapping by range set in selector FC */ for (i = 0; i < bt_field_class_enumeration_get_mapping_count(ir_tag_fc); i++) { - if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR) { + if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR) { const bt_field_class_enumeration_mapping *mapping_base; const bt_field_class_enumeration_unsigned_mapping *mapping; const bt_integer_range_set_unsigned *mapping_ranges; @@ -845,7 +862,7 @@ int maybe_protect_variant_option_name(const bt_field_class *ir_var_fc, mapping_ranges = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const( mapping); - if (bt_integer_range_set_unsigned_compare(opt_ranges, + if (bt_integer_range_set_unsigned_is_equal(opt_ranges, mapping_ranges)) { /* We have a winner */ mapping_base = @@ -866,7 +883,7 @@ int maybe_protect_variant_option_name(const bt_field_class *ir_var_fc, mapping_ranges = bt_field_class_enumeration_signed_mapping_borrow_ranges_const( mapping); - if (bt_integer_range_set_signed_compare(opt_ranges, + if (bt_integer_range_set_signed_is_equal(opt_ranges, mapping_ranges)) { /* We have a winner */ mapping_base = @@ -915,6 +932,51 @@ end: return ret; } +static inline +int translate_option_field_class(struct ctx *ctx) +{ + struct fs_sink_ctf_field_class_option *fc = + fs_sink_ctf_field_class_option_create_empty( + cur_path_stack_top(ctx)->ir_fc, + cur_path_stack_top(ctx)->index_in_parent); + const bt_field_class *content_ir_fc = + bt_field_class_option_borrow_field_class_const(fc->base.ir_fc); + int ret; + + BT_ASSERT(fc); + + /* + * CTF 1.8 does not support the option field class type. To + * write something anyway, this component translates this type + * to a variant field class where the options are: + * + * * An empty structure field class. + * * The optional field class itself. + * + * The "tag" is always generated/before in that case (an 8-bit + * unsigned enumeration field class). + */ + append_to_parent_field_class(ctx, (void *) fc); + ret = cur_path_stack_push(ctx, UINT64_C(-1), NULL, false, content_ir_fc, + (void *) fc); + if (ret) { + BT_COMP_LOGE_STR("Cannot translate option field class content."); + goto end; + } + + ret = translate_field_class(ctx); + if (ret) { + BT_COMP_LOGE_STR("Cannot translate option field class content."); + goto end; + } + + cur_path_stack_pop(ctx); + update_parent_field_class_alignment(ctx, fc->base.alignment); + +end: + return ret; +} + static inline int translate_variant_field_class(struct ctx *ctx) { @@ -937,8 +999,8 @@ int translate_variant_field_class(struct ctx *ctx) ir_fc_type = bt_field_class_get_type(fc->base.ir_fc); opt_count = bt_field_class_variant_get_option_count(fc->base.ir_fc); - if (ir_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR || - ir_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR) { + if (ir_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR || + ir_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR) { ir_selector_field_path = bt_field_class_variant_with_selector_borrow_selector_field_path_const( fc->base.ir_fc); BT_ASSERT(ir_selector_field_path); @@ -1030,7 +1092,7 @@ validate_opts: opt_name_b = bt_value_array_borrow_element_by_index_const( prot_opt_names, j); - if (bt_value_compare(opt_name_a, opt_name_b)) { + if (bt_value_is_equal(opt_name_a, opt_name_b)) { /* * Variant FC option names are not * unique when protected. @@ -1166,6 +1228,32 @@ end: return ret; } +static inline +int translate_bool_field_class(struct ctx *ctx) +{ + struct fs_sink_ctf_field_class_bool *fc = + fs_sink_ctf_field_class_bool_create( + cur_path_stack_top(ctx)->ir_fc, + cur_path_stack_top(ctx)->index_in_parent); + + BT_ASSERT(fc); + append_to_parent_field_class(ctx, (void *) fc); + return 0; +} + +static inline +int translate_bit_array_field_class(struct ctx *ctx) +{ + struct fs_sink_ctf_field_class_bit_array *fc = + fs_sink_ctf_field_class_bit_array_create( + cur_path_stack_top(ctx)->ir_fc, + cur_path_stack_top(ctx)->index_in_parent); + + BT_ASSERT(fc); + append_to_parent_field_class(ctx, (void *) fc); + return 0; +} + static inline int translate_integer_field_class(struct ctx *ctx) { @@ -1218,13 +1306,20 @@ int translate_field_class(struct ctx *ctx) int ret; switch (bt_field_class_get_type(cur_path_stack_top(ctx)->ir_fc)) { + case BT_FIELD_CLASS_TYPE_BOOL: + ret = translate_bool_field_class(ctx); + break; + case BT_FIELD_CLASS_TYPE_BIT_ARRAY: + ret = translate_bit_array_field_class(ctx); + break; case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER: case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER: case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION: ret = translate_integer_field_class(ctx); break; - case BT_FIELD_CLASS_TYPE_REAL: + case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL: + case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: ret = translate_real_field_class(ctx); break; case BT_FIELD_CLASS_TYPE_STRING: @@ -1239,9 +1334,15 @@ int translate_field_class(struct ctx *ctx) case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY: ret = translate_dynamic_array_field_class(ctx); break; + case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR: + ret = translate_option_field_class(ctx); + break; case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR: ret = translate_variant_field_class(ctx); break; default: @@ -1272,6 +1373,30 @@ int set_field_ref(struct fs_sink_ctf_field_class *fc, const char *fc_name, } switch (fc->type) { + case FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION: + { + /* + * CTF 1.8 does not support the option field class type. + * To write something anyway, this component translates + * this type to a variant field class where the options + * are: + * + * * An empty structure field class. + * * The optional field class itself. + * + * Because the option field class becomes a CTF variant + * field class, we use the term "tag" too here. + * + * The "tag" is always generated/before in that case (an + * 8-bit unsigned enumeration field class). + */ + struct fs_sink_ctf_field_class_option *opt_fc = (void *) fc; + + field_ref = opt_fc->tag_ref; + is_before = true; + tgt_type = "tag"; + break; + } case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE: { struct fs_sink_ctf_field_class_sequence *seq_fc = (void *) fc; @@ -1359,12 +1484,28 @@ int set_field_refs(struct fs_sink_ctf_field_class * const fc, fc_type = fc->type; switch (fc_type) { + case FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION: + { + struct fs_sink_ctf_field_class_option *opt_fc = (void *) fc; + + ret = set_field_ref(fc, fc_name, parent_fc); + if (ret) { + goto end; + } + + ret = set_field_refs(opt_fc->content_fc, NULL, fc); + if (ret) { + goto end; + } + + break; + } case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT: case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT: { uint64_t i; uint64_t len; - struct fs_sink_ctf_field_class_struct *struct_fc; + struct fs_sink_ctf_field_class_struct *struct_fc = NULL; struct fs_sink_ctf_field_class_variant *var_fc = NULL; struct fs_sink_ctf_named_field_class *named_fc;