X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=plugins%2Fctf%2Ffs-sink%2Ftranslate-trace-ir-to-ctf-ir.c;h=699b3a5b620d9bb6abb81994704285662f6819f6;hp=9f0026c7bd1574fc8cf22506da25ccf0700e45b2;hb=11476be369af3c9e283803c64c494f21dfc79e06;hpb=15fe47e0499a9805421da82a25c026f3eb359eaa diff --git a/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c b/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c index 9f0026c7..699b3a5b 100644 --- a/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c +++ b/plugins/ctf/fs-sink/translate-trace-ir-to-ctf-ir.c @@ -154,15 +154,6 @@ void cur_path_stack_pop(struct ctx *ctx) g_array_set_size(ctx->cur_path, ctx->cur_path->len - 1); } -static inline -struct field_path_elem *get_field_path_elem( - GArray *full_field_path, uint64_t i) -{ - return &g_array_index(full_field_path, struct field_path_elem, - i); -} - - /* * Creates a relative field ref (a single name) from IR field path * `tgt_ir_field_path`. @@ -183,7 +174,7 @@ int create_relative_field_ref(struct ctx *ctx, struct fs_sink_ctf_field_class *tgt_fc = NULL; uint64_t i; int64_t si; - const char *tgt_fc_name; + const char *tgt_fc_name = NULL; struct field_path_elem *field_path_elem; /* Get target field class's name */ @@ -210,21 +201,29 @@ int create_relative_field_ref(struct ctx *ctx, i = 0; - while (i < bt_field_path_get_index_count(tgt_ir_field_path)) { - uint64_t index = bt_field_path_get_index_by_index( - tgt_ir_field_path, i); + while (i < bt_field_path_get_item_count(tgt_ir_field_path)) { + const bt_field_path_item *fp_item = + bt_field_path_borrow_item_by_index_const( + tgt_ir_field_path, i); struct fs_sink_ctf_named_field_class *named_fc = NULL; BT_ASSERT(tgt_fc); + BT_ASSERT(fp_item); switch (tgt_fc->type) { case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT: + BT_ASSERT(bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_INDEX); named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index( - (void *) tgt_fc, index); + (void *) tgt_fc, + bt_field_path_item_index_get_index(fp_item)); break; case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT: + BT_ASSERT(bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_INDEX); named_fc = fs_sink_ctf_field_class_variant_borrow_option_by_index( - (void *) tgt_fc, index); + (void *) tgt_fc, + bt_field_path_item_index_get_index(fp_item)); break; case FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY: case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE: @@ -232,6 +231,8 @@ int create_relative_field_ref(struct ctx *ctx, struct fs_sink_ctf_field_class_array_base *array_base_fc = (void *) tgt_fc; + BT_ASSERT(bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT); tgt_fc = array_base_fc->elem_fc; break; } @@ -360,25 +361,34 @@ int create_absolute_field_ref(struct ctx *ctx, BT_ASSERT(fc); - for (i = 0; i < bt_field_path_get_index_count(tgt_ir_field_path); i++) { - uint64_t index = bt_field_path_get_index_by_index( - tgt_ir_field_path, i); + for (i = 0; i < bt_field_path_get_item_count(tgt_ir_field_path); i++) { + const bt_field_path_item *fp_item = + bt_field_path_borrow_item_by_index_const( + tgt_ir_field_path, i); struct fs_sink_ctf_named_field_class *named_fc = NULL; + if (bt_field_path_item_get_type(fp_item) != + BT_FIELD_PATH_ITEM_TYPE_INDEX) { + /* Not supported by TSDL 1.8 */ + ret = -1; + goto end; + } + switch (fc->type) { case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT: + BT_ASSERT(bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_INDEX); named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index( - (void *) fc, index); + (void *) fc, + bt_field_path_item_index_get_index(fp_item)); break; case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT: + BT_ASSERT(bt_field_path_item_get_type(fp_item) == + BT_FIELD_PATH_ITEM_TYPE_INDEX); named_fc = fs_sink_ctf_field_class_variant_borrow_option_by_index( - (void *) fc, index); + (void *) fc, + bt_field_path_item_index_get_index(fp_item)); break; - case FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY: - case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE: - /* Not supported by TSDL 1.8 */ - ret = -1; - goto end; default: abort(); } @@ -886,23 +896,26 @@ end: * sequence field class. */ static -int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name, - struct fs_sink_ctf_field_class *parent_fc) +int set_field_refs(struct fs_sink_ctf_field_class * const fc, + const char *fc_name, struct fs_sink_ctf_field_class *parent_fc) { int ret = 0; + enum fs_sink_ctf_field_class_type fc_type; BT_ASSERT(fc); - switch (fc->type) { + fc_type = fc->type; + + switch (fc_type) { 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_variant *var_fc; + struct fs_sink_ctf_field_class_variant *var_fc = NULL; struct fs_sink_ctf_named_field_class *named_fc; - if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) { + if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) { struct_fc = (void *) fc; len = struct_fc->members->len; } else { @@ -915,7 +928,7 @@ int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name, } for (i = 0; i < len; i++) { - if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) { + if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) { named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index( struct_fc, i); } else { @@ -938,7 +951,7 @@ int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name, struct fs_sink_ctf_field_class_array_base *array_base_fc = (void *) fc; - if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) { + if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) { ret = set_field_ref(fc, fc_name, parent_fc); if (ret) { goto end;