X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Fcommon%2Fmetadata%2Fctf-meta-update-in-ir.c;h=806a9197368245abde9b665ccd86033d91e75a3d;hb=68b66a256a54d32992dfefeaad11eea88b7df234;hp=ca93a8d9a0ed78798d75cfd6a37dc0082ac56618;hpb=5cd6d0e5fa67c2bdd21dc153313618260595d7bc;p=babeltrace.git diff --git a/plugins/ctf/common/metadata/ctf-meta-update-in-ir.c b/plugins/ctf/common/metadata/ctf-meta-update-in-ir.c index ca93a8d9..806a9197 100644 --- a/plugins/ctf/common/metadata/ctf-meta-update-in-ir.c +++ b/plugins/ctf/common/metadata/ctf-meta-update-in-ir.c @@ -15,17 +15,75 @@ #define BT_LOG_TAG "PLUGIN-CTF-METADATA-META-UPDATE-IN-IR" #include "logging.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include +#include #include "ctf-meta-visitors.h" +static +void force_update_field_class_in_ir(struct ctf_field_class *fc, bool in_ir) +{ + uint64_t i; + + if (!fc) { + goto end; + } + + fc->in_ir = in_ir; + + switch (fc->type) { + case CTF_FIELD_CLASS_TYPE_STRUCT: + { + struct ctf_field_class_struct *struct_fc = (void *) fc; + + for (i = 0; i < struct_fc->members->len; i++) { + struct ctf_named_field_class *named_fc = + ctf_field_class_struct_borrow_member_by_index( + struct_fc, i); + + force_update_field_class_in_ir(named_fc->fc, in_ir); + } + + break; + } + case CTF_FIELD_CLASS_TYPE_VARIANT: + { + struct ctf_named_field_class *named_fc; + struct ctf_field_class_variant *var_fc = (void *) fc; + + for (i = 0; i < var_fc->options->len; i++) { + named_fc = + ctf_field_class_variant_borrow_option_by_index( + var_fc, i); + + force_update_field_class_in_ir(named_fc->fc, in_ir); + } + + break; + } + case CTF_FIELD_CLASS_TYPE_ARRAY: + case CTF_FIELD_CLASS_TYPE_SEQUENCE: + { + struct ctf_field_class_array_base *array_fc = (void *) fc; + + force_update_field_class_in_ir(array_fc->elem_fc, in_ir); + break; + } + default: + break; + } + +end: + return; +} + static void update_field_class_in_ir(struct ctf_field_class *fc, GHashTable *ft_dependents) @@ -36,29 +94,39 @@ void update_field_class_in_ir(struct ctf_field_class *fc, goto end; } - switch (fc->id) { - case CTF_FIELD_CLASS_ID_INT: - case CTF_FIELD_CLASS_ID_ENUM: + switch (fc->type) { + case CTF_FIELD_CLASS_TYPE_INT: + case CTF_FIELD_CLASS_TYPE_ENUM: { struct ctf_field_class_int *int_fc = (void *) fc; - if (int_fc->mapped_clock_class || - int_fc->meaning == CTF_FIELD_CLASS_MEANING_NONE || + /* + * Conditions to be in trace IR; one of: + * + * 1. Does NOT have a mapped clock class AND does not + * have a special meaning. + * 2. Another field class depends on it. + */ + if ((!int_fc->mapped_clock_class && + int_fc->meaning == CTF_FIELD_CLASS_MEANING_NONE) || bt_g_hash_table_contains(ft_dependents, fc)) { - /* - * Field class does not update a clock, has no - * special meaning, and no sequence/variant - * field class which is part of IR depends on it. - */ fc->in_ir = true; } break; } - case CTF_FIELD_CLASS_ID_STRUCT: + case CTF_FIELD_CLASS_TYPE_STRUCT: { struct ctf_field_class_struct *struct_fc = (void *) fc; + /* + * Make it part of IR if it's empty because it was + * originally empty. + */ + if (struct_fc->members->len == 0) { + fc->in_ir = true; + } + /* Reverse order */ for (i = (int64_t) struct_fc->members->len - 1; i >= 0; i--) { struct ctf_named_field_class *named_fc = @@ -75,7 +143,7 @@ void update_field_class_in_ir(struct ctf_field_class *fc, break; } - case CTF_FIELD_CLASS_ID_VARIANT: + case CTF_FIELD_CLASS_TYPE_VARIANT: { struct ctf_named_field_class *named_fc; struct ctf_field_class_variant *var_fc = (void *) fc; @@ -125,15 +193,15 @@ void update_field_class_in_ir(struct ctf_field_class *fc, break; } - case CTF_FIELD_CLASS_ID_ARRAY: - case CTF_FIELD_CLASS_ID_SEQUENCE: + case CTF_FIELD_CLASS_TYPE_ARRAY: + case CTF_FIELD_CLASS_TYPE_SEQUENCE: { struct ctf_field_class_array_base *array_fc = (void *) fc; update_field_class_in_ir(array_fc->elem_fc, ft_dependents); fc->in_ir = array_fc->elem_fc->in_ir; - if (fc->id == CTF_FIELD_CLASS_ID_ARRAY) { + if (fc->type == CTF_FIELD_CLASS_TYPE_ARRAY) { struct ctf_field_class_array *arr_fc = (void *) fc; assert(arr_fc->meaning == CTF_FIELD_CLASS_MEANING_NONE || @@ -147,7 +215,7 @@ void update_field_class_in_ir(struct ctf_field_class *fc, fc->in_ir = false; array_fc->elem_fc->in_ir = false; } - } else if (fc->id == CTF_FIELD_CLASS_ID_SEQUENCE) { + } else if (fc->type == CTF_FIELD_CLASS_TYPE_SEQUENCE) { if (fc->in_ir) { struct ctf_field_class_sequence *seq_fc = (void *) fc; @@ -208,16 +276,16 @@ int ctf_trace_class_update_in_ir(struct ctf_trace_class *ctf_tc) if (!sc->is_translated) { update_field_class_in_ir(sc->event_common_context_fc, ft_dependents); - update_field_class_in_ir(sc->event_header_fc, - ft_dependents); + force_update_field_class_in_ir(sc->event_header_fc, + false); update_field_class_in_ir(sc->packet_context_fc, ft_dependents); } } if (!ctf_tc->is_translated) { - update_field_class_in_ir(ctf_tc->packet_header_fc, - ft_dependents); + force_update_field_class_in_ir(ctf_tc->packet_header_fc, + false); } g_hash_table_destroy(ft_dependents);