X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Fcommon%2Fmetadata%2Fvisitor-generate-ir.c;h=a7ea0f0978f87cae6316560a3b026a8f936c88a0;hb=d6701381e38348beced306a0ad9947fb3fb8ad82;hp=5b64ad28c953c90fbd91fdcc32f5fc5e3968ca28;hpb=2242b43d4f50ebdeabb124154fb8ac602c563536;p=babeltrace.git diff --git a/src/plugins/ctf/common/metadata/visitor-generate-ir.c b/src/plugins/ctf/common/metadata/visitor-generate-ir.c index 5b64ad28..a7ea0f09 100644 --- a/src/plugins/ctf/common/metadata/visitor-generate-ir.c +++ b/src/plugins/ctf/common/metadata/visitor-generate-ir.c @@ -1,36 +1,16 @@ /* - * ctf-visitor-generate-ir.c + * SPDX-License-Identifier: MIT * - * Common Trace Format metadata visitor (generates CTF IR objects). - * - * Based on older ctf-visitor-generate-io-struct.c. - * - * Copyright 2010 - Mathieu Desnoyers - * Copyright 2015-2018 - Philippe Proulx - * - * 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: + * Copyright 2010 Mathieu Desnoyers + * Copyright 2015-2018 Philippe Proulx * - * 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. + * Common Trace Format metadata visitor (generates CTF IR objects). */ #define BT_COMP_LOG_SELF_COMP (ctx->log_cfg.self_comp) #define BT_LOG_OUTPUT_LEVEL (ctx->log_cfg.log_level) #define BT_LOG_TAG "PLUGIN/CTF/META/IR-VISITOR" -#include "plugins/comp-logging.h" +#include "logging/comp-logging.h" #include #include @@ -49,7 +29,6 @@ #include "logging.h" #include "scanner.h" -#include "parser.h" #include "ast.h" #include "decoder.h" #include "ctf-meta.h" @@ -679,61 +658,6 @@ static int visit_field_class_specifier_list(struct ctx *ctx, struct ctf_node *ts_list, struct ctf_field_class **decl); -static -char *remove_underscores_from_field_ref(struct ctx *ctx, const char *field_ref) -{ - const char *in_ch; - char *out_ch; - char *ret; - enum { - UNDERSCORE_REMOVE_STATE_REMOVE_NEXT_UNDERSCORE, - UNDERSCORE_REMOVE_STATE_DO_NOT_REMOVE_NEXT_UNDERSCORE, - } state = UNDERSCORE_REMOVE_STATE_REMOVE_NEXT_UNDERSCORE; - - BT_ASSERT(field_ref); - ret = calloc(strlen(field_ref) + 1, 1); - if (!ret) { - BT_COMP_LOGE("Failed to allocate a string: size=%zu", - strlen(field_ref) + 1); - goto end; - } - - in_ch = field_ref; - out_ch = ret; - - while (*in_ch != '\0') { - switch (*in_ch) { - case ' ': - case '\t': - /* Remove whitespace */ - in_ch++; - continue; - case '_': - if (state == UNDERSCORE_REMOVE_STATE_REMOVE_NEXT_UNDERSCORE) { - in_ch++; - state = UNDERSCORE_REMOVE_STATE_DO_NOT_REMOVE_NEXT_UNDERSCORE; - continue; - } - - goto copy; - case '.': - state = UNDERSCORE_REMOVE_STATE_REMOVE_NEXT_UNDERSCORE; - goto copy; - default: - state = UNDERSCORE_REMOVE_STATE_DO_NOT_REMOVE_NEXT_UNDERSCORE; - goto copy; - } - -copy: - *out_ch = *in_ch; - in_ch++; - out_ch++; - } - -end: - return ret; -} - static int is_unary_string(struct bt_list_head *head) { @@ -753,59 +677,6 @@ int is_unary_string(struct bt_list_head *head) return ret; } -static -char *concatenate_unary_strings(struct bt_list_head *head) -{ - int i = 0; - GString *str; - struct ctf_node *node; - - str = g_string_new(NULL); - BT_ASSERT(str); - - bt_list_for_each_entry(node, head, siblings) { - char *src_string; - - if ( - node->type != NODE_UNARY_EXPRESSION || - node->u.unary_expression.type != UNARY_STRING || - !( - ( - node->u.unary_expression.link != - UNARY_LINK_UNKNOWN - ) ^ (i == 0) - ) - ) { - goto error; - } - - switch (node->u.unary_expression.link) { - case UNARY_DOTLINK: - g_string_append(str, "."); - break; - case UNARY_ARROWLINK: - g_string_append(str, "->"); - break; - case UNARY_DOTDOTDOT: - g_string_append(str, "..."); - break; - default: - break; - } - - src_string = node->u.unary_expression.u.string; - g_string_append(str, src_string); - i++; - } - - /* Destroys the container, returns the underlying string */ - return g_string_free(str, FALSE); - -error: - /* This always returns NULL */ - return g_string_free(str, TRUE); -} - static const char *get_map_clock_name_value(struct bt_list_head *head) { @@ -979,36 +850,10 @@ end: static int get_unary_uuid(struct ctx *ctx, struct bt_list_head *head, - uint8_t *uuid) + bt_uuid_t uuid) { - int i = 0; - int ret = 0; - struct ctf_node *node; - - bt_list_for_each_entry(node, head, siblings) { - int uexpr_type = node->u.unary_expression.type; - int uexpr_link = node->u.unary_expression.link; - const char *src_string; - - if (node->type != NODE_UNARY_EXPRESSION || - uexpr_type != UNARY_STRING || - uexpr_link != UNARY_LINK_UNKNOWN || - i != 0) { - ret = -EINVAL; - goto end; - } - - src_string = node->u.unary_expression.u.string; - ret = bt_uuid_from_str(src_string, uuid); - if (ret) { - _BT_COMP_LOGE_NODE(node, - "Cannot parse UUID: uuid=\"%s\"", src_string); - goto end; - } - } - -end: - return ret; + return ctf_ast_get_unary_uuid(head, uuid, ctx->log_cfg.log_level, + ctx->log_cfg.self_comp); } static @@ -1064,7 +909,7 @@ enum ctf_byte_order byte_order_from_unary_expr(struct ctx *ctx, struct ctf_node *unary_expr) { const char *str; - enum ctf_byte_order bo = -1; + enum ctf_byte_order bo = CTF_BYTE_ORDER_UNKNOWN; if (unary_expr->u.unary_expression.type != UNARY_STRING) { _BT_COMP_LOGE_NODE(unary_expr, @@ -1385,10 +1230,6 @@ int visit_field_class_declarator(struct ctx *ctx, const char *id = node_field_class_declarator->u.field_class_declarator.u.id; - if (id[0] == '_') { - id++; - } - *field_name = g_quark_from_string(id); } else { *field_name = 0; @@ -1440,7 +1281,7 @@ int visit_field_class_declarator(struct ctx *ctx, { /* Lookup unsigned integer definition, create seq. */ struct ctf_field_class_sequence *seq_decl = NULL; - char *length_name = concatenate_unary_strings(length); + char *length_name = ctf_ast_concatenate_unary_strings(length); if (!length_name) { _BT_COMP_LOGE_NODE(node_field_class_declarator, @@ -1493,24 +1334,12 @@ int visit_field_class_declarator(struct ctx *ctx, nested_decl = NULL; decl = (void *) array_decl; } else { - char *length_name_no_underscore = - remove_underscores_from_field_ref(ctx, - length_name); - if (!length_name_no_underscore) { - /* - * remove_underscores_from_field_ref() - * logs errors - */ - ret = -EINVAL; - goto error; - } seq_decl = ctf_field_class_sequence_create(); BT_ASSERT(seq_decl); seq_decl->base.elem_fc = nested_decl; nested_decl = NULL; g_string_assign(seq_decl->length_ref, - length_name_no_underscore); - free(length_name_no_underscore); + length_name); decl = (void *) seq_decl; } @@ -2067,17 +1896,7 @@ int visit_variant_decl(struct ctx *ctx, const char *name, * At this point, we have a fresh untagged variant; nobody * else owns it. Set its tag now. */ - char *tag_no_underscore = - remove_underscores_from_field_ref(ctx, tag); - - if (!tag_no_underscore) { - /* remove_underscores_from_field_ref() logs errors */ - goto error; - } - - g_string_assign(untagged_variant_decl->tag_ref, - tag_no_underscore); - free(tag_no_underscore); + g_string_assign(untagged_variant_decl->tag_ref, tag); *variant_decl = untagged_variant_decl; untagged_variant_decl = NULL; } @@ -2118,7 +1937,6 @@ int visit_enum_decl_entry(struct ctx *ctx, struct ctf_node *enumerator, .value.u = 0, }; const char *label = enumerator->u.enumerator.id; - const char *effective_label = label; struct bt_list_head *values = &enumerator->u.enumerator.values; bt_list_for_each_entry(iter, values, siblings) { @@ -2185,19 +2003,7 @@ int visit_enum_decl_entry(struct ctx *ctx, struct ctf_node *enumerator, last->value.u = end.value.u + 1; } - if (label[0] == '_') { - /* - * Strip the first underscore of any enumeration field - * class's label in case this enumeration FC is used as - * a variant FC tag later. The variant FC choice names - * could also start with `_`, in which case the prefix - * is removed, and it the resulting choice name needs to - * match tag labels. - */ - effective_label = &label[1]; - } - - ctf_field_class_enum_append_mapping(enum_decl, effective_label, + ctf_field_class_enum_map_range(enum_decl, label, start.value.u, end.value.u); return 0; @@ -2423,7 +2229,7 @@ int visit_integer_decl(struct ctx *ctx, } byte_order = get_real_byte_order(ctx, right); - if (byte_order == -1) { + if (byte_order == CTF_BYTE_ORDER_UNKNOWN) { _BT_COMP_LOGE_NODE(right, "Invalid `byte_order` attribute in integer field class: " "ret=%d", ret); @@ -2539,7 +2345,7 @@ int visit_integer_decl(struct ctx *ctx, } case UNARY_STRING: { - char *s_right = concatenate_unary_strings( + char *s_right = ctf_ast_concatenate_unary_strings( &expression->u.ctf_expression.right); if (!s_right) { _BT_COMP_LOGE_NODE(right, @@ -2606,7 +2412,7 @@ int visit_integer_decl(struct ctx *ctx, goto error; } - s_right = concatenate_unary_strings( + s_right = ctf_ast_concatenate_unary_strings( &expression->u.ctf_expression.right); if (!s_right) { _BT_COMP_LOGE_NODE(right, @@ -2658,7 +2464,7 @@ int visit_integer_decl(struct ctx *ctx, get_map_clock_name_value( &expression->u.ctf_expression.right); if (!clock_name) { - char *s_right = concatenate_unary_strings( + char *s_right = ctf_ast_concatenate_unary_strings( &expression->u.ctf_expression.right); if (!s_right) { @@ -2770,7 +2576,7 @@ int visit_floating_point_number_decl(struct ctx *ctx, } byte_order = get_real_byte_order(ctx, right); - if (byte_order == -1) { + if (byte_order == CTF_BYTE_ORDER_UNKNOWN) { _BT_COMP_LOGE_NODE(right, "Invalid `byte_order` attribute in floating point number field class: " "ret=%d", ret); @@ -2962,7 +2768,7 @@ int visit_string_decl(struct ctx *ctx, goto error; } - s_right = concatenate_unary_strings( + s_right = ctf_ast_concatenate_unary_strings( &expression->u.ctf_expression.right); if (!s_right) { _BT_COMP_LOGE_NODE(right, @@ -3162,7 +2968,7 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, break; case NODE_CTF_EXPRESSION: { - left = concatenate_unary_strings(&node->u.ctf_expression.left); + left = ctf_ast_concatenate_unary_strings(&node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(node, "Cannot concatenate unary strings."); ret = -EINVAL; @@ -3267,6 +3073,7 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, _SET(set, _EVENT_FIELDS_SET); } else if (strcmp(left, "loglevel") == 0) { uint64_t loglevel_value; + bool is_log_level_known = true; bt_event_class_log_level log_level = -1; if (_IS_SET(set, _EVENT_LOG_LEVEL_SET)) { @@ -3332,12 +3139,13 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, log_level = BT_EVENT_CLASS_LOG_LEVEL_DEBUG; break; default: + is_log_level_known = false; _BT_COMP_LOGW_NODE(node, "Not setting event class's log level because its value is unknown: " "log-level=%" PRIu64, loglevel_value); } - if (log_level != -1) { - event_class->log_level = log_level; + if (is_log_level_known) { + ctf_event_class_set_log_level(event_class, log_level); } _SET(set, _EVENT_LOG_LEVEL_SET); @@ -3351,7 +3159,7 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, goto error; } - right = concatenate_unary_strings( + right = ctf_ast_concatenate_unary_strings( &node->u.ctf_expression.right); if (!right) { _BT_COMP_LOGE_NODE(node, @@ -3407,7 +3215,7 @@ char *get_event_decl_name(struct ctx *ctx, struct ctf_node *node) continue; } - left = concatenate_unary_strings(&iter->u.ctf_expression.left); + left = ctf_ast_concatenate_unary_strings(&iter->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(iter, "Cannot concatenate unary strings."); @@ -3415,7 +3223,7 @@ char *get_event_decl_name(struct ctx *ctx, struct ctf_node *node) } if (strcmp(left, "name") == 0) { - name = concatenate_unary_strings( + name = ctf_ast_concatenate_unary_strings( &iter->u.ctf_expression.right); if (!name) { _BT_COMP_LOGE_NODE(iter, @@ -3666,6 +3474,8 @@ int auto_map_fields_to_trace_clock_class(struct ctx *ctx, } else if (root_fc->type == CTF_FIELD_CLASS_TYPE_VARIANT) { named_fc = ctf_field_class_variant_borrow_option_by_index( var_fc, i); + } else { + bt_common_abort(); } if (strcmp(named_fc->name->str, field_name) == 0) { @@ -3720,7 +3530,7 @@ int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node, break; case NODE_CTF_EXPRESSION: { - left = concatenate_unary_strings(&node->u.ctf_expression.left); + left = ctf_ast_concatenate_unary_strings(&node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(node, "Cannot concatenate unary strings."); ret = -EINVAL; @@ -3911,6 +3721,7 @@ int visit_stream_decl(struct ctx *ctx, struct ctf_node *node) _BT_COMP_LOGE_NODE(node, "Stream class has a `id` attribute, " "but trace has no packet header field class."); + ret = -EINVAL; goto error; } @@ -3920,6 +3731,7 @@ int visit_stream_decl(struct ctx *ctx, struct ctf_node *node) _BT_COMP_LOGE_NODE(node, "Stream class has a `id` attribute, " "but trace's packet header field class has no `stream_id` field."); + ret = -EINVAL; goto error; } @@ -3928,6 +3740,7 @@ int visit_stream_decl(struct ctx *ctx, struct ctf_node *node) _BT_COMP_LOGE_NODE(node, "Stream class has a `id` attribute, " "but trace's packet header field class's `stream_id` field is not an integer field class."); + ret = -EINVAL; goto error; } } else { @@ -3996,7 +3809,7 @@ int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set) break; case NODE_CTF_EXPRESSION: { - left = concatenate_unary_strings(&node->u.ctf_expression.left); + left = ctf_ast_concatenate_unary_strings(&node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(node, "Cannot concatenate unary strings."); ret = -EINVAL; @@ -4022,6 +3835,7 @@ int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set) if (val != 1) { _BT_COMP_LOGE_NODE(node, "Invalid trace's `minor` attribute: expecting 1."); + ret = -EINVAL; goto error; } @@ -4046,6 +3860,7 @@ int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set) if (val != 8) { _BT_COMP_LOGE_NODE(node, "Invalid trace's `minor` attribute: expecting 8."); + ret = -EINVAL; goto error; } @@ -4078,7 +3893,7 @@ int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set) goto error; } - BT_ASSERT(ctx->ctf_tc->default_byte_order != -1); + BT_ASSERT(ctx->ctf_tc->default_byte_order != CTF_BYTE_ORDER_UNKNOWN); _SET(set, _TRACE_BYTE_ORDER_SET); } else if (strcmp(left, "packet.header") == 0) { if (_IS_SET(set, _TRACE_PACKET_HEADER_SET)) { @@ -4214,7 +4029,7 @@ int visit_env(struct ctx *ctx, struct ctf_node *node) goto error; } - left = concatenate_unary_strings( + left = ctf_ast_concatenate_unary_strings( &entry_node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(entry_node, @@ -4224,7 +4039,7 @@ int visit_env(struct ctx *ctx, struct ctf_node *node) } if (is_unary_string(right_head)) { - char *right = concatenate_unary_strings(right_head); + char *right = ctf_ast_concatenate_unary_strings(right_head); if (!right) { _BT_COMP_LOGE_NODE(entry_node, @@ -4299,7 +4114,7 @@ int set_trace_byte_order(struct ctx *ctx, struct ctf_node *trace_node) if (node->type == NODE_CTF_EXPRESSION) { struct ctf_node *right_node; - left = concatenate_unary_strings( + left = ctf_ast_concatenate_unary_strings( &node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(node, @@ -4324,7 +4139,7 @@ int set_trace_byte_order(struct ctx *ctx, struct ctf_node *trace_node) struct ctf_node, siblings); bo = byte_order_from_unary_expr(ctx, right_node); - if (bo == -1) { + if (bo == CTF_BYTE_ORDER_UNKNOWN) { _BT_COMP_LOGE_NODE(node, "Invalid `byte_order` attribute in trace (`trace` block): " "expecting `le`, `be`, or `network`."); @@ -4376,7 +4191,7 @@ int visit_clock_decl_entry(struct ctx *ctx, struct ctf_node *entry_node, goto error; } - left = concatenate_unary_strings(&entry_node->u.ctf_expression.left); + left = ctf_ast_concatenate_unary_strings(&entry_node->u.ctf_expression.left); if (!left) { _BT_COMP_LOGE_NODE(entry_node, "Cannot concatenate unary strings."); ret = -EINVAL; @@ -4392,7 +4207,7 @@ int visit_clock_decl_entry(struct ctx *ctx, struct ctf_node *entry_node, goto error; } - right = concatenate_unary_strings( + right = ctf_ast_concatenate_unary_strings( &entry_node->u.ctf_expression.right); if (!right) { _BT_COMP_LOGE_NODE(entry_node, @@ -4434,7 +4249,7 @@ int visit_clock_decl_entry(struct ctx *ctx, struct ctf_node *entry_node, goto error; } - right = concatenate_unary_strings( + right = ctf_ast_concatenate_unary_strings( &entry_node->u.ctf_expression.right); if (!right) { _BT_COMP_LOGE_NODE(entry_node, @@ -4595,6 +4410,17 @@ void calibrate_clock_class_offsets(int64_t *offset_seconds, } } +static +void apply_clock_class_is_absolute(struct ctx *ctx, + struct ctf_clock_class *clock) +{ + if (ctx->decoder_config.force_clock_class_origin_unix_epoch) { + clock->is_absolute = true; + } + + return; +} + static void apply_clock_class_offset(struct ctx *ctx, struct ctf_clock_class *clock) @@ -4722,6 +4548,7 @@ int visit_clock_decl(struct ctx *ctx, struct ctf_node *clock_node) clock->offset_seconds = offset_seconds; clock->offset_cycles = offset_cycles; apply_clock_class_offset(ctx, clock); + apply_clock_class_is_absolute(ctx, clock); g_ptr_array_add(ctx->ctf_tc->clock_classes, clock); clock = NULL; @@ -4806,7 +4633,9 @@ struct ctf_visitor_generate_ir *ctf_visitor_generate_ir_create( /* Create visitor's context */ ctx = ctx_create(decoder_config); if (!ctx) { - BT_COMP_LOGE_STR("Cannot create visitor's context."); + BT_COMP_LOG_CUR_LVL(BT_LOG_ERROR, decoder_config->log_level, + decoder_config->self_comp, + "Cannot create visitor's context."); goto error; } @@ -4832,7 +4661,7 @@ bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class( { struct ctx *ctx = (void *) visitor; - BT_ASSERT(ctx); + BT_ASSERT_DBG(ctx); if (ctx->trace_class) { bt_trace_class_get_ref(ctx->trace_class); @@ -4847,8 +4676,8 @@ struct ctf_trace_class *ctf_visitor_generate_ir_borrow_ctf_trace_class( { struct ctx *ctx = (void *) visitor; - BT_ASSERT(ctx); - BT_ASSERT(ctx->ctf_tc); + BT_ASSERT_DBG(ctx); + BT_ASSERT_DBG(ctx->ctf_tc); return ctx->ctf_tc; } @@ -4874,7 +4703,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, * have the native byte order yet, and we don't have any * trace block yet, then fail with EINCOMPLETE. */ - if (ctx->ctf_tc->default_byte_order == -1) { + if (ctx->ctf_tc->default_byte_order == CTF_BYTE_ORDER_UNKNOWN) { bt_list_for_each_entry(iter, &node->u.root.trace, siblings) { if (got_trace_decl) { _BT_COMP_LOGE_NODE(node, @@ -4904,7 +4733,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, BT_ASSERT(ctx->ctf_tc->default_byte_order == CTF_BYTE_ORDER_LITTLE || ctx->ctf_tc->default_byte_order == CTF_BYTE_ORDER_BIG); BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* Environment */ bt_list_for_each_entry(iter, &node->u.root.env, siblings) { @@ -4918,7 +4747,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* * Visit clock blocks. @@ -4934,7 +4763,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* * Visit root declarations next, as they can be used by any @@ -4952,7 +4781,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* Callsite blocks are not supported */ bt_list_for_each_entry(iter, &node->u.root.callsite, siblings) { @@ -4961,7 +4790,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* Trace */ bt_list_for_each_entry(iter, &node->u.root.trace, siblings) { @@ -4975,7 +4804,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* Streams */ bt_list_for_each_entry(iter, &node->u.root.stream, siblings) { @@ -4989,7 +4818,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); /* Events */ bt_list_for_each_entry(iter, &node->u.root.event, siblings) { @@ -5003,7 +4832,7 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, } BT_ASSERT(ctx->current_scope && - ctx->current_scope->parent_scope == NULL); + !ctx->current_scope->parent_scope); break; } default: @@ -5043,6 +4872,13 @@ int ctf_visitor_generate_ir_visit_node(struct ctf_visitor_generate_ir *visitor, goto end; } + /* Update structure/array/sequence alignments */ + ret = ctf_trace_class_update_alignments(ctx->ctf_tc); + if (ret) { + ret = -EINVAL; + goto end; + } + /* Resolve sequence lengths and variant tags */ ret = ctf_trace_class_resolve_field_classes(ctx->ctf_tc, &ctx->log_cfg); if (ret) {