X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Fcommon%2Fmetadata%2Fctf-meta-translate.c;h=ca3069aee13bd1ab8091b6b9f5078247ad2d890a;hb=68b66a256a54d32992dfefeaad11eea88b7df234;hp=4b5e219a8584a9cee4d7e1d5206d843aa6b6429c;hpb=c5b9b4417bedfbec9b5dd23b8395ccdd4eeffc44;p=babeltrace.git diff --git a/plugins/ctf/common/metadata/ctf-meta-translate.c b/plugins/ctf/common/metadata/ctf-meta-translate.c index 4b5e219a..ca3069ae 100644 --- a/plugins/ctf/common/metadata/ctf-meta-translate.c +++ b/plugins/ctf/common/metadata/ctf-meta-translate.c @@ -15,9 +15,9 @@ #define BT_LOG_TAG "PLUGIN-CTF-METADATA-META-TRANSLATE" #include "logging.h" -#include -#include -#include +#include +#include +#include #include #include #include @@ -25,15 +25,23 @@ #include "ctf-meta-visitors.h" +struct ctx { + bt_self_component_source *self_comp; + bt_trace_class *ir_tc; + bt_stream_class *ir_sc; + struct ctf_trace_class *tc; + struct ctf_stream_class *sc; + struct ctf_event_class *ec; + enum ctf_scope scope; +}; + static inline -struct bt_field_class *ctf_field_class_to_ir(struct ctf_field_class *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec); +bt_field_class *ctf_field_class_to_ir(struct ctx *ctx, + struct ctf_field_class *fc); static inline void ctf_field_class_int_set_props(struct ctf_field_class_int *fc, - struct bt_field_class *ir_fc) + bt_field_class *ir_fc) { bt_field_class_integer_set_field_value_range(ir_fc, fc->base.size); @@ -42,15 +50,15 @@ void ctf_field_class_int_set_props(struct ctf_field_class_int *fc, } static inline -struct bt_field_class *ctf_field_class_int_to_ir( +bt_field_class *ctf_field_class_int_to_ir(struct ctx *ctx, struct ctf_field_class_int *fc) { - struct bt_field_class *ir_fc; + bt_field_class *ir_fc; if (fc->is_signed) { - ir_fc = bt_field_class_signed_integer_create(); + ir_fc = bt_field_class_signed_integer_create(ctx->ir_tc); } else { - ir_fc = bt_field_class_unsigned_integer_create(); + ir_fc = bt_field_class_unsigned_integer_create(ctx->ir_tc); } BT_ASSERT(ir_fc); @@ -59,17 +67,17 @@ struct bt_field_class *ctf_field_class_int_to_ir( } static inline -struct bt_field_class *ctf_field_class_enum_to_ir( +bt_field_class *ctf_field_class_enum_to_ir(struct ctx *ctx, struct ctf_field_class_enum *fc) { int ret; - struct bt_field_class *ir_fc; + bt_field_class *ir_fc; uint64_t i; if (fc->base.is_signed) { - ir_fc = bt_field_class_signed_enumeration_create(); + ir_fc = bt_field_class_signed_enumeration_create(ctx->ir_tc); } else { - ir_fc = bt_field_class_unsigned_enumeration_create(); + ir_fc = bt_field_class_unsigned_enumeration_create(ctx->ir_tc); } BT_ASSERT(ir_fc); @@ -96,12 +104,12 @@ struct bt_field_class *ctf_field_class_enum_to_ir( } static inline -struct bt_field_class *ctf_field_class_float_to_ir( +bt_field_class *ctf_field_class_float_to_ir(struct ctx *ctx, struct ctf_field_class_float *fc) { - struct bt_field_class *ir_fc; + bt_field_class *ir_fc; - ir_fc = bt_field_class_real_create(); + ir_fc = bt_field_class_real_create(ctx->ir_tc); BT_ASSERT(ir_fc); if (fc->base.size == 32) { @@ -113,60 +121,61 @@ struct bt_field_class *ctf_field_class_float_to_ir( } static inline -struct bt_field_class *ctf_field_class_string_to_ir( +bt_field_class *ctf_field_class_string_to_ir(struct ctx *ctx, struct ctf_field_class_string *fc) { - struct bt_field_class *ir_fc = - bt_field_class_string_create(); + bt_field_class *ir_fc = bt_field_class_string_create(ctx->ir_tc); BT_ASSERT(ir_fc); return ir_fc; } static inline -struct bt_field_class *ctf_field_class_struct_to_ir( - struct ctf_field_class_struct *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +void translate_struct_field_class_members(struct ctx *ctx, + struct ctf_field_class_struct *fc, bt_field_class *ir_fc, + bool with_header_prefix, + struct ctf_field_class_struct *context_fc) { - int ret; - struct bt_field_class *ir_fc = - bt_field_class_structure_create(); uint64_t i; - - BT_ASSERT(ir_fc); + int ret; for (i = 0; i < fc->members->len; i++) { struct ctf_named_field_class *named_fc = ctf_field_class_struct_borrow_member_by_index(fc, i); - struct bt_field_class *member_ir_fc; + bt_field_class *member_ir_fc; + const char *name = named_fc->name->str; if (!named_fc->fc->in_ir) { continue; } - member_ir_fc = ctf_field_class_to_ir(named_fc->fc, tc, sc, ec); + member_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc); BT_ASSERT(member_ir_fc); - ret = bt_field_class_structure_append_member( - ir_fc, named_fc->name->str, member_ir_fc); + ret = bt_field_class_structure_append_member(ir_fc, name, + member_ir_fc); BT_ASSERT(ret == 0); bt_field_class_put_ref(member_ir_fc); } +} +static inline +bt_field_class *ctf_field_class_struct_to_ir(struct ctx *ctx, + struct ctf_field_class_struct *fc) +{ + bt_field_class *ir_fc = bt_field_class_structure_create(ctx->ir_tc); + + BT_ASSERT(ir_fc); + translate_struct_field_class_members(ctx, fc, ir_fc, false, NULL); return ir_fc; } static inline -struct bt_field_class *borrow_ir_ft_from_field_path( - struct ctf_field_path *field_path, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *borrow_ir_fc_from_field_path(struct ctx *ctx, + struct ctf_field_path *field_path) { - struct bt_field_class *ir_fc = NULL; + bt_field_class *ir_fc = NULL; struct ctf_field_class *fc = ctf_field_path_borrow_field_class( - field_path, tc, sc, ec); + field_path, ctx->tc, ctx->sc, ctx->ec); BT_ASSERT(fc); @@ -178,29 +187,30 @@ struct bt_field_class *borrow_ir_ft_from_field_path( } static inline -struct bt_field_class *ctf_field_class_variant_to_ir( - struct ctf_field_class_variant *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *ctf_field_class_variant_to_ir(struct ctx *ctx, + struct ctf_field_class_variant *fc) { int ret; - struct bt_field_class *ir_fc = - bt_field_class_variant_create(); + bt_field_class *ir_fc = bt_field_class_variant_create(ctx->ir_tc); uint64_t i; BT_ASSERT(ir_fc); - ret = bt_field_class_variant_set_selector_field_class( - ir_fc, borrow_ir_ft_from_field_path(&fc->tag_path, tc, sc, ec)); - BT_ASSERT(ret == 0); + + if (fc->tag_path.root != CTF_SCOPE_PACKET_HEADER && + fc->tag_path.root != CTF_SCOPE_EVENT_HEADER) { + ret = bt_field_class_variant_set_selector_field_class( + ir_fc, borrow_ir_fc_from_field_path(ctx, + &fc->tag_path)); + BT_ASSERT(ret == 0); + } for (i = 0; i < fc->options->len; i++) { struct ctf_named_field_class *named_fc = ctf_field_class_variant_borrow_option_by_index(fc, i); - struct bt_field_class *option_ir_fc; + bt_field_class *option_ir_fc; BT_ASSERT(named_fc->fc->in_ir); - option_ir_fc = ctf_field_class_to_ir(named_fc->fc, tc, sc, ec); + option_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc); BT_ASSERT(option_ir_fc); ret = bt_field_class_variant_append_option( ir_fc, named_fc->name->str, option_ir_fc); @@ -212,24 +222,21 @@ struct bt_field_class *ctf_field_class_variant_to_ir( } static inline -struct bt_field_class *ctf_field_class_array_to_ir( - struct ctf_field_class_array *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *ctf_field_class_array_to_ir(struct ctx *ctx, + struct ctf_field_class_array *fc) { - struct bt_field_class *ir_fc; - struct bt_field_class *elem_ir_fc; + bt_field_class *ir_fc; + bt_field_class *elem_ir_fc; if (fc->base.is_text) { - ir_fc = bt_field_class_string_create(); + ir_fc = bt_field_class_string_create(ctx->ir_tc); BT_ASSERT(ir_fc); goto end; } - elem_ir_fc = ctf_field_class_to_ir(fc->base.elem_fc, tc, sc, ec); + elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc); BT_ASSERT(elem_ir_fc); - ir_fc = bt_field_class_static_array_create(elem_ir_fc, + ir_fc = bt_field_class_static_array_create(ctx->ir_tc, elem_ir_fc, fc->length); BT_ASSERT(ir_fc); bt_field_class_put_ref(elem_ir_fc); @@ -239,72 +246,70 @@ end: } static inline -struct bt_field_class *ctf_field_class_sequence_to_ir( - struct ctf_field_class_sequence *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *ctf_field_class_sequence_to_ir(struct ctx *ctx, + struct ctf_field_class_sequence *fc) { int ret; - struct bt_field_class *ir_fc; - struct bt_field_class *elem_ir_fc; + bt_field_class *ir_fc; + bt_field_class *elem_ir_fc; if (fc->base.is_text) { - ir_fc = bt_field_class_string_create(); + ir_fc = bt_field_class_string_create(ctx->ir_tc); BT_ASSERT(ir_fc); goto end; } - elem_ir_fc = ctf_field_class_to_ir(fc->base.elem_fc, tc, sc, ec); + elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc); BT_ASSERT(elem_ir_fc); - ir_fc = bt_field_class_dynamic_array_create(elem_ir_fc); + ir_fc = bt_field_class_dynamic_array_create(ctx->ir_tc, elem_ir_fc); BT_ASSERT(ir_fc); bt_field_class_put_ref(elem_ir_fc); BT_ASSERT(ir_fc); - ret = bt_field_class_dynamic_array_set_length_field_class( - ir_fc, - borrow_ir_ft_from_field_path(&fc->length_path, tc, sc, ec)); - BT_ASSERT(ret == 0); + + if (fc->length_path.root != CTF_SCOPE_PACKET_HEADER && + fc->length_path.root != CTF_SCOPE_EVENT_HEADER) { + ret = bt_field_class_dynamic_array_set_length_field_class( + ir_fc, borrow_ir_fc_from_field_path(ctx, &fc->length_path)); + BT_ASSERT(ret == 0); + } end: return ir_fc; } static inline -struct bt_field_class *ctf_field_class_to_ir(struct ctf_field_class *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *ctf_field_class_to_ir(struct ctx *ctx, + struct ctf_field_class *fc) { - struct bt_field_class *ir_fc = NULL; + bt_field_class *ir_fc = NULL; BT_ASSERT(fc); BT_ASSERT(fc->in_ir); switch (fc->type) { case CTF_FIELD_CLASS_TYPE_INT: - ir_fc = ctf_field_class_int_to_ir((void *) fc); + ir_fc = ctf_field_class_int_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_ENUM: - ir_fc = ctf_field_class_enum_to_ir((void *) fc); + ir_fc = ctf_field_class_enum_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_FLOAT: - ir_fc = ctf_field_class_float_to_ir((void *) fc); + ir_fc = ctf_field_class_float_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_STRING: - ir_fc = ctf_field_class_string_to_ir((void *) fc); + ir_fc = ctf_field_class_string_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_STRUCT: - ir_fc = ctf_field_class_struct_to_ir((void *) fc, tc, sc, ec); + ir_fc = ctf_field_class_struct_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_ARRAY: - ir_fc = ctf_field_class_array_to_ir((void *) fc, tc, sc, ec); + ir_fc = ctf_field_class_array_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_SEQUENCE: - ir_fc = ctf_field_class_sequence_to_ir((void *) fc, tc, sc, ec); + ir_fc = ctf_field_class_sequence_to_ir(ctx, (void *) fc); break; case CTF_FIELD_CLASS_TYPE_VARIANT: - ir_fc = ctf_field_class_variant_to_ir((void *) fc, tc, sc, ec); + ir_fc = ctf_field_class_variant_to_ir(ctx, (void *) fc); break; default: abort(); @@ -321,6 +326,16 @@ bool ctf_field_class_struct_has_immediate_member_in_ir( uint64_t i; bool has_immediate_member_in_ir = false; + /* + * If the structure field class has no members at all, then it + * was an empty structure in the beginning, so leave it existing + * and empty. + */ + if (fc->members->len == 0) { + has_immediate_member_in_ir = true; + goto end; + } + for (i = 0; i < fc->members->len; i++) { struct ctf_named_field_class *named_fc = ctf_field_class_struct_borrow_member_by_index(fc, i); @@ -336,272 +351,215 @@ end: } static inline -struct bt_field_class *scope_ctf_field_class_to_ir(struct ctf_field_class *fc, - struct ctf_trace_class *tc, - struct ctf_stream_class *sc, - struct ctf_event_class *ec) +bt_field_class *scope_ctf_field_class_to_ir(struct ctx *ctx) { - struct bt_field_class *ir_fc = NULL; + bt_field_class *ir_fc = NULL; + struct ctf_field_class *fc = NULL; - if (!fc) { - goto end; + switch (ctx->scope) { + case CTF_SCOPE_PACKET_CONTEXT: + fc = ctx->sc->packet_context_fc; + break; + case CTF_SCOPE_EVENT_COMMON_CONTEXT: + fc = ctx->sc->event_common_context_fc; + break; + case CTF_SCOPE_EVENT_SPECIFIC_CONTEXT: + fc = ctx->ec->spec_context_fc; + break; + case CTF_SCOPE_EVENT_PAYLOAD: + fc = ctx->ec->payload_fc; + break; + default: + abort(); } - BT_ASSERT(fc->type == CTF_FIELD_CLASS_TYPE_STRUCT); - - if (!ctf_field_class_struct_has_immediate_member_in_ir((void *) fc)) { - /* - * Nothing for IR in this scope: typical for packet - * header, packet context, and event header. - */ - goto end; + if (fc && ctf_field_class_struct_has_immediate_member_in_ir( + (void *) fc)) { + ir_fc = ctf_field_class_to_ir(ctx, fc); } - ir_fc = ctf_field_class_to_ir(fc, tc, sc, ec); - -end: return ir_fc; } static inline -struct ctf_field_class_int *borrow_named_int_field_class( - struct ctf_field_class_struct *struct_fc, const char *name) -{ - struct ctf_named_field_class *named_fc = NULL; - struct ctf_field_class_int *int_fc = NULL; - - if (!struct_fc) { - goto end; - } - - named_fc = ctf_field_class_struct_borrow_member_by_name(struct_fc, name); - if (!named_fc) { - goto end; - } - - if (named_fc->fc->type != CTF_FIELD_CLASS_TYPE_INT && - named_fc->fc->type != CTF_FIELD_CLASS_TYPE_ENUM) { - goto end; - } - - int_fc = (void *) named_fc->fc; - -end: - return int_fc; -} - -static inline -struct bt_event_class *ctf_event_class_to_ir(struct ctf_event_class *ec, - struct bt_stream_class *ir_sc, struct ctf_trace_class *tc, - struct ctf_stream_class *sc) +void ctf_event_class_to_ir(struct ctx *ctx) { int ret; - struct bt_event_class *ir_ec = NULL; + bt_event_class *ir_ec = NULL; + bt_field_class *ir_fc; - if (ec->is_translated) { + BT_ASSERT(ctx->ec); + + if (ctx->ec->is_translated) { ir_ec = bt_stream_class_borrow_event_class_by_id( - ir_sc, ec->id); + ctx->ir_sc, ctx->ec->id); BT_ASSERT(ir_ec); goto end; } - ir_ec = bt_event_class_create_with_id(ir_sc, ec->id); + ir_ec = bt_event_class_create_with_id(ctx->ir_sc, ctx->ec->id); BT_ASSERT(ir_ec); bt_event_class_put_ref(ir_ec); - - if (ec->spec_context_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - ec->spec_context_fc, tc, sc, ec); - - if (ir_fc) { - ret = bt_event_class_set_specific_context_field_class( - ir_ec, ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } + ctx->scope = CTF_SCOPE_EVENT_SPECIFIC_CONTEXT; + ir_fc = scope_ctf_field_class_to_ir(ctx); + if (ir_fc) { + ret = bt_event_class_set_specific_context_field_class( + ir_ec, ir_fc); + BT_ASSERT(ret == 0); + bt_field_class_put_ref(ir_fc); } - if (ec->payload_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - ec->payload_fc, tc, sc, ec); - - if (ir_fc) { - ret = bt_event_class_set_payload_field_class(ir_ec, - ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } + ctx->scope = CTF_SCOPE_EVENT_PAYLOAD; + ir_fc = scope_ctf_field_class_to_ir(ctx); + if (ir_fc) { + ret = bt_event_class_set_payload_field_class(ir_ec, + ir_fc); + BT_ASSERT(ret == 0); + bt_field_class_put_ref(ir_fc); } - if (ec->name->len > 0) { - ret = bt_event_class_set_name(ir_ec, ec->name->str); + if (ctx->ec->name->len > 0) { + ret = bt_event_class_set_name(ir_ec, ctx->ec->name->str); BT_ASSERT(ret == 0); } - if (ec->emf_uri->len > 0) { - ret = bt_event_class_set_emf_uri(ir_ec, ec->emf_uri->str); + if (ctx->ec->emf_uri->len > 0) { + ret = bt_event_class_set_emf_uri(ir_ec, ctx->ec->emf_uri->str); BT_ASSERT(ret == 0); } - if (ec->log_level != -1) { - bt_event_class_set_log_level(ir_ec, ec->log_level); + if (ctx->ec->log_level != -1) { + bt_event_class_set_log_level(ir_ec, ctx->ec->log_level); } - ec->is_translated = true; - ec->ir_ec = ir_ec; + ctx->ec->is_translated = true; + ctx->ec->ir_ec = ir_ec; end: - return ir_ec; + return; } static inline -struct bt_stream_class *ctf_stream_class_to_ir(struct ctf_stream_class *sc, - struct bt_trace_class *ir_tc, struct ctf_trace_class *tc) +void ctf_stream_class_to_ir(struct ctx *ctx) { int ret; - struct bt_stream_class *ir_sc = NULL; - struct ctf_field_class_int *int_fc; + bt_field_class *ir_fc; + + BT_ASSERT(ctx->sc); - if (sc->is_translated) { - ir_sc = bt_trace_class_borrow_stream_class_by_id(ir_tc, sc->id); - BT_ASSERT(ir_sc); + if (ctx->sc->is_translated) { + ctx->ir_sc = bt_trace_class_borrow_stream_class_by_id( + ctx->ir_tc, ctx->sc->id); + BT_ASSERT(ctx->ir_sc); goto end; } - ir_sc = bt_stream_class_create_with_id(ir_tc, sc->id); - BT_ASSERT(ir_sc); - bt_stream_class_put_ref(ir_sc); - - if (sc->packet_context_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - sc->packet_context_fc, tc, sc, NULL); + ctx->ir_sc = bt_stream_class_create_with_id(ctx->ir_tc, ctx->sc->id); + BT_ASSERT(ctx->ir_sc); + bt_stream_class_put_ref(ctx->ir_sc); + ctx->scope = CTF_SCOPE_PACKET_CONTEXT; + ir_fc = scope_ctf_field_class_to_ir(ctx); + if (ir_fc) { + ret = bt_stream_class_set_packet_context_field_class( + ctx->ir_sc, ir_fc); + BT_ASSERT(ret == 0); + bt_field_class_put_ref(ir_fc); + } - if (ir_fc) { - ret = bt_stream_class_set_packet_context_field_class( - ir_sc, ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } + ctx->scope = CTF_SCOPE_EVENT_COMMON_CONTEXT; + ir_fc = scope_ctf_field_class_to_ir(ctx); + if (ir_fc) { + ret = bt_stream_class_set_event_common_context_field_class( + ctx->ir_sc, ir_fc); + BT_ASSERT(ret == 0); + bt_field_class_put_ref(ir_fc); } - if (sc->event_header_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - sc->event_header_fc, tc, sc, NULL); + bt_stream_class_set_assigns_automatic_event_class_id(ctx->ir_sc, + BT_FALSE); + bt_stream_class_set_assigns_automatic_stream_id(ctx->ir_sc, BT_FALSE); - if (ir_fc) { - ret = bt_stream_class_set_event_header_field_class( - ir_sc, ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } + if (ctx->sc->default_clock_class) { + BT_ASSERT(ctx->sc->default_clock_class->ir_cc); + ret = bt_stream_class_set_default_clock_class(ctx->ir_sc, + ctx->sc->default_clock_class->ir_cc); + BT_ASSERT(ret == 0); } - if (sc->event_common_context_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - sc->event_common_context_fc, tc, sc, NULL); + bt_stream_class_set_packets_have_beginning_default_clock_snapshot( + ctx->ir_sc, ctx->sc->packets_have_ts_begin); + bt_stream_class_set_packets_have_end_default_clock_snapshot( + ctx->ir_sc, ctx->sc->packets_have_ts_end); + bt_stream_class_set_supports_discarded_events(ctx->ir_sc, + ctx->sc->has_discarded_events, + ctx->sc->discarded_events_have_default_cs); + bt_stream_class_set_supports_discarded_packets(ctx->ir_sc, + ctx->sc->has_discarded_packets, + ctx->sc->discarded_packets_have_default_cs); + ctx->sc->is_translated = true; + ctx->sc->ir_sc = ctx->ir_sc; - if (ir_fc) { - ret = bt_stream_class_set_event_common_context_field_class( - ir_sc, ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } - } +end: + return; +} - bt_stream_class_set_assigns_automatic_event_class_id(ir_sc, - BT_FALSE); - bt_stream_class_set_assigns_automatic_stream_id(ir_sc, BT_FALSE); +static inline +void ctf_clock_class_to_ir(bt_clock_class *ir_cc, struct ctf_clock_class *cc) +{ + int ret; - if (sc->default_clock_class) { - ret = bt_stream_class_set_default_clock_class(ir_sc, - sc->default_clock_class); + if (strlen(cc->name->str) > 0) { + ret = bt_clock_class_set_name(ir_cc, cc->name->str); BT_ASSERT(ret == 0); } - int_fc = borrow_named_int_field_class((void *) sc->packet_context_fc, - "events_discarded"); - if (int_fc) { - if (int_fc->meaning == CTF_FIELD_CLASS_MEANING_DISC_EV_REC_COUNTER_SNAPSHOT) { - bt_stream_class_set_packets_have_discarded_event_counter_snapshot( - ir_sc, BT_TRUE); - } - } - - int_fc = borrow_named_int_field_class((void *) sc->packet_context_fc, - "packet_seq_num"); - if (int_fc) { - if (int_fc->meaning == CTF_FIELD_CLASS_MEANING_PACKET_COUNTER_SNAPSHOT) { - bt_stream_class_set_packets_have_packet_counter_snapshot( - ir_sc, BT_TRUE); - } + if (strlen(cc->description->str) > 0) { + ret = bt_clock_class_set_description(ir_cc, cc->description->str); + BT_ASSERT(ret == 0); } - int_fc = borrow_named_int_field_class((void *) sc->packet_context_fc, - "timestamp_begin"); - if (int_fc) { - if (int_fc->meaning == CTF_FIELD_CLASS_MEANING_PACKET_BEGINNING_TIME) { - bt_stream_class_set_packets_have_default_beginning_clock_value( - ir_sc, BT_TRUE); - } - } + bt_clock_class_set_frequency(ir_cc, cc->frequency); + bt_clock_class_set_precision(ir_cc, cc->precision); + bt_clock_class_set_offset(ir_cc, cc->offset_seconds, cc->offset_cycles); - int_fc = borrow_named_int_field_class((void *) sc->packet_context_fc, - "timestamp_end"); - if (int_fc) { - if (int_fc->meaning == CTF_FIELD_CLASS_MEANING_PACKET_END_TIME) { - bt_stream_class_set_packets_have_default_end_clock_value( - ir_sc, BT_TRUE); - } + if (cc->has_uuid) { + bt_clock_class_set_uuid(ir_cc, cc->uuid); } - sc->is_translated = true; - sc->ir_sc = ir_sc; - -end: - return ir_sc; + bt_clock_class_set_origin_is_unix_epoch(ir_cc, cc->is_absolute); } static inline -int ctf_trace_class_to_ir(struct bt_trace_class *ir_tc, - struct ctf_trace_class *tc) +int ctf_trace_class_to_ir(struct ctx *ctx) { int ret = 0; uint64_t i; - if (tc->is_translated) { - goto end; - } - - if (tc->packet_header_fc) { - struct bt_field_class *ir_fc = scope_ctf_field_class_to_ir( - tc->packet_header_fc, tc, NULL, NULL); + BT_ASSERT(ctx->tc); + BT_ASSERT(ctx->ir_tc); - if (ir_fc) { - ret = bt_trace_class_set_packet_header_field_class( - ir_tc, ir_fc); - BT_ASSERT(ret == 0); - bt_field_class_put_ref(ir_fc); - } + if (ctx->tc->is_translated) { + goto end; } - if (tc->is_uuid_set) { - bt_trace_class_set_uuid(ir_tc, tc->uuid); + if (ctx->tc->is_uuid_set) { + bt_trace_class_set_uuid(ctx->ir_tc, ctx->tc->uuid); } - for (i = 0; i < tc->env_entries->len; i++) { + for (i = 0; i < ctx->tc->env_entries->len; i++) { struct ctf_trace_class_env_entry *env_entry = - ctf_trace_class_borrow_env_entry_by_index(tc, i); + ctf_trace_class_borrow_env_entry_by_index(ctx->tc, i); switch (env_entry->type) { case CTF_TRACE_CLASS_ENV_ENTRY_TYPE_INT: ret = bt_trace_class_set_environment_entry_integer( - ir_tc, env_entry->name->str, + ctx->ir_tc, env_entry->name->str, env_entry->value.i); break; case CTF_TRACE_CLASS_ENV_ENTRY_TYPE_STR: ret = bt_trace_class_set_environment_entry_string( - ir_tc, env_entry->name->str, + ctx->ir_tc, env_entry->name->str, env_entry->value.str->str); break; default: @@ -613,48 +571,54 @@ int ctf_trace_class_to_ir(struct bt_trace_class *ir_tc, } } - bt_trace_class_set_assigns_automatic_stream_class_id(ir_tc, + for (i = 0; i < ctx->tc->clock_classes->len; i++) { + struct ctf_clock_class *cc = ctx->tc->clock_classes->pdata[i]; + + cc->ir_cc = bt_clock_class_create( + bt_self_component_source_as_self_component( + ctx->self_comp)); + ctf_clock_class_to_ir(cc->ir_cc, cc); + } + + bt_trace_class_set_assigns_automatic_stream_class_id(ctx->ir_tc, BT_FALSE); - tc->is_translated = true; - tc->ir_tc = ir_tc; + ctx->tc->is_translated = true; + ctx->tc->ir_tc = ctx->ir_tc; end: return ret; } BT_HIDDEN -int ctf_trace_class_translate(struct bt_trace_class *ir_tc, - struct ctf_trace_class *tc) +int ctf_trace_class_translate(bt_self_component_source *self_comp, + bt_trace_class *ir_tc, struct ctf_trace_class *tc) { int ret = 0; uint64_t i; + struct ctx ctx = { 0 }; - ret = ctf_trace_class_to_ir(ir_tc, tc); + ctx.self_comp = self_comp; + ctx.tc = tc; + ctx.ir_tc = ir_tc; + ret = ctf_trace_class_to_ir(&ctx); if (ret) { goto end; } for (i = 0; i < tc->stream_classes->len; i++) { uint64_t j; - struct ctf_stream_class *sc = tc->stream_classes->pdata[i]; - struct bt_stream_class *ir_sc; + ctx.sc = tc->stream_classes->pdata[i]; - ir_sc = ctf_stream_class_to_ir(sc, ir_tc, tc); - if (!ir_sc) { - ret = -1; - goto end; - } + ctf_stream_class_to_ir(&ctx); - for (j = 0; j < sc->event_classes->len; j++) { - struct ctf_event_class *ec = sc->event_classes->pdata[j]; - struct bt_event_class *ir_ec; + for (j = 0; j < ctx.sc->event_classes->len; j++) { + ctx.ec = ctx.sc->event_classes->pdata[j]; - ir_ec = ctf_event_class_to_ir(ec, ir_sc, tc, sc); - if (!ir_ec) { - ret = -1; - goto end; - } + ctf_event_class_to_ir(&ctx); + ctx.ec = NULL; } + + ctx.sc = NULL; } end: