#define BT_COMP_LOG_SELF_COMP (ctx->self_comp)
#define BT_LOG_OUTPUT_LEVEL (ctx->log_level)
#define BT_LOG_TAG "PLUGIN/SINK.CTF.FS/TRANSLATE-TRACE-IR-TO-CTF-IR"
-#include "plugins/comp-logging.h"
+#include "logging/comp-logging.h"
#include <babeltrace2/babeltrace.h>
#include "common/macros.h"
/* Weak */
struct fs_sink_ctf_event_class *cur_ec;
- bt_scope cur_scope;
+ bt_field_path_scope cur_scope;
/*
* Array of `struct field_path_elem` */
g_string_append(field_path_elem->name, name);
- if (ctx->cur_scope == BT_SCOPE_PACKET_CONTEXT) {
+ if (ctx->cur_scope == BT_FIELD_PATH_SCOPE_PACKET_CONTEXT) {
if (is_reserved_member_name(name, "packet_size") ||
is_reserved_member_name(name, "content_size") ||
is_reserved_member_name(name, "timestamp_begin") ||
/* Get target field class's name */
switch (bt_field_path_get_root_scope(tgt_ir_field_path)) {
- case BT_SCOPE_PACKET_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT:
BT_ASSERT(ctx->cur_sc);
tgt_fc = ctx->cur_sc->packet_context_fc;
break;
- case BT_SCOPE_EVENT_COMMON_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT:
BT_ASSERT(ctx->cur_sc);
tgt_fc = ctx->cur_sc->event_common_context_fc;
break;
- case BT_SCOPE_EVENT_SPECIFIC_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT:
BT_ASSERT(ctx->cur_ec);
tgt_fc = ctx->cur_ec->spec_context_fc;
break;
- case BT_SCOPE_EVENT_PAYLOAD:
+ case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD:
BT_ASSERT(ctx->cur_ec);
tgt_fc = ctx->cur_ec->payload_fc;
break;
uint64_t i;
switch (bt_field_path_get_root_scope(tgt_ir_field_path)) {
- case BT_SCOPE_PACKET_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT:
BT_ASSERT(ctx->cur_sc);
fc = ctx->cur_sc->packet_context_fc;
g_string_assign(tgt_field_ref, "stream.packet.context");
break;
- case BT_SCOPE_EVENT_COMMON_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT:
BT_ASSERT(ctx->cur_sc);
fc = ctx->cur_sc->event_common_context_fc;
g_string_assign(tgt_field_ref, "stream.event.context");
break;
- case BT_SCOPE_EVENT_SPECIFIC_CONTEXT:
+ case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT:
BT_ASSERT(ctx->cur_ec);
fc = ctx->cur_ec->spec_context_fc;
g_string_assign(tgt_field_ref, "event.context");
break;
- case BT_SCOPE_EVENT_PAYLOAD:
+ case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD:
BT_ASSERT(ctx->cur_ec);
fc = ctx->cur_ec->payload_fc;
g_string_assign(tgt_field_ref, "event.fields");
struct fs_sink_ctf_field_class **user_tgt_fc)
{
int ret;
- bt_scope tgt_scope;
+ bt_field_path_scope tgt_scope;
*create_before = false;
}
/*
- * This function returns whether or not a given field class `tag_fc`
- * is valid as the tag field class of the variant field class `fc`.
- *
- * CTF 1.8 requires that the tag field class be an enumeration field
- * class and that, for each variant field class option's range set, the
- * tag field class contains a mapping which has the option's name and an
- * equal range set.
- */
-static inline
-bool _is_variant_field_class_tag_valid(
- struct fs_sink_ctf_field_class_variant *fc,
- struct fs_sink_ctf_field_class *tag_fc)
-{
- bool is_valid = true;
- bt_field_class_type ir_tag_fc_type = bt_field_class_get_type(
- tag_fc->ir_fc);
- uint64_t i;
- GString *escaped_opt_name = g_string_new(NULL);
-
- BT_ASSERT(escaped_opt_name);
-
- if (ir_tag_fc_type != BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION &&
- ir_tag_fc_type != BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
- is_valid = false;
- goto end;
- }
-
- for (i = 0; i < bt_field_class_variant_get_option_count(
- fc->base.ir_fc); i++) {
- const bt_field_class_variant_option *var_opt_base =
- bt_field_class_variant_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const char *opt_name = bt_field_class_variant_option_get_name(
- var_opt_base);
-
- /*
- * If the option is named `name` in trace IR, then it
- * was _possibly_ named `_name` originally if it comes
- * from `src.ctf.fs`. This means the corresponding
- * enumeration field class mapping was also named
- * `_name`, but this one didn't change, as enumeration
- * FC mapping names are not escaped; they are literal
- * strings.
- *
- * The `sink.ctf.fs` component escapes all the variant
- * FC option names with `_`. Therefore the
- * _escaped name_ must match the original enumeration
- * FC mapping name.
- */
- g_string_assign(escaped_opt_name, "_");
- g_string_append(escaped_opt_name, opt_name);
-
- if (ir_tag_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
- const bt_field_class_variant_with_unsigned_selector_option *var_opt =
- bt_field_class_variant_with_unsigned_selector_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const bt_field_class_unsigned_enumeration_mapping *mapping;
- const bt_integer_range_set_unsigned *opt_ranges;
- const bt_integer_range_set_unsigned *mapping_ranges;
-
- mapping = bt_field_class_unsigned_enumeration_borrow_mapping_by_label_const(
- tag_fc->ir_fc, escaped_opt_name->str);
- if (!mapping) {
- is_valid = false;
- goto end;
- }
-
- opt_ranges = bt_field_class_variant_with_unsigned_selector_option_borrow_ranges_const(
- var_opt);
- mapping_ranges = bt_field_class_unsigned_enumeration_mapping_borrow_ranges_const(
- mapping);
- if (!bt_integer_range_set_unsigned_compare(opt_ranges,
- mapping_ranges)) {
- is_valid = false;
- goto end;
- }
- } else {
- const bt_field_class_variant_with_signed_selector_option *var_opt =
- bt_field_class_variant_with_signed_selector_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const bt_field_class_signed_enumeration_mapping *mapping;
- const bt_integer_range_set_signed *opt_ranges;
- const bt_integer_range_set_signed *mapping_ranges;
-
- mapping = bt_field_class_signed_enumeration_borrow_mapping_by_label_const(
- tag_fc->ir_fc, escaped_opt_name->str);
- if (!mapping) {
- is_valid = false;
- goto end;
- }
-
- opt_ranges = bt_field_class_variant_with_signed_selector_option_borrow_ranges_const(
- var_opt);
- mapping_ranges = bt_field_class_signed_enumeration_mapping_borrow_ranges_const(
- mapping);
- if (!bt_integer_range_set_signed_compare(opt_ranges,
- mapping_ranges)) {
- is_valid = false;
- goto end;
- }
- }
- }
-
-end:
- return is_valid;
-}
-
-/*
- * This function indicates whether or not a given variant FC option name
- * must be protected (with the `_` prefix).
+ * This function protects a given variant FC option name (with the `_`
+ * prefix) if required. On success, `name_buf->str` contains the variant
+ * FC option name to use (original option name or protected if
+ * required).
*
* One of the goals of `sink.ctf.fs` is to write a CTF trace which is as
* close as possible to an original CTF trace as decoded by
* FC options and enumeration FC mappings by range set.
*/
static
-int must_protect_variant_option_name(const bt_field_class *ir_var_fc,
+int maybe_protect_variant_option_name(const bt_field_class *ir_var_fc,
const bt_field_class *ir_tag_fc, uint64_t opt_i,
- GString *name_buf, bool *must_protect)
+ GString *name_buf)
{
int ret = 0;
uint64_t i;
const bt_field_class_variant_option *base_var_opt;
bool force_protect = false;
- *must_protect = false;
ir_var_fc_type = bt_field_class_get_type(ir_var_fc);
base_var_opt = bt_field_class_variant_borrow_option_by_index_const(
ir_var_fc, opt_i);
*/
force_protect = must_protect_identifier(ir_opt_name);
if (force_protect) {
- *must_protect = true;
g_string_assign(name_buf, "_");
g_string_append(name_buf, ir_opt_name);
} else {
/* No ranges: we're done */
goto end;
} if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR) {
- const bt_field_class_variant_with_unsigned_selector_option *var_opt =
- bt_field_class_variant_with_unsigned_selector_borrow_option_by_index_const(
+ const bt_field_class_variant_with_selector_unsigned_option *var_opt =
+ bt_field_class_variant_with_selector_unsigned_borrow_option_by_index_const(
ir_var_fc, opt_i);
opt_ranges =
- bt_field_class_variant_with_unsigned_selector_option_borrow_ranges_const(
+ bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const(
var_opt);
} else {
- const bt_field_class_variant_with_signed_selector_option *var_opt =
- bt_field_class_variant_with_signed_selector_borrow_option_by_index_const(
+ const bt_field_class_variant_with_selector_signed_option *var_opt =
+ bt_field_class_variant_with_selector_signed_borrow_option_by_index_const(
ir_var_fc, opt_i);
opt_ranges =
- bt_field_class_variant_with_signed_selector_option_borrow_ranges_const(
+ bt_field_class_variant_with_selector_signed_option_borrow_ranges_const(
var_opt);
}
i++) {
if (ir_var_fc_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR) {
const bt_field_class_enumeration_mapping *mapping_base;
- const bt_field_class_unsigned_enumeration_mapping *mapping;
+ const bt_field_class_enumeration_unsigned_mapping *mapping;
const bt_integer_range_set_unsigned *mapping_ranges;
- mapping = bt_field_class_unsigned_enumeration_borrow_mapping_by_index_const(
+ mapping = bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
ir_tag_fc, i);
- mapping_ranges = bt_field_class_unsigned_enumeration_mapping_borrow_ranges_const(
+ mapping_ranges = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
mapping);
if (bt_integer_range_set_unsigned_compare(opt_ranges,
mapping_ranges)) {
/* We have a winner */
mapping_base =
- bt_field_class_unsigned_enumeration_mapping_as_mapping_const(
+ bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
mapping);
mapping_label =
bt_field_class_enumeration_mapping_get_label(
}
} else {
const bt_field_class_enumeration_mapping *mapping_base;
- const bt_field_class_signed_enumeration_mapping *mapping;
+ const bt_field_class_enumeration_signed_mapping *mapping;
const bt_integer_range_set_signed *mapping_ranges;
- mapping = bt_field_class_signed_enumeration_borrow_mapping_by_index_const(
+ mapping = bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
ir_tag_fc, i);
- mapping_ranges = bt_field_class_signed_enumeration_mapping_borrow_ranges_const(
+ mapping_ranges = bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
mapping);
if (bt_integer_range_set_signed_compare(opt_ranges,
mapping_ranges)) {
/* We have a winner */
mapping_base =
- bt_field_class_signed_enumeration_mapping_as_mapping_const(
+ bt_field_class_enumeration_signed_mapping_as_mapping_const(
mapping);
mapping_label =
bt_field_class_enumeration_mapping_get_label(
ret = -1;
goto end;
}
-
- /*
- * If this comes from a `src.ctf.fs` source, it looks
- * like the variant FC option name was initially
- * protected: protect it again when going back to TSDL.
- */
- *must_protect = true;
}
end:
}
/*
- * Call must_protect_variant_option_name() for each
+ * Call maybe_protect_variant_option_name() for each
* option below. In that case we also want selector FC
* to contain as many mappings as the variant FC has
* options.
* create the appropriate selector field class.
*/
fc->tag_is_before = true;
+ goto validate_opts;
}
validate_opts:
* cur_path_stack_push().
*/
for (i = 0; i < opt_count; i++) {
- bool must_protect = false;
-
- ret = must_protect_variant_option_name(fc->base.ir_fc,
- tgt_fc->ir_fc, i, name_buf, &must_protect);
- if (ret) {
- fc->tag_is_before = true;
+ if (!fc->tag_is_before) {
+ BT_ASSERT(tgt_fc->ir_fc);
+ ret = maybe_protect_variant_option_name(fc->base.ir_fc,
+ tgt_fc->ir_fc, i, name_buf);
+ if (ret) {
+ fc->tag_is_before = true;
+ }
}
ret = bt_value_array_append_string_element(prot_opt_names,
/* Resolve length field class before appending to parent */
resolve_field_class(ctx,
- bt_field_class_dynamic_array_borrow_length_field_path_const(
+ bt_field_class_array_dynamic_borrow_length_field_path_const(
fc->base.base.ir_fc),
fc->length_ref, &fc->length_is_before, NULL);
return ret;
}
+static inline
+int translate_bool_field_class(struct ctx *ctx)
+{
+ struct fs_sink_ctf_field_class_bool *fc =
+ fs_sink_ctf_field_class_bool_create(
+ cur_path_stack_top(ctx)->ir_fc,
+ cur_path_stack_top(ctx)->index_in_parent);
+
+ BT_ASSERT(fc);
+ append_to_parent_field_class(ctx, (void *) fc);
+ return 0;
+}
+
static inline
int translate_integer_field_class(struct ctx *ctx)
{
int ret;
switch (bt_field_class_get_type(cur_path_stack_top(ctx)->ir_fc)) {
+ case BT_FIELD_CLASS_TYPE_BOOL:
+ ret = translate_bool_field_class(ctx);
+ break;
case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
* fill it.
*/
static
-int translate_scope_field_class(struct ctx *ctx, bt_scope scope,
+int translate_scope_field_class(struct ctx *ctx, bt_field_path_scope scope,
struct fs_sink_ctf_field_class **fc,
const bt_field_class *ir_fc)
{
BT_ASSERT(ec);
ctx.cur_sc = sc;
ctx.cur_ec = ec;
- ret = translate_scope_field_class(&ctx, BT_SCOPE_EVENT_SPECIFIC_CONTEXT,
+ ret = translate_scope_field_class(&ctx, BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT,
&ec->spec_context_fc,
bt_event_class_borrow_specific_context_field_class_const(
ir_ec));
goto end;
}
- ret = translate_scope_field_class(&ctx, BT_SCOPE_EVENT_PAYLOAD,
+ ret = translate_scope_field_class(&ctx, BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD,
&ec->payload_fc,
bt_event_class_borrow_payload_field_class_const(ir_ec));
if (ret) {
}
ctx.cur_sc = *out_sc;
- ret = translate_scope_field_class(&ctx, BT_SCOPE_PACKET_CONTEXT,
+ ret = translate_scope_field_class(&ctx, BT_FIELD_PATH_SCOPE_PACKET_CONTEXT,
&(*out_sc)->packet_context_fc,
bt_stream_class_borrow_packet_context_field_class_const(ir_sc));
if (ret) {
(void *) (*out_sc)->packet_context_fc, 8);
}
- ret = translate_scope_field_class(&ctx, BT_SCOPE_EVENT_COMMON_CONTEXT,
+ ret = translate_scope_field_class(&ctx, BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT,
&(*out_sc)->event_common_context_fc,
bt_stream_class_borrow_event_common_context_field_class_const(
ir_sc));