X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Fresolve-field-path.c;h=47da398684587bbb703c770798849343bfa303fc;hb=fabfe03472e26e997f9bfaec3fb075e6dbb029dd;hp=59910bdc1e02fcb6264050e6549d9cf9cfb80801;hpb=9c08c816a55bbc538957648b49d41354e43c7cdf;p=babeltrace.git diff --git a/src/lib/trace-ir/resolve-field-path.c b/src/lib/trace-ir/resolve-field-path.c index 59910bdc..47da3986 100644 --- a/src/lib/trace-ir/resolve-field-path.c +++ b/src/lib/trace-ir/resolve-field-path.c @@ -47,10 +47,31 @@ bool find_field_class_recursive(struct bt_field_class *fc, } switch (fc->type) { + 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: + { + struct bt_field_class_option *opt_fc = (void *) fc; + struct bt_field_path_item item = { + .type = BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT, + .index = UINT64_C(-1), + }; + + bt_field_path_append_item(field_path, &item); + found = find_field_class_recursive(opt_fc->content_fc, + tgt_fc, field_path); + if (found) { + goto end; + } + + bt_field_path_remove_last_item(field_path); + break; + } case BT_FIELD_CLASS_TYPE_STRUCTURE: 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: { struct bt_field_class_named_field_class_container *container_fc = (void *) fc; @@ -105,7 +126,7 @@ end: static int find_field_class(struct bt_field_class *root_fc, - enum bt_scope root_scope, struct bt_field_class *tgt_fc, + enum bt_field_path_scope root_scope, struct bt_field_class *tgt_fc, struct bt_field_path **ret_field_path) { int ret = 0; @@ -139,25 +160,25 @@ struct bt_field_path *find_field_class_in_ctx(struct bt_field_class *fc, struct bt_field_path *field_path = NULL; int ret; - ret = find_field_class(ctx->packet_context, BT_SCOPE_PACKET_CONTEXT, + ret = find_field_class(ctx->packet_context, BT_FIELD_PATH_SCOPE_PACKET_CONTEXT, fc, &field_path); if (ret || field_path) { goto end; } ret = find_field_class(ctx->event_common_context, - BT_SCOPE_EVENT_COMMON_CONTEXT, fc, &field_path); + BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT, fc, &field_path); if (ret || field_path) { goto end; } ret = find_field_class(ctx->event_specific_context, - BT_SCOPE_EVENT_SPECIFIC_CONTEXT, fc, &field_path); + BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT, fc, &field_path); if (ret || field_path) { goto end; } - ret = find_field_class(ctx->event_payload, BT_SCOPE_EVENT_PAYLOAD, + ret = find_field_class(ctx->event_payload, BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD, fc, &field_path); if (ret || field_path) { goto end; @@ -214,16 +235,16 @@ end: BT_ASSERT_PRE_DEV_FUNC static inline struct bt_field_class *borrow_root_field_class( - struct bt_resolve_field_path_context *ctx, enum bt_scope scope) + struct bt_resolve_field_path_context *ctx, enum bt_field_path_scope scope) { switch (scope) { - case BT_SCOPE_PACKET_CONTEXT: + case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT: return ctx->packet_context; - case BT_SCOPE_EVENT_COMMON_CONTEXT: + case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT: return ctx->event_common_context; - case BT_SCOPE_EVENT_SPECIFIC_CONTEXT: + case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT: return ctx->event_specific_context; - case BT_SCOPE_EVENT_PAYLOAD: + case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD: return ctx->event_payload; default: abort(); @@ -241,10 +262,22 @@ struct bt_field_class *borrow_child_field_class( struct bt_field_class *child_fc = NULL; switch (parent_fc->type) { + 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: + { + struct bt_field_class_option *opt_fc = (void *) parent_fc; + + BT_ASSERT(fp_item->type == + BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT); + child_fc = opt_fc->content_fc; + break; + } case BT_FIELD_CLASS_TYPE_STRUCTURE: 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: { struct bt_field_class_named_field_class_container *container_fc = (void *) parent_fc; @@ -296,9 +329,13 @@ bool target_field_path_in_different_scope_has_struct_fc_only( if (fc->type == BT_FIELD_CLASS_TYPE_STATIC_ARRAY || fc->type == BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY || + fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR || + fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR || + fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR || + fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR || fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR || - fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR || - fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR) { + fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR || + fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR) { is_valid = false; goto end; } @@ -415,9 +452,13 @@ bool lca_to_target_has_struct_fc_only(struct bt_field_path *src_field_path, if (tgt_fc->type == BT_FIELD_CLASS_TYPE_STATIC_ARRAY || tgt_fc->type == BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY || + tgt_fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR || + tgt_fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR || + tgt_fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR || + tgt_fc->type == BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR || tgt_fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR || - tgt_fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR || - tgt_fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR) { + tgt_fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR || + tgt_fc->type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR) { is_valid = false; goto end; } @@ -527,6 +568,24 @@ int bt_resolve_field_paths(struct bt_field_class *fc, /* Resolving part for dynamic array and variant field classes */ switch (fc->type) { + 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: + { + struct bt_field_class_option_with_selector *opt_fc = (void *) fc; + + if (opt_fc->selector_fc) { + BT_ASSERT(!opt_fc->selector_field_path); + opt_fc->selector_field_path = resolve_field_path( + fc, opt_fc->selector_fc, ctx); + if (!opt_fc->selector_field_path) { + ret = -1; + goto end; + } + } + + break; + } case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY: { struct bt_field_class_array_dynamic *dyn_array_fc = (void *) fc; @@ -543,8 +602,8 @@ int bt_resolve_field_paths(struct bt_field_class *fc, break; } - 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: { struct bt_field_class_variant_with_selector *var_fc = (void *) fc; @@ -566,10 +625,20 @@ int bt_resolve_field_paths(struct bt_field_class *fc, /* Recursive part */ switch (fc->type) { + 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: + { + struct bt_field_class_option *opt_fc = (void *) fc; + + ret = bt_resolve_field_paths(opt_fc->content_fc, ctx); + break; + } case BT_FIELD_CLASS_TYPE_STRUCTURE: 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: { struct bt_field_class_named_field_class_container *container_fc = (void *) fc;